安全中國 www.anqn.com更新時(shí)間:2008-8-31 0:38:33
責任編輯:果果龍
熱 點(diǎn):
對于Web應用來(lái)說(shuō),注射式攻擊由來(lái)已久,攻擊方式也五花八門(mén),常見(jiàn)的攻擊方式有SQL注射、命令注射以及新近才出現的XPath注射等等。本文將以SQL注射為例,在源碼級對其攻擊原理進(jìn)行深入的講解。
一、注射式攻擊的原理
注射式攻擊的根源在于,程序命令和用戶(hù)數據(即用戶(hù)輸入)之間沒(méi)有做到?jīng)芪挤置?。這使得攻擊者有機會(huì )將程序命令當作用戶(hù)輸入的數據提交給We程序,以發(fā)號施令,為所欲為。
為了發(fā)動(dòng)注射攻擊,攻擊者需要在常規輸入中混入將被解釋為命令的“數據”,要想成功,必須要做三件事情:
1.確定Web應用程序所使用的技術(shù)
注射式攻擊對程序設計語(yǔ)言或者硬件關(guān)系密切,但是這些可以通過(guò)適當的踩點(diǎn)或者索性將所有常見(jiàn)的注射式攻擊都搬出來(lái)逐個(gè)試一下就知道了。為了確定所采用的技術(shù),攻擊者可以考察Web頁(yè)面的頁(yè)腳,查看錯誤頁(yè)面,檢查頁(yè)面源代碼,或者使用諸如Nessus等工具來(lái)進(jìn)行刺探。
2.確定所有可能的輸入方式
Web應用的用戶(hù)輸入方式比較多,其中一些用戶(hù)輸入方式是很明顯的,如HTML表單;另外,攻擊者可以通過(guò)隱藏的HTML表單輸入、HTTP頭部、cookies、甚至對用戶(hù)不可見(jiàn)的后端AJAX請求來(lái)跟Web應用進(jìn)行交互。一般來(lái)說(shuō),所有HTTP的GET和POST都應當作用戶(hù)輸入。為了找出一個(gè)Web應用所有可能的用戶(hù)輸入,我們可以求助于Web代理,如Burp等。
3.查找可以用于注射的用戶(hù)輸入
在找出所有用戶(hù)輸入方式后,就要對這些輸入方式進(jìn)行篩選,找出其中可以注入命令的那些輸入方式。這個(gè)任務(wù)好像有點(diǎn)難,但是這里有一個(gè)小竅門(mén),那就是多多留意Web應用的錯誤頁(yè)面,很多時(shí)候您能從這里得到意想不到的收獲。
二、SQL注射原理
上面對注射攻擊做了一般性的解釋?zhuān)旅嫖覀円許QL注射為例進(jìn)行講解,以使讀者對注射攻擊有一個(gè)感性的認識,至于其他攻擊,原理是一致的。
SQL注射能使攻擊者繞過(guò)認證機制,完全控制遠程服務(wù)器上的數據庫。SQL是結構化查詢(xún)語(yǔ)言的簡(jiǎn)稱(chēng),它是訪(fǎng)問(wèn)數據庫的事實(shí)標準。目前,大多數Web應用都使用SQL數據庫來(lái)存放應用程序的數據。幾乎所有的Web應用在后臺都使用某種SQL數據庫。跟大多數語(yǔ)言一樣,SQL語(yǔ)法允許數據庫命令和用戶(hù)數據混雜在一起的。如果開(kāi)發(fā)人員不細心的話(huà),用戶(hù)數據就有可能被解釋成命令,這樣的話(huà),遠程用戶(hù)就不僅能向Web應用輸入數據,而且還可以在數據庫上執行任意命令了。
三、繞過(guò)用戶(hù)認證
我們這里以一個(gè)需要用戶(hù)身份認證的簡(jiǎn)單的Web應用程序為例進(jìn)行講解。假定這個(gè)應用程序提供一個(gè)登錄頁(yè)面,要求用戶(hù)輸入用戶(hù)名和口令。用戶(hù)通過(guò)HTTP請求發(fā)送他們的用戶(hù)名和口令,之后,Web應用程序檢查用戶(hù)傳遞來(lái)用戶(hù)名和口令跟數據庫中的用戶(hù)名和口令是否匹配。這種情況下,會(huì )要求在SQL數據庫中使用一個(gè)數據庫表。開(kāi)發(fā)人員可以通過(guò)以下SQL語(yǔ)句來(lái)創(chuàng )建表:
CREATETABLEuser_table(
idINTEGERPRIMARYKEY,
usernameVARCHAR(32),
passwordVARCHAR(41)
);
上面的SQL代碼將建立一個(gè)表,該表由三欄組成。第一欄存放的是用戶(hù)ID,如果某人經(jīng)過(guò)認證,則用此標識該用戶(hù)。第二欄存放的是用戶(hù)名,該用戶(hù)名最多由32字符組成。第三欄存放的是口令,它由用戶(hù)的口令的hash值組成,因為以明文的形式來(lái)存放用戶(hù)的口令實(shí)在太危險,所以通常取口令的散列值進(jìn)行存放。我們將使用SQL函數PASSWORD()來(lái)獲得口令的hash值,在MySQL中,函數PASSWORD()的輸出由41字符組成。
對一個(gè)用戶(hù)進(jìn)行認證,實(shí)際上就是將用戶(hù)的輸入即用戶(hù)名和口令跟表中的各行進(jìn)行比較,如果跟某行中的用戶(hù)名和口令跟用戶(hù)的輸入完全匹配,那么該用戶(hù)就會(huì )通過(guò)認證,并得到該行中的ID。假如用戶(hù)提供的用戶(hù)名和口令分別為lonelynerd15和mypassword,那么檢查用戶(hù)ID過(guò)程如下所示:
SELECTidFROMuser_tableWHEREusername=’lonelynerd15’ANDpassword=PASSWORD(’mypassword’)
如果該用戶(hù)位于數據庫的表中,這個(gè)SQL命令將返回該用戶(hù)相應的ID,這就意味著(zhù)該用戶(hù)通過(guò)了認證;否則,這個(gè)SQL命令的返回為空,這意味著(zhù)該用戶(hù)沒(méi)有通過(guò)認證。
下面是用來(lái)實(shí)現自動(dòng)登錄的Java代碼,它從用戶(hù)那里接收用戶(hù)名和口令,然后通過(guò)一個(gè)SQL查詢(xún)對用戶(hù)進(jìn)行認證:
Stringusername=req.getParameter("username");
Stringpassword=req.getParameter("password");
Stringquery="SELECTidFROMuser_tableWHERE"+
"username=’"+username+"’AND"+
"password=PASSWORD(’"+password+"’)";
ResultSetrs=stmt.executeQuery(query);
intid=-1;//-1impliesthattheuserisunauthenticated.
while(rs.next()){
id=rs.getInt("id");
}
開(kāi)頭兩行代碼從HTTP請求中取得用戶(hù)輸入,然后在下一行開(kāi)始構造一個(gè)SQL查詢(xún)。執行查詢(xún),然后在while()循環(huán)中得到結果,如果一個(gè)用戶(hù)名和口令對匹配,就會(huì )返回正確的ID。否則,id的值仍然為-1,這意味著(zhù)用戶(hù)沒(méi)有通過(guò)認證。表面上看,如果用戶(hù)名和口令對匹配,那么該用戶(hù)通過(guò)認證;否則,該用戶(hù)不會(huì )通過(guò)認證——但是,事實(shí)果真如此嗎?非也!讀者也許已經(jīng)注意到了,這里并沒(méi)有對SQL命令進(jìn)行設防,所以攻擊者完全能夠在用戶(hù)名或者口令字段中注入SQL語(yǔ)句,從而改變SQL查詢(xún)。為此,我們仔細研究一下上面的SQL查詢(xún)字符串:
Stringquery="SELECTidFROMuser_tableWHERE"+
"username=’"+username+"’AND"+
"password=PASSWORD(’"+password+"’)";
上述代碼認為字符串username和password都是數據,不過(guò),攻擊者卻可以隨心所欲地輸入任何字符。如果一位攻擊者輸入的用戶(hù)名為
’OR1=1—
而口令為
x
那么查詢(xún)字符串將變成下面的樣子:
SELECTidFROMuser_tableWHEREusername=’’OR1=1--’ANDpassword
=PASSWORD(’x’)
該雙劃符號--告訴SQL解析器,右邊的東西全部是注釋?zhuān)圆槐乩頃?huì )。這樣,查詢(xún)字符串相當于:
SELECTidFROMuser_tableWHEREusername=’’OR1=1
如今的SELECT語(yǔ)句跟以前的已經(jīng)大相徑庭了,因為現在只要用戶(hù)名為長(cháng)度為零的字符串’’或1=1這兩個(gè)條件中一個(gè)為真,就返回用戶(hù)標識符ID——我們知道,1=1是恒為真的。所以這個(gè)語(yǔ)句將返回user_table中的所有ID。在此種情況下,攻擊者在username字段放入的是SQL指令’OR1=1--而非數據。
加入安全中國終身VIP會(huì )員待遇:永久學(xué)習已開(kāi)設的所有培訓班課程和以后新開(kāi)培訓班課程贈送可申請密碼保護的免費6位QQ贈送終身VIP會(huì )員獨享光盤(pán)工具包第一版和第二版為終身VIP會(huì )員推薦安排工作就業(yè)安全中國網(wǎng)友投稿專(zhuān)用上傳FTP空間:Ftp服務(wù)器:download.anqn.comFtp端口:21用戶(hù)名:anqn密 碼:anqn.comSQL注入原理深度解析
安全中國 www.anqn.com更新時(shí)間:2008-8-31 0:38:33
責任編輯:果果龍
熱 點(diǎn):
四、構造SQL注射代碼
為了成功地注入SQL命令,攻擊者必須將開(kāi)發(fā)人員的現有SQL命令轉換成一個(gè)合法的SQL語(yǔ)句,當然,要盲注是有些難度的,但一般都是這樣:
'OR1=1–
或者
')OR1=1--
此外,許多Web應用提供了帶來(lái)錯誤報告和調試信息,例如,利用'OR1=1--對Web應用進(jìn)行盲注時(shí),經(jīng)??吹饺缦滤镜腻e誤信息:
Errorexecutingquery: YouhaveanerrorinyourSQLsyntax; checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear 'SELECT(title,body)FROMblog_tableWHEREcat='OR1=1'atline1
該錯誤信息詳細地為我們展示了完整的SQL語(yǔ)句,在此種情況下,SQL數據庫所期待的好象是一個(gè)整數,而非字符串,所以可以注入字符串OR1=1--,把單引號去掉就應該能成功注入了。對于大多數SQL數據庫,攻擊者可以在一行中放入多個(gè)SQL語(yǔ)句,只要各個(gè)語(yǔ)句的語(yǔ)法沒(méi)有錯誤就行。在下面的代碼中,我們展示了如何將username設為'OR1=1并把password設為x來(lái)返回最后的用戶(hù)ID:
Stringquery="SELECTidFROMuser_tableWHERE"+ "username='"+username+"'AND"+ "password=PASSWORD('"+password+"')";
當然,攻擊者可以注入其它的查詢(xún),例如,把username設為:
'OR1=1;DROPTABLEuser_table;-- 而這個(gè)查詢(xún)將變成: SELECTidFROMuser_tableWHEREusername=''OR1=1;DROPTABLEuser_table;--'ANDpassword=PASSWORD('x'); 它相當于: SELECTidFROMuser_tableWHEREusername=''OR1=1;DROPTABLEuser_table;
這個(gè)語(yǔ)句將執行句法上完全正確的SELECT語(yǔ)句,并利用SQLDROP命令清空user_table。
注射式攻擊不必非要進(jìn)行盲式攻擊,因為許多Web應用是利用開(kāi)放源代碼工具開(kāi)發(fā)的,為了提高注射式攻擊的成功率,我們可以下載免費的或者產(chǎn)品的試用版,然后在自己的系統上搭建測試系統。如果在測試系統上發(fā)現了錯誤,那么很可能同樣的問(wèn)題也會(huì )存在于所有使用該工具的Web應用身上。
五、小結
我們在本文中向讀者介紹了注射攻擊的根本原因,即沒(méi)有對數據和命令進(jìn)行嚴格區分。然后通過(guò)一些程序源碼對SQL的攻擊進(jìn)行了細致的分析,使我們對SQL注射機理有了一個(gè)深入的認識。如果您是一名web應用開(kāi)發(fā)人員,那么您就當心了,一定不要盲目相信用戶(hù)端的輸入,而要對用戶(hù)輸入的數據進(jìn)行嚴格的“消毒”處理,否則的話(huà),SQL注射將會(huì )不期而至。
·上一篇:
風(fēng)訊 注射0day part 1·下一篇: 暫時(shí)空缺
相關(guān)文章·
PhpBazar adid SQL注入漏洞·
特征匹配檢測難以識別SQL注入攻擊(圖)·
GregariusRSS聚合器ajax.php SQL注入漏洞·
通過(guò)SQL注入得到WebShell的原理及步驟·
PERL鑄造多線(xiàn)程+支持中文破解SQL自動(dòng)注入猜解機·
應用IDS防止SQL注入攻擊(圖)·
PHP+MYSQL注入工具V2.0(圖)·
跨站式SQL注入技巧與防護(圖)·
ASP.NET程序防范SQL注入式攻擊的方法[1]·
ASP.NET程序防范SQL注入式攻擊的方法[2]一日一文章·
巧用嗅探 玩“滲透"(圖)·
妙用腳本代理提升權限(圖)·
詳解常見(jiàn)漏洞掃描器及網(wǎng)絡(luò )掃描技術(shù)(圖)·
縱橫間誰(shuí)能相抗 論常見(jiàn)的殼與加殼技術(shù)·
中國優(yōu)秀軟件創(chuàng )新大賽安全軟件橫評(圖)·
網(wǎng)絡(luò )管理員對付DDoS攻擊的絕招分享·
國產(chǎn)免費木馬查殺利器——殺馬(圖)·
Gene6 FTP Server的權限提升(圖)·
信息的隱藏價(jià)值-社會(huì )工程學(xué)·
Cmd命令提示符被屏蔽 手工來(lái)破解(圖)一日一軟件·
ADSL寬帶網(wǎng)絡(luò )測速工具 v1.0 PC版(圖)·
網(wǎng)絡(luò )特工 V2.2.4.6(圖)·
簡(jiǎn)易遠程協(xié)助:CrossLoop 2.41中文版(圖)·
PE Tools 1.5 漢化版(圖)·
金山毒霸 2009(圖)·
機器碼算法軟件加密大師:ZProtect 1.3(圖)·
銳甲(Araymor) 0.0.3.10(圖)·
校驗大師(對文件進(jìn)行MD4、MD5、CRC32批量校驗) V2.2.0(圖)·
趨勢閃電殺毒手v1.53(圖)·
網(wǎng)吧管理軟件 Pubwin2007最新版(圖)一日一動(dòng)畫(huà)·
投稿:輕松搞定NSET32高啟發(fā)+主動(dòng)·
投稿:爽啤3389批量抓雞·
投稿:用COPY命令下載網(wǎng)吧電影·
投稿:超級技巧之禁止別人動(dòng)我IE瀏覽器·
投稿:怎樣下載土豆、優(yōu)酷等網(wǎng)站的視頻·
投稿:超級詳細灰鴿子系列教程免殺(語(yǔ)音)·
投稿:看我無(wú)限次刷卡巴斯基激活碼(工具)·
投稿:用易語(yǔ)言QQ登錄界面DIY·
投稿:8000美金提現的網(wǎng)賺·
菜鳥(niǎo)也會(huì )建立影子賬號