PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。 PHP在内存管理的代码实现上存在漏洞,远程攻击者可能利用此漏洞在某些特定系统平台下执行任意指令。 PHP的堆内存管理器会存储用户所请求的控制信息。当使用FILTER_VALIDATE_INT过滤器时,首先要对入站的用户输入数据执行去除空格操作,由以下宏完成: #define PHP_FILTER_TRIM_DEFAULT(p, len, end) { \ while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\v') { \ p++; \ len--; \ } \ start = p; \ end = p + len - 1; \ if (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\v') { \ unsigned int i; \ for (i = len - 1; i >= 0; i--) { \ if (!(p[i] == ' ' || p[i] == '\t' || p[i] == '\r' || p[i] == '\v')) { \ break; \ } \ } \ i++; \ p[i] = '\0'; \ end = p + i - 1; \ len = (int) (end - p) + 1; \ } \ } 如果存在空格的话,这个宏首先向前移动start指针,然后在回退的时候end指针也执行同样的操作,最后向末尾写入一个空字节结束字符串。但由于回退并不是在字符串的开始处停止的,因此如果缓冲区开始之前的字节中包含有属于空白字符集的ASCII字符的话,上述操作就会在所分配的缓冲区之前写入空字节。 PHP新的内存管理器将之前内存块的大小储存在缓冲区之前,因此在little endian系统中缓冲区之前的字节不太可能出现空格空白字符;但在big endian系统中(如PPC)远程攻击者可能创建在缓冲区之前包含有空白字符的堆结构,这样去除空格操作就会用空字节覆盖该结构,破坏控制信息,导致执行任意指令 PHP 5.2.0 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: <a...
PHP是广泛使用的通用目的脚本语言,特别适合于Web开发,可嵌入到HTML中。 PHP在内存管理的代码实现上存在漏洞,远程攻击者可能利用此漏洞在某些特定系统平台下执行任意指令。 PHP的堆内存管理器会存储用户所请求的控制信息。当使用FILTER_VALIDATE_INT过滤器时,首先要对入站的用户输入数据执行去除空格操作,由以下宏完成: #define PHP_FILTER_TRIM_DEFAULT(p, len, end) { \ while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\v') { \ p++; \ len--; \ } \ start = p; \ end = p + len - 1; \ if (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\v') { \ unsigned int i; \ for (i = len - 1; i >= 0; i--) { \ if (!(p[i] == ' ' || p[i] == '\t' || p[i] == '\r' || p[i] == '\v')) { \ break; \ } \ } \ i++; \ p[i] = '\0'; \ end = p + i - 1; \ len = (int) (end - p) + 1; \ } \ } 如果存在空格的话,这个宏首先向前移动start指针,然后在回退的时候end指针也执行同样的操作,最后向末尾写入一个空字节结束字符串。但由于回退并不是在字符串的开始处停止的,因此如果缓冲区开始之前的字节中包含有属于空白字符集的ASCII字符的话,上述操作就会在所分配的缓冲区之前写入空字节。 PHP新的内存管理器将之前内存块的大小储存在缓冲区之前,因此在little endian系统中缓冲区之前的字节不太可能出现空格空白字符;但在big endian系统中(如PPC)远程攻击者可能创建在缓冲区之前包含有空白字符的堆结构,这样去除空格操作就会用空字节覆盖该结构,破坏控制信息,导致执行任意指令 PHP 5.2.0 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: <a href="http://www.php.net/downloads.php#v5" target="_blank">http://www.php.net/downloads.php#v5</a>