至於引用不齊;發生sql注入其中,編碼器沒有過濾用戶輸入的危險字符,如單引號 - 考慮下面的語句
SELECT * FROM admin WHERE username='$_GET["user"]' and password='$_GET["pass"]'
,如果我知道,有效的用戶名爲admin,並插入'or 1=1
我會得到以下
SELECT * FROM admin WHERE username='admin' and password='something' or 1=1
這將導致查詢總是返回true,因爲無論密碼的值如何,表達式的左側都將始終爲true。
這是sql注入的最簡單的例子,你會發現攻擊者根本不需要使用引號,或者可以使用註釋分隔符(例如--
或/*
)將其餘的查詢註釋掉,如果在注入點之後有更多參數通過。
至於十六進制編碼,可能有幾個原因,避免過濾,使用十六進制編碼值更簡單,因爲您不必擔心引用查詢中的所有值。 例如,這是有用的,如果你想使用concat
共同譜寫兩場在一起,就像這樣:
inject.php?id=1 and 1=0 union select 1,2,concat(username,0x3a3a,password) from admin
這將提供第三排是可見的一個,換來isntance admin::admin
。如果我沒有使用十六進制編碼,我會做到這一點:
inject.php?id=1 and 1=0 union select 1,2,concat(username,'::',password) from admin
這可能是與上述addslashes
功能的問題,也有寫得不好的正則表達式的消毒功能,或者如果你有非常複雜的查詢。
Sql注入是非常廣泛的話題,我已經涵蓋甚至幾乎沒有通過介紹。
好問題。它很難過,看到我是唯一一個在SQL注入攻擊中實際使用過這種技術的人。 – rook 2010-11-23 23:39:49