引号绕过
sql语句中对’或"做了限制不允许输入时,可以采取十六进制进行绕过
如:
select password from users where user="admin";
可以将admin进行十六进制转换,然后进行绕过
select password from users where user=0x61646D696E;
最后显示的结果相同
一、绕过目录扫描的防护
- 修改user-agent为搜索引擎的爬虫 百度爬虫:
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
- 减缓扫描速度
- 通过代理ip进行扫描
二、手工注入WAF bypass思路
- 大小写变换
如:对某些关键字如:select、union、order、where进行关键字的过滤,可以采用SelEct、UniOn等大小写变换进行绕过。 - 使用嵌套
如对某些关键字替换为空,可以采用嵌套双写进行绕过,如碰到select或者union等关键字时会将其替换为空,此时可以尝试SELEselectCT、UNIunionON进行绕过。 - 空字节
一些过滤器在碰到空字节会停止过滤,如id=1%00
and 1=1或id=1 an%00
d 1=1,当WAF碰到id=1时将停止检测,从而绕过。 - 变换提交方式
规则是对GET请求进行限制而未对POST请求限制可以尝试通过POST请求进行绕过。 - 使用SQL注释
普通注释:
内联注释:
/**/
可以用来代替空格
/*!
select*/
使得select不被注释,table_name, table_schema, =, and information_schema同理均可以采用内联注释进行绕过 - 双重编码
WAF会解码然后过滤关键字,此时通过二次编码进行绕过 - 更换where条件
如果拦截=可以尝试<>、>、<号
<=>
: 比较操作符,当比较的的两个值为 NULL 时返回 true。 - http 参数污染
当get方式进行传参时,通过&符号传入多个参数,WAF可能只检测第一个参数的值,而后台却检测最后一个传入的值,此时可以绕过WAF的防御
如:.php?id=1&id=2&id=select * from class
PHP/Apache会接收最后一个参数
ASP/IIS会将每个参数拼在一起,如id=a&id=b 最后的值为ab
ASP.NET/IIS也是将每个参数拼在一起
JSP,Servlet/Apache Tomcat接收第一个参数
三、测试
环境:
DVWA1.9版本,safedogV4.0apche版
SQL注入测试:
SQL注入Low级别
在MySQL测试了一下条件,and/*1=1*/
发现不报错拿到环境下测试
由于已知此级别存在字符型注入,学习bypass为主所以以下不进行字符型和数字型的判断。
-
首先正常输入:
-
然后在1后加’
dog没有拦截,此处判断出了注入点 -
继续加 and看看是否拦截
-
加and 1
-
被拦截,尝试/**/代替and和1之间的空格
-
依旧被拦截,现在尝试下内联注释
and/*!1=1*/
-
发现不拦截了,此时在后边添加注释符
-
页面回显成功,测试
and/*!1=2*/
-
信息查询不到,此时输入
or/*!1=1*/
成功绕过