SQL注入原理介紹
互聯(lián)網(wǎng) 發(fā)布時(shí)間:2008-10-08 19:36:27 作者:佚名
我要評(píng)論

對(duì)于Web應(yīng)用來(lái)說(shuō),注射式攻擊由來(lái)已久,攻擊方式也五花八門,常見的攻擊方式有SQL注射、命令注射以及新近才出現(xiàn)的XPath注射等等。本文將以SQL注射為例,在源碼級(jí)對(duì)其攻擊原理進(jìn)行深入的講解。
一、注射式攻擊的原理
注射式攻擊的根源在于,程序命令和用戶數(shù)據(jù)(即用
對(duì)于Web應(yīng)用來(lái)說(shuō),注射式攻擊由來(lái)已久,攻擊方式也五花八門,常見的攻擊方式有SQL注射、命令注射以及新近才出現(xiàn)的XPath注射等等。本文將以SQL注射為例,在源碼級(jí)對(duì)其攻擊原理進(jìn)行深入的講解。
一、注射式攻擊的原理
注射式攻擊的根源在于,程序命令和用戶數(shù)據(jù)(即用戶輸入)之間沒有做到?jīng)芪挤置?。這使得攻擊者有機(jī)會(huì)將程序命令當(dāng)作用戶輸入的數(shù)據(jù)提交給We程序,以發(fā)號(hào)施令,為所欲為。
為了發(fā)動(dòng)注射攻擊,攻擊者需要在常規(guī)輸入中混入將被解釋為命令的“數(shù)據(jù)”,要想成功,必須要做三件事情:
1.確定Web應(yīng)用程序所使用的技術(shù)
注射式攻擊對(duì)程序設(shè)計(jì)語(yǔ)言或者硬件關(guān)系密切,但是這些可以通過(guò)適當(dāng)?shù)牟赛c(diǎn)或者索性將所有常見的注射式攻擊都搬出來(lái)逐個(gè)試一下就知道了。為了確定所采用的技術(shù),攻擊者可以考察Web頁(yè)面的頁(yè)腳,查看錯(cuò)誤頁(yè)面,檢查頁(yè)面源代碼,或者使用諸如Nessus等工具來(lái)進(jìn)行刺探。
2.確定所有可能的輸入方式
Web應(yīng)用的用戶輸入方式比較多,其中一些用戶輸入方式是很明顯的,如HTML表單;另外,攻擊者可以通過(guò)隱藏的HTML表單輸入、HTTP頭部、cookies、甚至對(duì)用戶不可見的后端AJAX請(qǐng)求來(lái)跟Web應(yīng)用進(jìn)行交互。一般來(lái)說(shuō),所有HTTP的GET和POST都應(yīng)當(dāng)作用戶輸入。為了找出一個(gè)Web應(yīng)用所有可能的用戶輸入,我們可以求助于Web代理,如Burp等。
3.查找可以用于注射的用戶輸入
在找出所有用戶輸入方式后,就要對(duì)這些輸入方式進(jìn)行篩選,找出其中可以注入命令的那些輸入方式。這個(gè)任務(wù)好像有點(diǎn)難,但是這里有一個(gè)小竅門,那就是多多留意Web應(yīng)用的錯(cuò)誤頁(yè)面,很多時(shí)候您能從這里得到意想不到的收獲。
二、SQL注射原理
上面對(duì)注射攻擊做了一般性的解釋,下面我們以SQL注射為例進(jìn)行講解,以使讀者對(duì)注射攻擊有一個(gè)感性的認(rèn)識(shí),至于其他攻擊,原理是一致的。
SQL注射能使攻擊者繞過(guò)認(rèn)證機(jī)制,完全控制遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫(kù)。SQL是結(jié)構(gòu)化查詢語(yǔ)言的簡(jiǎn)稱,它是訪問數(shù)據(jù)庫(kù)的事實(shí)標(biāo)準(zhǔn)。目前,大多數(shù)Web應(yīng)用都使用SQL數(shù)據(jù)庫(kù)來(lái)存放應(yīng)用程序的數(shù)據(jù)。幾乎所有的Web應(yīng)用在后臺(tái)都使用某種SQL數(shù)據(jù)庫(kù)。跟大多數(shù)語(yǔ)言一樣,SQL語(yǔ)法允許數(shù)據(jù)庫(kù)命令和用戶數(shù)據(jù)混雜在一起的。如果開發(fā)人員不細(xì)心的話,用戶數(shù)據(jù)就有可能被解釋成命令,這樣的話,遠(yuǎn)程用戶就不僅能向Web應(yīng)用輸入數(shù)據(jù),而且還可以在數(shù)據(jù)庫(kù)上執(zhí)行任意命令了。
三、繞過(guò)用戶認(rèn)證
我們這里以一個(gè)需要用戶身份認(rèn)證的簡(jiǎn)單的Web應(yīng)用程序?yàn)槔M(jìn)行講解。假定這個(gè)應(yīng)用程序提供一個(gè)登錄頁(yè)面,要求用戶輸入用戶名和口令。用戶通過(guò)HTTP請(qǐng)求發(fā)送他們的用戶名和口令,之后,Web應(yīng)用程序檢查用戶傳遞來(lái)用戶名和口令跟數(shù)據(jù)庫(kù)中的用戶名和口令是否匹配。這種情況下,會(huì)要求在SQL數(shù)據(jù)庫(kù)中使用一個(gè)數(shù)據(jù)庫(kù)表。開發(fā)人員可以通過(guò)以下SQL語(yǔ)句來(lái)創(chuàng)建表:
CREATETABLEuser_table(
idINTEGERPRIMARYKEY,
usernameVARCHAR(32),
passwordVARCHAR(41)
);
上面的SQL代碼將建立一個(gè)表,該表由三欄組成。第一欄存放的是用戶ID,如果某人經(jīng)過(guò)認(rèn)證,則用此標(biāo)識(shí)該用戶。第二欄存放的是用戶名,該用戶名最多由32字符組成。第三欄存放的是口令,它由用戶的口令的hash值組成,因?yàn)橐悦魑牡男问絹?lái)存放用戶的口令實(shí)在太危險(xiǎn),所以通常取口令的散列值進(jìn)行存放。我們將使用SQL函數(shù)PASSWORD()來(lái)獲得口令的hash值,在MySQL中,函數(shù)PASSWORD()的輸出由41字符組成。
對(duì)一個(gè)用戶進(jìn)行認(rèn)證,實(shí)際上就是將用戶的輸入即用戶名和口令跟表中的各行進(jìn)行比較,如果跟某行中的用戶名和口令跟用戶的輸入完全匹配,那么該用戶就會(huì)通過(guò)認(rèn)證,并得到該行中的ID。假如用戶提供的用戶名和口令分別為lonelynerd15和mypassword,那么檢查用戶ID過(guò)程如下所示:
SELECTidFROMuser_tableWHEREusername=’lonelynerd15’ANDpassword=PASSWORD(’mypassword’)
如果該用戶位于數(shù)據(jù)庫(kù)的表中,這個(gè)SQL命令將返回該用戶相應(yīng)的ID,這就意味著該用戶通過(guò)了認(rèn)證;否則,這個(gè)SQL命令的返回為空,這意味著該用戶沒有通過(guò)認(rèn)證。
下面是用來(lái)實(shí)現(xiàn)自動(dòng)登錄的Java代碼,它從用戶那里接收用戶名和口令,然后通過(guò)一個(gè)SQL查詢對(duì)用戶進(jìn)行認(rè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");
}
開頭兩行代碼從HTTP請(qǐng)求中取得用戶輸入,然后在下一行開始構(gòu)造一個(gè)SQL查詢。執(zhí)行查詢,然后在while()循環(huán)中得到結(jié)果,如果一個(gè)用戶名和口令對(duì)匹配,就會(huì)返回正確的ID。否則,id的值仍然為-1,這意味著用戶沒有通過(guò)認(rèn)證。表面上看,如果用戶名和口令對(duì)匹配,那么該用戶通過(guò)認(rèn)證;否則,該用戶不會(huì)通過(guò)認(rèn)證——但是,事實(shí)果真如此嗎?非也!讀者也許已經(jīng)注意到了,這里并沒有對(duì)SQL命令進(jìn)行設(shè)防,所以攻擊者完全能夠在用戶名或者口令字段中注入SQL語(yǔ)句,從而改變SQL查詢。為此,我們仔細(xì)研究一下上面的SQL查詢字符串:
Stringquery="SELECTidFROMuser_tableWHERE"
"username=’" username "’AND"
"password=PASSWORD(’" password "’)";
上述代碼認(rèn)為字符串username和password都是數(shù)據(jù),不過(guò),攻擊者卻可以隨心所欲地輸入任何字符。如果一位攻擊者輸入的用戶名為
’OR1=1—
而口令為
x
那么查詢字符串將變成下面的樣子:
SELECTidFROMuser_tableWHEREusername=’’OR1=1--’ANDpassword
=PASSWORD(’x’)
該雙劃符號(hào)--告訴SQL解析器,右邊的東西全部是注釋,所以不必理會(huì)。這樣,查詢字符串相當(dāng)于:
SELECTidFROMuser_tableWHEREusername=’’OR1=1
如今的SELECT語(yǔ)句跟以前的已經(jīng)大相徑庭了,因?yàn)楝F(xiàn)在只要用戶名為長(zhǎng)度為零的字符串’’或1=1這兩個(gè)條件中一個(gè)為真,就返回用戶標(biāo)識(shí)符ID——我們知道,1=1是恒為真的。所以這個(gè)語(yǔ)句將返回user_table中的所有ID。在此種情況下,攻擊者在username字段放入的是SQL指令’OR1=1--而非數(shù)據(jù)。
相關(guān)文章
什么是CC攻擊 判斷網(wǎng)站是否被CC攻擊并且如何防御CC攻擊
CC主要是用來(lái)攻擊頁(yè)面的,大家都有這樣的經(jīng)歷,就是在訪問論壇時(shí),如果這個(gè)論壇比較大,訪問的人比較多,打開頁(yè)面的速度會(huì)比較慢,對(duì)不?!一般來(lái)說(shuō),訪問的人越多,論壇的頁(yè)2024-01-06Windows系統(tǒng)安全風(fēng)險(xiǎn)-本地NTLM重放提權(quán)
入侵者主要通過(guò)Potato程序攻擊擁有SYSTEM權(quán)限的端口偽造網(wǎng)絡(luò)身份認(rèn)證過(guò)程,利用NTLM重放機(jī)制騙取SYSTEM身份令牌,最終取得系統(tǒng)權(quán)限,該安全風(fēng)險(xiǎn)微軟并不認(rèn)為存在漏洞,所以2021-04-15- 這篇文章主要介紹了文件上傳漏洞全面滲透分析小結(jié),這里主要為大家分享一下防御方法,需要的朋友可以參考下2021-03-21
- 這篇文章主要介紹了sql手工注入語(yǔ)句&SQL手工注入大全,需要的朋友可以參考下2017-09-06
- 這篇文章主要介紹了詳解Filezilla server 提權(quán),需要的朋友可以參考下2017-05-13
FileZilla Server 2008 x64 提權(quán)與防御方法
這篇文章主要介紹了FileZilla Server 2008 x64 提權(quán)與防御方法,需要的朋友可以參考下2017-05-13https加密也被破解 HEIST攻擊從加密數(shù)據(jù)獲取明文
不久之前我們說(shuō)過(guò)關(guān)于http和https的區(qū)別,對(duì)于加密的https,我們一直認(rèn)為它是相對(duì)安全的,可今天要講的是,一種繞過(guò)HTTPS加密得到明文信息的web攻擊方式,不知道這消息對(duì)你2016-08-10iPhone和Mac也會(huì)被黑 一條iMessage密碼可能就被盜了
一直以來(lái)蘋果系統(tǒng)的安全性都是比安卓要高的,但是再安全的系統(tǒng)也免不了漏洞,蘋果也一樣。最近爆出的新漏洞,只需要接收一條多媒體信息或者iMessage就會(huì)導(dǎo)致用戶信息泄露。2016-07-27- 國(guó)家正在修正關(guān)于黑客方面的法律法規(guī),有一條震驚黑客圈的“世紀(jì)佳緣”起訴白帽黑客事件,深深的傷害了廣大黑客們的心,加上扎克伯格和特拉維斯·卡蘭尼克賬號(hào)被盜,于是黑2016-07-11
如何逆向破解HawkEye keylogger鍵盤記錄器進(jìn)入攻擊者郵箱
面對(duì)惡意郵件攻擊,我們就只能默默忍受被他攻擊,連自我保護(hù)能力都沒有談什么反抗?讓人痛快的是,如今有了解決辦法,逆向破解鍵盤記錄器,進(jìn)入攻擊者郵箱2016-07-06