PHP php_stream_filter_create()函数缓冲区溢出漏洞
发布日期:2007-03-31
更新日期:2007-04-02
受影响系统:PHP PHP 5 < 5.2.1
不受影响系统:PHP PHP 5.2.1
描述:
BUGTRAQ  ID: 
23237
PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。
PHP的php_stream_filter_create()函数实现上存在缓冲区溢出漏洞,本地攻击者可能利用此漏洞提升自己的权限。
当php_stream_filter_create()函数创建过滤器时,首先在哈希表中通过名称搜索过滤器,如果不成功的话就检查是否存在支持所请求过滤器的通配符过滤器。这个操作由以下代码处理:
    if (SUCCESS == zend_hash_find(filter_hash, (char*)filtername, n, (void**)&factory)) {
        filter = factory->create_filter(filtername, filterparams, persistent TSRMLS_CC);
    } else if ((period = strrchr(filtername, '.'))) {
        /* try a wildcard */
        char *wildname;
        wildname = estrdup(filtername);
        period = wildname + (period - filtername);
        while (period && !filter) {
            *period = '\0';
            strcat(wildname, ".*");
            if (SUCCESS == zend_hash_find(filter_hash, wildname, strlen(wildname), (void**)&factory)) {
                filter = factory->create_filter(filtername, filterparams, persistent TSRMLS_CC);
            }
            *period = '\0';
            period = strrchr(wildname, '.');
        }
        efree(wildname);
    }
可见这个函数假设字符串的末尾不会出现句号("."),因为根本就没有保存这种情况下所需的额外内存字节,因此如果所创建的过滤器名称末尾包含有句号的话就会导致单字节溢出,用“\0”字符覆盖内存中之后的字节。
<*来源:Stefan Esser (
s.esser@ematters.de)
  
  链接:
http://www.php-security.org/MOPB/MOPB-42-2007.html
*>
测试方法:
警  告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
<?php
    $url = "php://filter/read=OFF_BY_ONE./resource=/etc/passwd";
    fopen($url, "r");
?>
建议:
厂商补丁:
PHP
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.php.net/downloads.php#v5浏览次数:4189
严重程度:0(网友投票)