PHP ZendEngine变量释放远程拒绝服务漏洞
发布日期:2007-03-01
更新日期:2007-03-02
受影响系统:PHP PHP 所有版本
描述:
BUGTRAQ  ID: 
22764
PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。
PHP没有对嵌套数组的深度强制任何过滤检查。由于变量注册是以迭代的方式执行的,因此PHP会接受任何深度,直到达到memory_limit。PHP数组的释放是以递归的方式执行的,因此在耗尽了栈极限的时候就会崩溃。
 
攻击者可以利用上述问题以可控的方式导致PHP崩溃。假设以下PHP代码:
  if (!checkUserPWD($user, $pass)) {
    $errmsg = "There is problem ...";
    displayError($errmsg);
    notifyAdminOfCrackAttempt();     
  } else {
    // do all the fun
  }
在暴力猜测其他用户的口令时攻击者可能不希望通过发送大量通知邮件通知管理员,但假设目标已经激活了register globals,攻击者提供名为errmsg的深层嵌套数组遍历。然后用户名和口令检查失败,覆盖变量,导致释放用户提供的数组,这样PHP就会崩溃,攻击者可以在暴力猜测口令时不发送通知邮件。在日志文件中会有崩溃记录,但管理员无法看到起因。
<*来源:Stefan Esser (
s.esser@ematters.de)
  
  链接:
http://www.php-security.org/MOPB/MOPB-03-2007.html
*>
测试方法:
警  告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
$ php -r 'echo "a".str_repeat("[]",200000)."=1&a=0";' > postdata
$ curl 
http://127.0.0.1/phpmyadmin/ -d @postdata
curl: (52) Empty reply from server
建议:
厂商补丁:
PHP
---
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.php.net浏览次数:3072
严重程度:0(网友投票)