记一次简单的sql注入逃逸WAF

前言:核心思想就是判断出能够逃逸的字符

0x01 寻找注入点

平平无奇的一个界面,随意查询看看数据包

20240429170831110-图片

数据包

看到了很多的参数,随意加上双引号,看看回显

20240429170907219-图片

嗯哼,这不就是妥妥的sql注入吗

0x02 开始绕过

现在注入点找到了,现在开始绕过,得到数据库名

第一步 看看都过滤了什么

绕过过滤机制之前肯定得知道他都过滤了什么东西

单引号 被拦截了

20240429171530474-图片

括号 没有被拦截 说明还能使用函数

20240429171553754-图片

试一试 select 发现被拦截了

20240429171618694-图片

试了试 1,2,3 还是被拦截了,真服了,并列语句也不能使用

20240429171639213-图片

到这里不禁思考,能不能用不拦截的语句包含一些被拦截的语句,最后结果会是怎么样?想到这里,前面刚好括号不拦截,那就用括号包含一下试试

20240429171701175-图片

嗯哼,发现不拦截了

那思路就明确了,就是用括号去绕过这里的过滤机制

第二步 确定函数

前面经过初步的测试,大概发现了过滤机制的过滤规则

下面确定函数,也就是要用哪种方法进行注入,我一般喜欢使用报错注入,于是我直接甩出来一个updatexml

嗯哼,过滤了

20240429171741933-图片

那就换一个函数吧 报错注入的函数那么多,我不信全都过滤了

反手再掏出一个 extractvalue

好,没有过滤

20240429171802482-图片

那么现在就要开始构造语句了

第三步 构造语句

在构造语句之前先看看extractvalue函数标准语法

mysql> select (extractvalue(1,(database())));
+--------------------------------+
| (extractvalue(1,(database()))) |
+--------------------------------+
|                                |
+--------------------------------+
1 row in set (0.00 sec)
//在1中查询不到database()的结果,但是也没有语法错误,所以不会报错

但是在sql注入中我们一般用concat函数拼接一个错误的Xpath让mysql报错得到包含查询值的字符串(使用频率比较广泛)

select (extractvalue(1,concat(0x7e,database())));

我们在自己本地的数据库中试一试该语句

mysql> select (extractvalue(1,concat(0x7e,database())));
ERROR 1105 (HY000): XPATH syntax error: '~lw'

发现没,这个语句会直接爆出我们的数据库名

现在我们先去使用一下这个语句

20240429172123239-图片

嗯 发现被过滤了,没事,我们前面才发现,并列的语句要用括号括起来,那么我们再修改一下

extractvalue(1,(concat(0x7e,(database()))))

20240429172154745-图片

还是被过滤了,这个时候就需要思考一下,语句和规则都没问题,那么就可能是某些函数被过滤了,我们要一个一个排除

首先我们先确定是不是database()被过滤了

20240429172217422-图片

发现是database函数被过滤了

那么现在就换一个能平替database的函数 百度搜索找到了schema函数

再去试试

schema函数没有被过滤

20240429172239911-图片

那再去试试

extractvalue(1,(concat(0x7e,(select schema()))))#

20240429172329153-图片

我去,还是被拦截了,难不成是concat函数不能用吗,好好好,再去验证一下

20240429172350509-图片

果然。。。。。。

唉,再去找能平替的函数

经过一段时间的寻找,终于找到了一个不被拦截的函数了 concat_ws 函数

先来了解一下concat_ws函数:

CONCAT_WS()可自定义连接符

用法:CONCAT_WS(separator,str1,str2,…)

第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间

本地测试一下用法

mysql> select concat_ws(5,1,2);
+------------------+
| concat_ws(5,1,2) |
+------------------+
| 152              |
+------------------+
1 row in set (0.00 sec)

看到了吧,就是把后面两个字符连接起来,连接符就是第一个字符(可以这样理解)

现在我们把concat换成concat_ws再看看效果

先本地试试

mysql> select extractvalue(1,(concat_ws(1,(2),(schema()))));
ERROR 1105 (HY000): XPATH syntax error: 'lw'

本地是没有问题的 注意这里还有用括号包含并列语句,这是前面讲过的

再去试试看

20240429172517835-图片

嗯。。。发现确实没有被过滤了 但是还是不行

怎么办呢,思来想去,凭借经验 在前面加个减号试试

图片[17],记一次简单的sql注入逃逸WAF,网络安全爱好者中心-神域博客网

为什么用减号呢 因为在本地是可以存在的

mysql> select - extractvalue(1,(concat_ws(1,(2),(schema()))));
ERROR 1105 (HY000): XPATH syntax error: 'lw'

具体为什么我也不太清楚 这种都是试出来的经验。

结语:碰到SQL注入特别是有waf的情况下,自己多去尝试手注,去尝试绕过,可能会有不一样的收获。

------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞20 分享
评论 共13条
头像
善语结善缘,恶语伤人心
提交
头像

昵称

取消
昵称常用语 夸夸
夸夸
还有吗!没看够!
表情图片
    • 头像Graham Klocko0
    • 头像Clemmie Lakin0
    • 头像Georgianna Padberg0
    • 头像Magali Marvin0
    • 头像Zaria Hills0
    • 头像Jaren McDermott0
    • 头像Lessie Mann0
    • 头像Walker Hahn0
    • 头像Verner Yost0
    • 头像Zechariah Bode0
    • 头像kk0
    • 头像rajaspin0