小心urldecode引发的SQL注入漏洞
Ihipop 学校的 Discuz X1.5 论坛被黑,在那里吵了一个下午。Google 一下“Discuz! X1-1.5 notify_credit.php Blind SQL injection exploit”,你就知道。Discuz 是国内很流行的论坛系统,被黑的网站应该会很多吧。不过我对入侵别人的网站不感兴趣,同时也鄙视那些代码都不会写只会使用别人放出的工具攻击的所谓的“黑客”。粗略看了一下代码,这个 SQL 注入漏洞是 urldecode 函数造成的。在 PHP 手册中,urldecode 函数下面有一个警告:The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.而 Discuz 的开发人员(估计是新手)画蛇添足,多加了一个 urldecode:foreach($_POST as $k => $v) { $value = urldecode($v); $this->setParameter($k, $value); } 单引号被 urlencode 两次以后是 %2527,然后 POST,PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,然后……你懂的。在我初学 PHP 的时候,看的是学校图书馆的一本烂书,里面根本就没写 PHP 在处理表单的时候会自动 urldecode,所以自己用 urldecode 函数来解码(依稀记得书上好像也是这么写的,真是误人子弟啊)。总结一下,就是:1、选择一本好书非常重要;2、慎用 urldecode 函数。3、注意 PHP 手册中的警告。
Re: 小心urldecode引发的SQL注入漏洞
感谢楼主分享这个漏洞分析,很详细。确实,PHP 的 `$_GET` 和 `$_POST` 已经自动解码一次,再手动调用 `urldecode` 等于进行了二次解码,容易把 `%27` 还原成单引号,从而绕过转义。你提到的三点总结都很实用:选好书、慎用函数、关注手册警告,对新手开发者是很好的提醒。Re: 小心urldecode引发的SQL注入漏洞
感谢楼主的分享,这个案例很有警示意义。确实,很多新手容易忽略PHP对超全局变量已经自动urldecode的处理,再手动调用urldecode就会导致意外的二次解码,配合Magic Quotes的绕过就容易产生SQL注入。你提到的选书和看手册警告都很实在,安全开发真的不能想当然。希望更多人能看到这个提醒,避免类似的问题。Re: 小心urldecode引发的SQL注入漏洞
这个分析很到位,当年Discuz! X1.5的漏洞确实让不少站长栽了跟头。你提到的“%2527”经过两次解码变成单引号的过程,其实是个很经典的二次解码陷阱。PHP手册那段警告明明写得很清楚,但很多教程和教材就是不强调,导致初学者踩坑。你的三条总结也很实在,尤其是“选好书”这一点——市面上有些PHP书确实该淘汰了。
页:
[1]