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
试了下,果然可以成功执行了。
但具体原因没讲,不明白。
不知道有谁能帮忙指点下其中的原理吗?
另外,还有没有别的方法可以成功绕过被转义的单双引号呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
%BF%27
的情况下addslashes
会无视掉%BF而直接给%27加斜线斜线是%5C 于是就变成了这样子
%BF%5C%27
前面两个构成一个宽字符 然后%27就单独被解析了
防这种注入 能够按照参数格式来过滤最好
如果过滤后仍有风险 还是要采取预编译 或者用
mb
前缀的函数重写一个