用Mitmproxy輔助Sqlmap自動化利用特殊漏洞
本文主要介紹利用 mitmproxy 腳本輔助 sqlmap,自動化利用漏洞的方法。由於筆者毫無學習更多姿勢的上進心,又在處理資料庫注入漏洞方面才學淺薄,因此當一個漏洞不能用 sqlmap 利用的時候筆者就寸步難行了。
但同時,「懶癌患者」這一屬性也讓筆者發現了一些賴在sqlmap上面不走的方法。在一次測試過程中筆者遇到了這樣一個場景:某網站信息修改頁面的用戶id參數沒有被有效過濾。在一般情況下,這樣的標準漏洞可以直接用sqlmap跑,但是拜CDN所賜,頁面狀態很不穩定,具體表現為HTTP狀態碼隨機被過濾,頁面也不時是被緩存的內容。這樣不穩定的頁面難以使用sqlmap自動化利用。於是筆者利用mitmproxy腳本,與sqlmap的二階注入功能使sqlmap有能力通過自帶的boolean-based檢測方法來檢測update是否成功,並據此判斷表達式真假,自動化利用此漏洞。
一、場景
漏洞涉及兩個頁面,第一個頁面包含修改內容的表單,表單裡面包括當前的值。這個頁面被用於獲取update是否成功
get.php:
第二個頁面是執行update的頁面。這個頁面包含資料庫注入漏洞。
change.php:
顯然第二個頁面的update語句user_id參數沒有被有效過濾。但是因為出錯頁面和http狀態碼都受到CDN緩存影響而不一定出現,直接利用sqlmap處理這個boolean-based的資料庫注入十分困難。
二、手動利用的思路
一切從手動注入說起
發生資料庫注入的語句:
因為update頁面的返回極其不穩定,所以最好的利用方法是通過檢測update來做boolean-based注入。
註:boolean-based注入指利用web應用在漏洞利用者注入的語句中特定表達式真假性不同時產生不同的輸出來獲取資料庫中數據的方法。
舉例:
0 和 1 的不同決定了更新是否成功。因此手動注入的時候就可以不停地企圖把姓名更新為新的值,並通過更新是否成功來判斷and後面表達式的值。
如圖:
三、自動化利用思路
很遺憾,這個利用方式sqlmap並不支持。首先sqlmap對boolean-based 注入的檢測非常靜態,只可以基於一個確定的http狀態碼,正則表達式,字元串是否符合來檢測。而這種利用需要每次更改檢測的內容。其次,sqlmap的請求過程也是靜態的,難以動態地把頁面內容改成和之前不一樣的值。
但是sqlmap也不是一無是處,其自帶的二階注入功能讓利用者可以用get.php來檢測update是否成功。
不妨換一種思路:既然sqlmap只支持把數據更新成一個確定的值,那不妨在每一次檢測過後都把數據「重置」。如果手寫一個http代理,就可以在sqlmap嘗試修改之前將數據設定為初始值,這樣sqlmap的靜態更新和檢測就適用於這個漏洞了。
如圖:
四、自動化利用的實現
這裡使用了mitmdump來實現。工具kali自帶,安裝方法在此不再贅述。
具體的API可以參考API文檔
mitmdump的腳本編程
十分簡單的代碼,如果請求是在提交修改,就在提交之前首先重置數據。
首先開啟代理
然後運行sqlmap
request:
最終結果
五、總結
固然,自動化利用工具難以把漏洞的各種場景都涵蓋。但是我們藉助於可編程的web代理等工具,在對自動化利用工具的工作原理有了解的前提下,往往有機會將那些可以手動利用的特殊漏洞轉化成可以被自動化工具利用的漏洞。
*本文原創作者:piece of the past,屬於FreeBuf原創獎勵計劃,禁止轉載
※利用忘記密碼功能繞過Windows auth & BitLocker
※大疆的漏洞獎勵計劃來了,美國的「安全控訴」是不是可以歇會兒了?
※特別企劃 | 銀行業木馬黑產報告
TAG:FreeBuf |