SQLI:如何绕过addslashes


代码:


 function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash
    return $string;
}

程序中,对从客户端传递过来的参数都会使用check_addslashes函数对单引号和双引号进行转义
比如:
攻击者构造的payload: id=1' and sleep(3) --+
最终的sql语句就变成了: SELECT * FROM users WHERE id='1\' and sleep(3) -- ' LIMIT 0,1
问题:
对于此种类型的防注入,可以怎样bapass呢?
google了下,
可以这样构造payload:
id=1%BF%27 and sleep(3) --+
则最终的sql语句:
SELECT * FROM users WHERE id='1�\' and sleep(3) -- ' LIMIT 0,1
试了下,果然可以成功执行了。
但具体原因没讲,不明白。
不知道有谁能帮忙指点下其中的原理吗?
另外,还有没有别的方法可以成功绕过被转义的单双引号呢?

网络安全 sqlite php安全

自由引导人民 10 years, 4 months ago

%BF%27 的情况下 addslashes 会无视掉%BF而直接给%27加斜线
斜线是%5C 于是就变成了这样子 %BF%5C%27
前面两个构成一个宽字符 然后%27就单独被解析了

防这种注入 能够按照参数格式来过滤最好
如果过滤后仍有风险 还是要采取预编译 或者用 mb 前缀的函数重写一个

KAN@on answered 10 years, 4 months ago

Your Answer