Press "Enter" to skip to content

PHP5.2.*防止Hash冲突拒绝服务攻击的Patch

由我前面的俩篇文章介绍(通过构造Hash冲突实现各种语言的拒绝服务攻击, PHP数组的Hash冲突实例 ), 这个攻击方法危害很高, 攻击成本也很小. 一个台式机可以轻松搞垮数十台, 上百台服务器.
而和Pierre沟通后, 官方开发组不会为此发布PHP 5.2.18, 但是目前还是由不少公司还在使用5.2, 所以我特将dmitry为5.4写的patch, 分别apply到5.2上.
大家如果有用5.2的, 如果被此类攻击威胁, 可以打上下面的patch, PHP5.3的, 可以考虑升级到5.3.9, 已经包含了此patch(因为5.3.9目前是RC状态, 所以如果不愿意升级, 也可以参照这个patch自己为5.3写一个):
https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars
补充一下(2012年1月8日): 如果你使用的是Windows下的PHP, 或者其他原因导致你不方便采用打patch的方法, 也可以采用修改PHP的配置max_input_time为一个较小的值来缓解此类攻击带来的影响.
另外, 其他语言java, ruby等, 请各位也预先想好对策, 限制post_size是治标不治本的方法, 不过可以用来做临时解决方案.
thanks

39 Comments

  1. mapquest driving directions
    mapquest driving directions October 22, 2019

    A very interesting topic that I have considered, I think this is one of the most important information for me. And I’m glad to read your article. Thanks for sharing!

  2. […] 针对 POST 方式的哈希碰撞攻击,目前 PHP 的防护措施是控制 POST 数据的数量。在>=PHP5.3.9 的版本中增加了一个配置项 max_input_vars,用于标识一次 http 请求最大接收的参数个数,默认为 1000。因此 PHP5.3.x 的用户可以通过升级至 5.3.9 来避免哈希碰撞攻击。5.2.x 的用户可以使用这个 patch:http://www.laruence.com/2011/12/30/2440.html。 […]

  3. monster warlord cheat
    monster warlord cheat September 18, 2014

    I was pretty pleased to uncover this site. I want to to thank you for ones time just for this wonderful read!!
    I definitely savored every bit of it and i also have you bookmarked to look at
    new things on your blog.
    my page; monster warlord cheat

  4. […] 针对POST方式的哈希碰撞攻击,目前PHP的防护措施是控制POST数据的数量。在>=PHP5.3.9的版本中增加了一个配置项max_input_vars,用于标识一次http请求最大接收的参数个数,默认为1000。因此PHP5.3.x的用户可以通过升级至5.3.9来避免哈希碰撞攻击。5.2.x的用户可以使用这个patch:http://www.laruence.com/2011/12/30/2440.html。 […]

  5. sk
    sk February 5, 2012

    已经使用。非常不错
    5.2.17使用还比较广泛

  6. George
    George February 4, 2012

    Hello Laruence,
    您好, 首先謝謝您的回覆, 有少少問題欲請教 –
    在您的 5.2.17 patch 裡, 於 php_error_docref , 您使用了 E_ERROR (而不是 PHP 5.3.9 原本的 E_WARNING)
    我們驗過, 似乎 E_ERROR 是會中止 c 程式執行,所以沒有運行有問題的 Z_ARRVAL_PP;
    而 E_WARNING (或 E_NOTICE) 是會讓 PHP 的 php_variables.c 程式繼續執行, 所以間接地牽涉的 Z_ARRVAL_PP
    請多多指教。
    謝謝
    George

  7. laruence
    laruence February 4, 2012

    @George
    hello, there is no such issue in this patch, so plz don’t worry. 🙂

  8. George
    George February 3, 2012

    Hello Laruence,
    There were a related vulnerability CVE-2012-0830 for this patch.
    May you mind to back-ported the change for PHP 5.2.17 too?
    Thank you very much for your kind attention
    Regards
    George

  9. 雪候鸟
    雪候鸟 February 3, 2012

    @none 我为5.2提供的patch, 不受此影响. thanks 🙂

  10. easyboy
    easyboy January 12, 2012

    centos下用yum安装的PHP能打补丁吗?都不知道怎么进入PHP src目录,求教!~

  11. zlsky
    zlsky January 9, 2012

    我打了5.2.17的补丁之后,php的session就无法保存了.
    大致看了一下应该是cookie的session id 无法映射到服务器里面的session值….
    每当页面跳转的时候session值就全部丢失了?会是什么原因造成的.

  12. […] 针对POST方式的哈希碰撞攻击,目前PHP的防护措施是控制POST数据的数量。在>=PHP5.3.9的版本中增加了一个配置项 max_input_vars,用于标识一次http请求最大接收的参数个数,默认为1000。因此PHP5.3.x的用户可以通过升级至5.3.9来避 免哈希碰撞攻击。5.2.x的用户可以使用这个patch:http://www.laruence.com/2011/12/30/2440.html。 […]

  13. […] 针对POST方式的哈希碰撞攻击,目前PHP的防护措施是控制POST数据的数量。在>=PHP5.3.9的版本中增加了一个配置项max_input_vars,用于标识一次http请求最大接收的参数个数,默认为1000。因此PHP5.3.x的用户可以通过升级至5.3.9来避免哈希碰撞攻击。5.2.x的用户可以使用这个patch:http://www.laruence.com/2011/12/30/2440.html。 […]

  14. 雪候鸟
    雪候鸟 January 6, 2012

    @rui7905 你打完补丁以后, make clean了么

  15. rui7905
    rui7905 January 6, 2012

    5.2.14打过补丁之后,发现file_get_contents函数会报“URL File-Access is Disabled”的错误,修改php.ini的allow_url_include为On之后,就好了。但是补丁之前的allow_url_include也是Off,看过补丁代码也没发现跟这个有关的地方,很奇怪……

  16. 三少
    三少 January 4, 2012

    发现这个补丁在参数超过设置时错误信息并不能显示出来。
    2012/01/04 19:32:05 [error] 16816#0: *256659 FastCGI sent in stderr: “PHP Fatal error: Unknown: Input variables exceeded 1.
    To increase the limit change max_input_vars in php.ini. in Unknown on line 0” while reading response header from upstream, cl
    ient: *****, server: $host, request: “POST /input_vars.php HTTP/1.1”, upstream:
    2012/01/04 19:32:05 [error] 16816#0: *256659 upstream sent unexpected FastCGI record: 3 while reading response header from up
    stream, client: *****, server: $host, request: “POST /input_vars.php HTTP/1.1”, upstream:

  17. Anonymous
    Anonymous January 4, 2012

    发现这个补丁在post参数超过设置时,错误信息并不能显示在浏览器里(display_errors已经打开),nginx日志为:
    2012/01/04 19:32:05 [error] 16816#0: *256659 FastCGI sent in stderr: “PHP Fatal error: Unknown: Input variables exceeded 1.
    To increase the limit change max_input_vars in php.ini. in Unknown on line 0” while reading response header from upstream, cl
    ient: *****, server: $host, request: “POST /input_vars.php HTTP/1.1”, upstream:
    ……
    2012/01/04 19:32:05 [error] 16816#0: *256659 upstream sent unexpected FastCGI record: 3 while reading response header from up
    stream, client: ******, server: $host, request: “POST /input_vars.php HTTP/1.1”, upstream:
    ……

  18. 一寒
    一寒 January 4, 2012

    linux的还有办法打补丁重编译,windows下的php5.2.17怎么编译?现在好多加密程序只支持PHP5.2X系列,用不了5.3,而官方又不给5.2.17提供解决办法。强烈建议出一个经验证的完整的windows编译方法

  19. 不懂
    不懂 January 2, 2012

    鸟哥,问你个问题:
    在网站访问量比较大的时候,网站应用了伪静态和不用伪静态对主机的性能影响的区别有多大?
    应用伪静态会多占用服务器的CPU?

  20. Justin
    Justin December 31, 2011

    sed -i “s/PHP_EXTRA_VERSION=\”\”/PHP_EXTRA_VERSION=\”p1\”/” ./configure
    sed -i “s/PHP_EXTRA_VERSION=\”\”/PHP_EXTRA_VERSION=\”p1\”/” ./configure.in
    sed -i “s/define PHP_EXTRA_VERSION \”\”/define PHP_EXTRA_VERSION \”p1\”/” ./main/php_version.h
    sed -i “s/long max_input_nesting_level;/&\n\tlong max_input_vars;/” ./main/php_globals.h
    sed -ie “/Z_TYPE_PP(gpc_element_p) != IS_ARRAY) {/a\\\t\t\t\t\tif (zend_hash_num_elements(symtable1) >= PG(max_input_vars)) {\n\t\t\t\t\t\tphp_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));\n\t\t\t\t\t}” ./main/php_variables.c
    sed -ie “/zval_ptr_dtor(&gpc_element);/{n; s/} else {/&\n\t\t\t\tif (zend_hash_num_elements(symtable1) >= PG(max_input_vars)) {\n\t\t\t\t\tphp_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));\n\t\t\t\t}/;}” ./main/php_variables.c
    sed -ie “/PHP_INI_BEGIN()/{n; s/$/&\n\tSTD_PHP_INI_ENTRY(\”max_input_vars\”, \”1000\”, PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLongGEZero, max_input_vars, php_core_globals, core_globals)/;}” ./main/main.c

  21. boyaa
    boyaa December 31, 2011

    it is can not make effect even though I patched the php-5.2.10 successfully !

  22. 饼饼
    饼饼 December 31, 2011

    patch -p1 < laruence-laruence.github.com-43969a1/php-5.2-max-input-vars/php-5.2.17-max-input-vars.patch
    can't find file to patch at input line 4
    Perhaps you used the wrong -p or –strip option?
    The text leading up to this was:
    ————————–
    |diff -u -r php-5.2.17/configure php-5.2.17-patched/configure
    |— php-5.2.17/configure 2011-01-07 07:04:43.000000000 +0800
    |+++ php-5.2.17-patched/configure 2011-12-31 11:46:11.000000000 +0800
    ————————–
    File to patch:
    不行挖。。

  23. Anders
    Anders December 31, 2011

    貌似必须restart 才行啊, reload都不行呢。

  24. coralzd
    coralzd December 31, 2011

    cd Php-5.2.17 ;
    执行patch -p1 php-5.2.17-max-input-vars.patch
    一直在那里卡住!

  25. 蘑菇
    蘑菇 December 31, 2011

    呃,php 5.3.9 在哪?

  26. -_-
    -_- December 30, 2011

    弱弱的问一下 如何给线上运行的PHP打path

  27. 雪候鸟
    雪候鸟 December 30, 2011

    @板子 不能怨我啊, 这个方法是国外曝出来的…..

  28. 板子
    板子 December 30, 2011

    鸟哥,这两篇文章一发,大家都不得不升级了
    攻击门槛被降低到约等于0了

  29. cha369
    cha369 December 30, 2011

    鸟哥效率啊,造福大众

Comments are closed.