什么是绕过
个人理解是系统或者安全软件为了避免攻击者篡改一些参数来获取数据,就会自动过滤一些篡改信息的关键词。但系统和软件终究是人编写出来的,攻击者们还是有各种各样的方法绕过安全点的检测来达到自己的目的。
注释符号绕过
MySQL中常见的注释符有这么几个:
#注释内容
– 注释内容
/* 注释内容 */
其中 - - 要注意跟后面的注释内容有一个空格
(接下来的展示都用mysql命令行展示)
实例:
双写绕过
经典的,例如联合查询中 union select可能都会被waf过滤掉,但是它只会过滤一次啊,那我们多输入一次就行了。
这里是没有过滤的所以会显示语法错误,实际情况如果发生过滤可以这么写。或者ununionion seleselectct 这种的都行,因为它只会过滤一次关键字。
大小写绕过
有的waf对于大小写不敏感,可以利用
实例:
空格绕过
空格可以由底下的符号替代:
/**/
%09、%0a、%0d、%0b等
括号绕过空格
+号、tab、两个空格、反引号等
实例:
等号绕过
可以使用like,rlike,regexp代替=号
也可以使用<>绕过,实际上<>等价于 ! = ,所以我们在前面再加一个 ! 就是双重否定了
实例:
特殊符号绕过
and 替换为 &&
not 替换为 !
or 替换为 ||
异或替换为 xor
…
实例:
内联注释绕过
内联注释就是把一些特有的仅在MYSQL上的语句放在 /* !..*/ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。前面一篇文章有提过一嘴
实例:
参数污染绕过
提供多个parameter= value的值集来混淆绕过WAF。鉴于 http://example.com?id=1&?id=’ 或’1’=‘1’ - '在某些情况下(例如使用Apache / PHP),应用程序将仅解析最后一个(第二个) id =, waf只解析第一个id=。这似乎是一个合理的请求,但应用程序仍然接收并处理恶意输入。今天的大多数waf都不容易受到HTTP参数污染(HPP)的影响,但仍然值得一试。
实例:
宽字节注入
我们都知道在字符型注入中要先用单引号闭合下再输入sql命令,详见SQL注入闭合方式。但是如果程序中在我们输入的单引号之前加上个反斜杠比如: ’ 。这样的话这个单引号就是个字符了,意思就是斜杠与单引号的结合使得单引号转义,没有单引号闭合的作用,就起到了防护的作用。
为了突破这个防护,我们可以使用宽字节注入的方式来进行突破,使用:
%df ’
当我们在单引号之前加上%df的时候,也就是输入%df ’ 这样传入到数据库中就会变成:
%df%5c ’
原理是在GBK编码中,%df与 \ 的转义符%5c结合会编码成一个汉字,这样就使得 ’ 逃逸了。此外 %DE%5C
,%E0%5C
也都是可以的。
小结
以上介绍的知识我目前掌握的一些绕过方式,其中编码(16进制编码,Unicode编码)绕过,过滤引号逗号等没有介绍。具体可以参考:
sql注入绕过方法总结
SQL注入9种绕过WAF方法