学院首页>安全防御>黑客技法>漏洞公布:PHP wordwrap()缓冲区溢出

漏洞公布:PHP wordwrap()缓冲区溢出

作者:xiaoliu 来源:安全中国 添加时间:2006-5-26 13:19:55

受影响系统: 

  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; 

   } 

  ... 

  } 

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

  

第 1 页,共 2 页 [1] [2]
站内搜索