四、構(gòu)造SQL注射代碼
為了成功地注入SQL命令,攻擊者必須將開發(fā)人員的現(xiàn)有SQL命令轉(zhuǎn)換成一個合法的SQL語句,當(dāng)然,要盲注是有些難度的,但一般都是這樣:
'OR1=1–
或者
')OR1=1--
此外,許多Web應(yīng)用提供了帶來錯誤報告和調(diào)試信息,例如,利用'OR1=1--對Web應(yīng)用進(jìn)行盲注時,經(jīng)??吹饺缦滤镜腻e誤信息:
Errorexecutingquery:
YouhaveanerrorinyourSQLsyntax;
checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear
'SELECT(title,body)FROMblog_tableWHEREcat='OR1=1'atline1
|
該錯誤信息詳細(xì)地為我們展示了完整的SQL語句,在此種情況下,SQL數(shù)據(jù)庫所期待的好象是一個整數(shù),而非字符串,所以可以注入字符串OR1=1--,把單引號去掉就應(yīng)該能成功注入了。對于大多數(shù)SQL數(shù)據(jù)庫,攻擊者可以在一行中放入多個SQL語句,只要各個語句的語法沒有錯誤就行。在下面的代碼中,我們展示了如何將username設(shè)為'OR1=1并把password設(shè)為x來返回最后的用戶ID:
Stringquery="SELECTidFROMuser_tableWHERE"+
"username='"+username+"'AND"+
"password=PASSWORD('"+password+"')";
|
當(dāng)然,攻擊者可以注入其它的查詢,例如,把username設(shè)為:
'OR1=1;DROPTABLEuser_table;--
而這個查詢將變成:
SELECTidFROMuser_tableWHEREusername=''OR1=1;DROPTABLEuser_table;--'ANDpassword=PASSWORD('x');
它相當(dāng)于:
SELECTidFROMuser_tableWHEREusername=''OR1=1;DROPTABLEuser_table;
|
這個語句將執(zhí)行句法上完全正確的SELECT語句,并利用SQLDROP命令清空user_table。
注射式攻擊不必非要進(jìn)行盲式攻擊,因為許多Web應(yīng)用是利用開放源代碼工具開發(fā)的,為了提高注射式攻擊的成功率,我們可以下載免費的或者產(chǎn)品的試用版,然后在自己的系統(tǒng)上搭建測試系統(tǒng)。如果在測試系統(tǒng)上發(fā)現(xiàn)了錯誤,那么很可能同樣的問題也會存在于所有使用該工具的Web應(yīng)用身上。
五、小結(jié)
我們在本文中向讀者介紹了注射攻擊的根本原因,即沒有對數(shù)據(jù)和命令進(jìn)行嚴(yán)格區(qū)分。然后通過一些程序源碼對SQL的攻擊進(jìn)行了細(xì)致的分析,使我們對SQL注射機(jī)理有了一個深入的認(rèn)識。如果您是一名web應(yīng)用開發(fā)人員,那么您就當(dāng)心了,一定不要盲目相信用戶端的輸入,而要對用戶輸入的數(shù)據(jù)進(jìn)行嚴(yán)格的“消毒”處理,否則的話,SQL注射將會不期而至。