修复PHP 5.2/5.3 Hash漏洞

漏洞原理

依靠相应语言的hashtable/hashmap实现过程(request多为此结构),当不同的key存入时如果hash值相等则以链表方式连接在前面。此漏洞利用碰撞相同的hash值得到一个长链表,重新get时,map的计算过程会将时间复杂度巨增,原来一个简单的过程将变成一个很费cpu的过程。

解决办法

注意:永久的解决办法是升级到最新版本。下面都是临时的解决方案。

tomcat

maxPostSize=20971520

上面的最大请求为20M,改为一个小于10k的值,所有版本可用,会影响用户。

新版本 maxParameterCount的默认值为1000

nginx

修改设置 此招为各种情况下万金油,会影响用户。

client_max_body_size=10k
默认的最大请求body大小为8m

php

php-5.2.x 到这里下载对应的补丁版本,进入php目录执行patch -p1 < php-5.2.*-max-input-vars.patch打上补丁,之后make 和make install即可。

php-5.3.x 没有提供相应的补丁版本,laruence建议使用php5.3.x的升级到5.3.9RC4或者按照php5.2.x的补丁修改适应成php5.3.x的补丁。下面我们提供直接修改文件的方法,虽然比较麻烦。

  1. 修改/main/main.c文件,把STD_PHP_INI_ENTRY宏加到main.c的PHP_INI_BEGIN()和PHP_INI_END()宏之间来注册PHP INI指令:
    STD_PHP_INI_ENTRY(" max_input_vars", "1000", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLongGEZero, max_input_vars, php_core_globals, core_globals)
    
  2. 修改文件/main/php_globals.h,_php_core_globals结构体内加上:
    long max_input_vars;
    
  3. 修改文件/main/php_variables.c,在:
    zend_symtable_update(symtable1, escaped_index, index_len + 1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p);
    
    之前加入:
    if (zend_hash_num_elements(symtable1) >= PG(max_input_vars)) {
        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Input variables exceeded %ld. To increase the limit change max_input_vars in php.ini.", PG(max_input_vars));
    }
    
    一共有两处,第一处数组中的键时的操作,而第二处是普通变量时的操作。

相关资料

內容目录

上一个主题

webserver

下一个主题

codecube

快速搜索

输入相关的模块,术语,类或者函数名称进行搜索