作者: Demon 链接: http://demon.tw/programming/php-urldecode-sql-injection.html 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就变成单引号了,然后……你懂的。 www.2cto.com 在我初学PHP 的时候,看的是学校 图书 馆的一本烂书,里面根本就没写 PHP 在处理表单的时候会自动urldecode,所以自己用urldecode 函数来解码(依稀记得书上好像也是这么写的,真是误人子弟啊)。 总结一下,就是:1、选择一本好书非常重要;2、慎用urldecode 函数。3、注意PHP 手册中的警告。
查看更多关于PHP:小心urldecode引发的SQL注入漏洞 - 网站安全的详细内容...