PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。 PHP的ZVAL结构中引用计数实现上存在整数溢出漏洞,远程攻击者可能利用此漏洞在服务器上执行任意指令。 在PHP 4中内部描述变量的ZVAL结构类似于: struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uchar type; /* active type */ zend_uchar is_ref; zend_ushort refcount; }; 在设计这个结构时引用计数器为16位宽,这样在32位系统上整个结构为8个字节长;在PHP 5中这个字段为32位宽,因为16位太容易溢出,PHP对引用计数器的溢出也没有内部的防范措施。但对于PHP 4这意味着以下代码会溢出计数器,在脚本端触发变量的双重释放: $var = \"POC\"; for ($i = 0; $i < 0x10001; $i++) { $arr[] = &$var; } 攻击者可以利用这个漏洞破坏内存,可能执行任意指令,从而绕过disable_functions之类的安全限制。 此外由于很多老版本PHP应用程序仍对用户提供的数据使用unserialize(),因此也可能远程触发这个漏洞。Unserialize()函数以不安全的方式使用已还原序列化的__wakeup()方式,可能导致远程执行任意指令。
PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。 PHP的ZVAL结构中引用计数实现上存在整数溢出漏洞,远程攻击者可能利用此漏洞在服务器上执行任意指令。 在PHP 4中内部描述变量的ZVAL结构类似于: struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uchar type; /* active type */ zend_uchar is_ref; zend_ushort refcount; }; 在设计这个结构时引用计数器为16位宽,这样在32位系统上整个结构为8个字节长;在PHP 5中这个字段为32位宽,因为16位太容易溢出,PHP对引用计数器的溢出也没有内部的防范措施。但对于PHP 4这意味着以下代码会溢出计数器,在脚本端触发变量的双重释放: $var = \"POC\"; for ($i = 0; $i < 0x10001; $i++) { $arr[] = &$var; } 攻击者可以利用这个漏洞破坏内存,可能执行任意指令,从而绕过disable_functions之类的安全限制。 此外由于很多老版本PHP应用程序仍对用户提供的数据使用unserialize(),因此也可能远程触发这个漏洞。Unserialize()函数以不安全的方式使用已还原序列化的__wakeup()方式,可能导致远程执行任意指令。