SQL注入之堆叠及WAF绕过堆叠注入:
堆叠注入:多条SQL语句一起执行,本质上就是将多条SQL语句通过 ;来一起注入
WAF绕过:更改提交方式,但是必须保证参数可以通过不同的提交方式接受;若拦截了数据,如database()等,可以通过大小写,加密解密,编码函数,等价函数(例如用mid取代ascii),特殊符号(不影响SQL语句正常执行,而可以绕过WAF正则表达式的搜索),反序列化,
注释符混用
(例如 select database()被拦截,但select (),select database均可以执行,所以可以通过select database/**/()来执行,这个/星号星号/为MySQL特有注释符,不会影响SQL语句执行)等,union %23a%0Aselect 1,2;会变成union #a
select 1,2,3可以绕过WAF
往字符里面插入被过滤的字符(双写法)
比如or被过滤了,我们可以往里面加or,即注入:oorr,这个时候里面的or就被删去了,剩下的组成新字符,也就是or,是个很好用的绕过方法,像这种类似的还有很多;or被过滤也可以采用||来代替or,且||比or的作用更强,||后是绝对的另一种情况,例如orupdatexml(1,1,1)不会执行,但是||updatexml(1,1,1)是可以执行的。
对于过滤了空格,有较多的方法代替空格:
%09 TAB(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB(垂直) (php-5.2.17,5,3,29成功)
%a0 空格 (php-5.2.17成功)
%27 单引号
若均不可以,还可以采用用()来代替空格的作用,例如select 1,2,3 from users 可以写作select(1,2,3)from(users)
HTTP参数污染,例如?id=1&id=3在不同服务器下对id的处理方式不同,例如阿帕奇接受原则是last
所以可以通过?id=1/**&id=-1%20union%20select%201,2,3%23*/安全狗在检测的时候由于/xxx/ 会注释其中内容,所以检测不到
但是当执行时由于参数污染,所以会执行&id=-1%20union%20select%201,2,3%23/,%20空格,%23# %0A为换行符。(内联注释)
版本号绕过(针对MySQL):/!50001select * from test/ 只有5.00.01以上版本才会执行,以下的会当成注释内容
修改白名单IP:利用在请求包里加上x-forwarded-for:白名单ip等
静态资源请求:一些特定的静态资源后缀请求,如.js , .jpg, .swf , .css等,waf为了提高检测效率,不会过滤这些请求,所以可以index.php/x.txt/? id=1 and 1=1
url白名单:有一些路径为白名单,可能不会被拦截,如admin.php等
爬虫白名单:部分waf有提供爬虫白名单的功能,识别爬虫的技术有两种
1根据UserAgent,可以伪装
2根据行为判断