2013-01-14 37 views
0

我是SQL注入領域的初學者,如果能幫助我,我會很高興。SQLi查詢說明

場景:易受攻擊的web應用程序。

假設你有一個這樣的URL:

http://www.site1.com/cms/login.php 

另外,假定以訪問您必須提供以下憑證的網站:

用戶名:FOO,密碼:酒吧

因此,上面的URL變成:

http://www.site.com/cms/login.php?username=foo&password=bar 

如果再注入有效載荷'OR'1'='1它更改爲:

http://www.site.com/cms/login.php?username=foo&password=bar'OR'1'='1 

這就足夠清楚,我,但我擔心的是,有人告訴我,對應的 SQL查詢(一送經處理後端RDBMS)應爲:

SELECT userid 
FROM CMSUsers 
WHERE user = 'foo'AND password = 'bar' OR'1'='1'; 

查詢是同義反復,因爲'1'='1'始終爲TRUE。

但有效載荷是'OR'1'='1和查詢的條件語句似乎是不同OR'1'='1';(看',有有效載荷中的最後1之後沒有口音)

是我的懷疑明智?

任何幫助將不勝感激。

回答

4

一個應用程序,很容易受到這種攻擊將有相似的代碼下面來構造SQL查詢:

var query = "SELECT userid 
FROM CMSUsers 
WHERE user = '" + usernameValue + "' AND password = '" + passwordValue + "'"; 

請注意單引號的配售。用戶通過passwordValue變量傳遞的所有內容都將插入單引號內的該位置。

現在,要執行攻擊,您需要儘早關閉密碼的單引號,以便能夠添加始終爲真的部分。你會通過這樣的事情:bar' OR '1' = '1。請注意:開頭或結尾沒有單引號。這些來自應用程序中的硬編碼查詢字符串。

插入在高於passwordValue位置這個值產生以下:

... AND password = 'bar' OR '1' = '1' 
<------- A --------><------- B ---->A 
  • A:從節目硬編碼內容
  • B:內容經由passwordValue可變
+0

感謝傳遞期待你的答覆..所以你說如果在Web應用程序的地址欄中輸入'OR'1'='1',這意味着:http://www.site.com/cms/login.php?username=foo&password=bar 'OR'1'='1'(在右邊的最後一位後面加上引號)我是否說查詢不會被執行?對不起,但我仍然不明白爲什麼確切的有效負載'OR'1'='1不完全是發送到DBMS的底層SQL查詢的一部分。謝謝了很多 – poi741

+0

@ poi741:請再次閱讀我的答案。完整的有效載荷是查詢的一部分:有效載荷:** bar'OR'1'='1 **,查詢:... AND password ='** bar'OR'1'='1 **'; –

+0

我很抱歉..你是對的。事實上,我想指出的是,另一個報價是SQL查詢的一部分,但這是由於硬編碼的原因,我的意思是爲了在語法上正確的應用程序添加額外報價'還有;是對的嗎? – poi741