這是一個常見的誤解— 企業需要購買複雜和昂貴的軟體來發現應用程式中安全性漏洞;而這些專門的軟體應用程式,無論是黑盒或白盒,開源或商業,都能很快的發現安全性漏洞。
事實是:所有這些專業的漏洞掃描工具都有其特定的優勢和劣勢。有些可能是 ASP 為中心的,而其他工具更傾向於 PHP 。Team Dev可能會因為提高掃描速度的要求,會忽略不值得被報告的漏洞。如果你想在一定時間內找到儘可能多的安全性漏洞,需要使用所有的工具。
沒有一個漏洞掃描器或技術會發現你應用程式中 100% 的安全性漏洞,即便你使用了各種工具和技術。這篇文章中我將介紹另一種方式,你可以通過只使用命令列工具 grep 來捕獲這些漏洞。
黑盒/白盒
讓我們先來瞭解下什麼是黑盒白盒測試。黑箱測試就是你沒有任何關於評估對象(應用 / 網路 / 公司)的資料。白盒測試則完全相反,你可能有任何你需要的資訊,包括網路範圍,原始碼,電話號碼等。灰盒測試則是介於兩者之間。在現實中,大多數評估是灰盒評估。因為要麼一點預備資訊都沒有,或者需要的的資訊都有,這兩種情況非常少見。
通過 Grep 尋找 bugs 會被歸類為白盒評估或“代碼審查”。 Web 應用程式的漏洞掃描程式,如 Netsparker , nikto , wvs 等將被歸類為黑箱測試的工具,
因為他們(在大多數情況下)將無法訪問任何伺服器端原始碼。
如果你想儘可能的找到多的安全性漏洞,需要結合黑盒 Web 應用程式掃描和白盒的代碼審計。
Grep
如果你正在閱讀這篇文章,我會假設你很熟悉 grep 工具的基本概念。如果不是,這裡將會對這個強大的工具做個簡介。
grep 是由 Ken Thompson 建立,並於 1973 年發布,作為使用Regex匹配的檔案行的 UNIX 搜尋工具。目前大多數的 *nix 都預裝了 grep 。
在 *nix 作業系統,我們可以使用命令 ‘man grep’ 來查看工具的功能。或者使用命令 ‘grep –help ‘閱讀協助。
在這篇文章中我使用 GNU grep 的版本為 2.5.4 。如果你的 GNU grep 版本較舊,那麼該文章中的某些命令可能無法正常工作。要檢查您的 GNU grep 版本使用命令 ’ grep -V ’ 。
Damn Vulnerable Web Application (DVWA)
DVWA 就是一套 Web 應用程式漏洞示範平台。我們這裡使用 VirtualBox 運行 DVWA 的 LiveCD 。(小編:關於 dvwa 的下載、安裝配置網上有很多,這裡不再重述)
配置好之後,就是這個樣子。
現在我們開始 grepping 。首先 ssh 串連到存放 php 代碼的伺服器上。使用者名稱是 dvwa ,密碼 password 。
我們跳轉到網站的根目錄下‘/opt/lampp/htdocs’
Grepping 跨站指令碼漏洞
這裡引用 OWASP 關於跨站指令碼漏洞的說明。”當應用程式收到含有不可信的資料,在沒有進行適當的驗證和轉義的情況下,就將它發送 給一個網頁瀏覽器,這就會產生跨站指令碼攻擊(簡稱 XSS )。 XSS 允許攻擊者在受害者的瀏覽 器上執行指令碼,從而劫持使用者會話、危害網站、或者將使用者轉向至惡意網站。
(來源: https://www.owasp.org/images/5/51/OWASP_Top_10_2013-Chinese-V1.2.pdf )
為了識別代碼中的 xss 漏洞,我們需要確定行程式碼程式庫中接收沒有驗證或正確編碼使用者提供的輸入並輸出的代碼位置。 PHP 使用者提供的輸入主要是 $_GET , $_ POST , $ _COOKIE , $ _REQUEST 。但是使用者也可以用 $ _FILES , $ _ SERVER 等輸入參數。
我們首先使用帶有Regex的 grep 尋找 $_GET :
grep -i -r “\$_GET” *
選項 -i 表示忽略大小寫,選項 -r 表示遞迴尋找子目錄。Regex “\$_GET” 用來匹配 $_GET ,其中反斜線 \ 用來轉義 $ ,因為 $ 號在Regex中有特殊含義。我們使用萬用字元 * 告訴 grep 在任何檔案中進行搜尋。
正如你所見我們從簡單的grep命令找到了許多結果,讓我們嘗試更具體的操作縮小潛在的可能性。在PHP中,通常使用echo進行輸出。我們來搜尋直接回顯使用者輸入的代碼有哪些。命令:grep -i -r “\$_GET” * | grep “echo”
這樣會在第一次搜尋的結果中再次進行搜尋。
但是卻沒有找到任何代碼,我們來分析下原始的結果看看是什麼原因導致的。
下面這一代碼好像可以輸出。
通過$_GET獲得的值賦予到$html中。我們需要找到這個變數被定義的地方以及被使用的地方。cat vulnerabilities/xss_r/source/low.php
通過閱讀low.php代碼,我們可以更清楚的瞭解它是做什麼的。我們可以看到先對變數進行了檢查,不為空白或null時進入下一步。使用者的輸入應該被過濾或被編碼,以防止xss漏洞的產生。我們目前假設$html變數會直接輸出到瀏覽器上,但是如果$html被過濾了和編碼了那麼xss漏洞就不存在了。
現在我們需要進一步調查$html的輸出位置。low.php的檔案在vulnerabilities/xss_r/source。我們看看這個目錄下還有什麼檔案。
命令:
ls vulnerabilities/xss_r/source
我們可以看到這個目錄下vulnerabilities/xss_r/source/有三個檔案,high.php,medium.php,low.php。讓我們分析下這些檔案,找出與輸出$html有關的線索。先看下medium.php
命令:
cat vulnerabilities/xss_r/source/medium.php
medium.php 檔案的內容和 low.php 裡面的幾乎一樣,但 medium.php 會對 $_GET['name'] 過濾掉 ”
我們成功的執行了指定的Javascript代碼,Ladies and gent,我們發現了個xss漏洞。
Grep命令注入
對於命令注入我引用了OWASP裡面的說明:”對應用程式注入並執行攻擊者指定的語句“。(更多請詳見: https://www.owasp.org/index.php/Command_Injection)
PHP有不同的函數可以執行底層的作業系統命令。如果未對使用者的輸入做任何處理,我們可以注入我們想要執行的命令。使用如下命令搜尋exec()函數:grep -i -r “exec(” *
grep命令似乎給了我們很多結果,然而這並沒有什麼卵用。我們得完善下grep的命令。看搜尋結果,很大部分是svn檔案,還有個看似是IDS的目錄”external“。
這兩個目錄輸出了太多不想要的結果。
執行如下命令:
grep -i -r –exclude-dir={.svn,external} “exec(” *
這結果便是極好的。我們通過exclude-dir來排除.svn和external兩個目錄後,找到了在同個目錄下的代碼(類似XSS的搜尋結果)。順帶發現一個事實:
$target沒有做任何處理就帶入函數中。
我們查看下vulnerabilities/exec/source/low.php檔案。cat -b vulnerabilities/exec/source/low.php
從原始碼中可以瞭解到,$target在第5行被賦值。在第10行和15行中被帶入shell_exec中執行。使用者的輸入直接被帶入執行作業系統命令。真糟!
要驗證是否能利用,開啟dvwa切換到”Command Execution“。你能成功地在作業系統上執行命令來確定所使用的MySQL版本? 試一試!
結論
讀完這篇文章,並在DVWA的協助下,我希望您可以更好的保護Web應用程式。
我們僅僅觸及到的是Grep力量的表面。Grep還有很多參數可以有效協助你。 http://www.ethicalhack3r.co.uk/greping-for-bugs-in-php/
我們可以使用開源的Windows工具來檢查代碼。 http://sourceforge.net/projects/agnitiotool/
和你們所熟知的php靜態代碼審計工具RIPS( http://sourceforge.net/projects/rips-scanner/ )
*參考來源: resources.infosecinstitute ,FB小編東二門陳冠希編譯,轉載請註明來自FreeBuf駭客與極客(FreeBuf.COM)