當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]對于Web應(yīng)用來說,注射式攻擊由來已久,攻擊方式也五花八門,常見的攻擊方式有SQL注射、命令注射以及新近才出現(xiàn)的XPath注射等等。本文將以SQL注射為例,在源碼級對其攻擊原理進(jìn)行深入的講解。一、注射

對于Web應(yīng)用來說,注射式攻擊由來已久,攻擊方式也五花八門,常見的攻擊方式有SQL注射、命令注射以及新近才出現(xiàn)的XPath注射等等。本文將以SQL注射為例,在源碼級對其攻擊原理進(jìn)行深入的講解。

一、注射式攻擊的原理
注射式攻擊的根源在于,程序命令和用戶數(shù)據(jù)(即用戶輸入)之間沒有做到?jīng)芪挤置?。這使得攻擊者有機會將程序命令當(dāng)作用戶輸入的數(shù)據(jù)提交給Web程序,以發(fā)號施令,為所欲為。

為了發(fā)動注射攻擊,攻擊者需要在常規(guī)輸入中混入將被解釋為命令的“數(shù)據(jù)”,要想成功,必須要做三件事情:
1.確定Web應(yīng)用程序所使用的技術(shù)
注射式攻擊對程序設(shè)計語言或者硬件關(guān)系密切,但是這些可以通過適當(dāng)?shù)牟赛c或者索性將所有常見的注射式攻擊都搬出來逐個試一下就知道了。為了確定所采用的技術(shù),攻擊者可以考察Web頁面的頁腳,查看錯誤頁面,檢查頁面源代碼,或者使用諸如Nessus等工具來進(jìn)行刺探。

2.確定所有可能的輸入方式
Web應(yīng)用的用戶輸入方式比較多,其中一些用戶輸入方式是很明顯的,如HTML表單;另外,攻擊者可以通過隱藏的HTML表單輸入、HTTP頭部、cookies、甚至對用戶不可見的后端AJAX請求來跟Web應(yīng)用進(jìn)行交互。一般來說,所有HTTP的GET和POST都應(yīng)當(dāng)作用戶輸入。為了找出一個Web應(yīng)用所有可能的用戶輸入,我們可以求助于Web代理,如Burp等。

3.查找可以用于注射的用戶輸入
在找出所有用戶輸入方式后,就要對這些輸入方式進(jìn)行篩選,找出其中可以注入命令的那些輸入方式。這個任務(wù)好像有點難,但是這里有一個小竅門,那就是多多留意Web應(yīng)用的錯誤頁面,很多時候您能從這里得到意想不到的收獲。

二、SQL注射原理
上面對注射攻擊做了一般性的解釋,下面我們以SQL注射為例進(jìn)行講解,以使讀者對注射攻擊有一個感性的認(rèn)識,至于其他攻擊,原理是一致的。

SQL注射能使攻擊者繞過認(rèn)證機制,完全控制遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫。SQL是結(jié)構(gòu)化查詢語言的簡稱,它是訪問數(shù)據(jù)庫的事實標(biāo)準(zhǔn)。目前,大多數(shù)Web應(yīng)用都使用SQL數(shù)據(jù)庫來存放應(yīng)用程序的數(shù)據(jù)。幾乎所有的Web應(yīng)用在后臺都使用某種SQL數(shù)據(jù)庫。跟大多數(shù)語言一樣,SQL語法允許數(shù)據(jù)庫命令和用戶數(shù)據(jù)混雜在一起的。如果開發(fā)人員不細(xì)心的話,用戶數(shù)據(jù)就有可能被解釋成命令,這樣的話,遠(yuǎn)程用戶就不僅能向Web應(yīng)用輸入數(shù)據(jù),而且還可以在數(shù)據(jù)庫上執(zhí)行任意命令了。

三、繞過用戶認(rèn)證
我們這里以一個需要用戶身份認(rèn)證的簡單的Web應(yīng)用程序為例進(jìn)行講解。假定這個應(yīng)用程序提供一個登錄頁面,要求用戶輸入用戶名和口令。用戶通過HTTP請求發(fā)送他們的用戶名和口令,之后,Web應(yīng)用程序檢查用戶傳遞來用戶名和口令跟數(shù)據(jù)庫中的用戶名和口令是否匹配。這種情況下,會要求在SQL數(shù)據(jù)庫中使用一個數(shù)據(jù)庫表。開發(fā)人員可以通過以下SQL語句來創(chuàng)建表:

CREATE?TABLE?user_table(
???id?INTEGER?PRIMARY?KEY,
???username?VARCHAR(32),
???password?VARCHAR(41)
);

上面的SQL代碼將建立一個表,該表由三欄組成。第一欄存放的是用戶ID,如果某人經(jīng)過認(rèn)證,則用此標(biāo)識該用戶。第二欄存放的是用戶名,該用戶名最多由32字符組成。第三欄存放的是口令,它由用戶的口令的hash值組成,因為以明文的形式來存放用戶的口令實在太危險,所以通常取口令的散列值進(jìn)行存放。我們將使用SQL函數(shù)PASSWORD()來獲得口令的hash值,在MySQL中,函數(shù)PASSWORD()的輸出由41字符組成。

對一個用戶進(jìn)行認(rèn)證,實際上就是將用戶的輸入即用戶名和口令跟表中的各行進(jìn)行比較,如果跟某行中的用戶名和口令跟用戶的輸入完全匹配,那么該用戶就會通過認(rèn)證,并得到該行中的ID。假如用戶提供的用戶名和口令分別為lonelynerd15和mypassword,那么檢查用戶ID過程如下所示:

SELECT?id?
FROM?user_table?
WHERE?username='lonelynerd15'?
AND?password=PASSWORD('mypassword')

如果該用戶位于數(shù)據(jù)庫的表中,這個SQL命令將返回該用戶相應(yīng)的ID,這就意味著該用戶通過了認(rèn)證;否則,這個SQL命令的返回為空,這意味著該用戶沒有通過認(rèn)證。

下面是用來實現(xiàn)自動登錄的Java代碼,它從用戶那里接收用戶名和口令,然后通過一個SQL查詢對用戶進(jìn)行認(rèn)證:

Stringusername=req.getParameter("username");
Stringpassword=req.getParameter("password");
Stringquery="SELECT?id?FROM?user_table?WHERE?username='"+username+"'?AND?password=PASSWORD('"+password+"')";

ResultSet?rs=stmt.executeQuery(query);
int?id=-1;?
???while(rs.next()){
???id=rs.getInt("id");
}

開頭兩行代碼從HTTP請求中取得用戶輸入,然后在下一行開始構(gòu)造一個SQL查詢。執(zhí)行查詢,然后在while()循環(huán)中得到結(jié)果,如果一個用戶名和口令對匹配,就會返回正確的ID。否則,id的值仍然為-1,這意味著用戶沒有通過認(rèn)證。表面上看,如果用戶名和口令對匹配,那么該用戶通過認(rèn)證;否則,該用戶不會通過認(rèn)證——但是,事實果真如此嗎?非也!讀者也許已經(jīng)注意到了,這里并沒有對SQL命令進(jìn)行設(shè)防,所以攻擊者完全能夠在用戶名或者口令字段中注入SQL語句,從而改變SQL查詢。為此,我們仔細(xì)研究一下上面的SQL查詢字符串:

Stringquery="SELECT?id?FROM?user_table?WHERE?username='"+username+"'?AND?password=PASSWORD('"+password+"')";

上述代碼認(rèn)為字符串username和password都是數(shù)據(jù),不過,攻擊者卻可以隨心所欲地輸入任何字符。如果一位攻擊者輸入的用戶名為"' OR 1=1--",而口令為"x",那么查詢字符串將變成下面的樣子:

SELECT?id?FROM?user_table?WHERE?username=''?OR?1=1--'AND?password=PASSWORD('x')

該雙劃符號--告訴SQL解析器,右邊的東西全部是注釋,所以不必理會。這樣,查詢字符串相當(dāng)于:

SELECT?id?FROM?user_table?WHERE?username=''?OR?1=1

如今的SELECT語句跟以前的已經(jīng)大相徑庭了,因為現(xiàn)在只要用戶名為長度為零的字符串''或1=1這兩個條件中一個為真,就返回用戶標(biāo)識符ID——我們知道,1=1是恒為真的。所以這個語句將返回user_table中的所有ID。在此種情況下,攻擊者在username字段放入的是SQL指令'OR1=1--而非數(shù)據(jù)。

四、構(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誤信息:

Error?executing?query:
You?have?an?error?in?your?SQL?syntax;
check?the?manual?that?corresponds?to?your?MySQL?server?version?for?the?right?syntax?to?use?near
'SELECT?(title,body)?FROM?blog_table?WHERE?cat='OR1=1'?at?line?1

該錯誤信息詳細(xì)地為我們展示了完整的SQL語句,在此種情況下,SQL數(shù)據(jù)庫所期待的好象是一個整數(shù),而非字符串,所以可以注入字符串OR1=1--,把單引號去掉就應(yīng)該能成功注入了。對于大多數(shù)SQL數(shù)據(jù)庫,攻擊者可以在一行中放入多個SQL語句,只要各個語句的語法沒有錯誤就行。在下面的代碼中,我們展示了如何將username設(shè)為'OR1=1并把password設(shè)為x來返回最后的用戶ID:

Strin?gquery="SELECT?id?FROM?user_table?WHERE"+
"username='"+username+"'AND"+
"password=PASSWORD('"+password+"')";

當(dāng)然,攻擊者可以注入其它的查詢,例如,把username設(shè)為:

'OR1=1;DROP?TABLE?user_table;--

而這個查詢將變成:

SELECT?id?FROM?user_table?WHERE?username=''?OR1=1;DROPTABLEuser_table;--'ANDpassword=PASSWORD('x');

它相當(dāng)于:

SELECT?id?FROM?user_table?WHERE?username=''OR1=1;DROP?TABLE?user_table;

這個語句將執(zhí)行句法上完全正確的SELECT語句,并利用SQL DROP命令清空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注射機理有了一個深入的認(rèn)識。如果您是一名web應(yīng)用開發(fā)人員,那么您就當(dāng)心了,一定不要盲目相信用戶端的輸入,而要對用戶輸入的數(shù)據(jù)進(jìn)行嚴(yán)格的“消毒”處理,否則的話,SQL注射將會不期而至。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉