msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

30 Dec 11 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


分享到:



Related Posts:

Tags: , , ,

35 Responses to “PHP5.2.*防止Hash冲突拒绝服务攻击的Patch”

  1. ロレックス レディース フラワー 2ch |

    ブランド偽物(コピー商品)激安市場
    バッグ、財布、腕時計人気貴族店
    2016ブランド偽物バッグ財布時計コピー激安
    ★最高級のバッグ 財布 時計大量入荷超人気!!!★
    超人気のブランド店実物写真ブランド店
    ■2016年の超人気ブランド新品■
    ┏━━━━豪華贅沢品━━━━┓
    ◎━バッグ :ブラダ、イースト、アウトドア、コーチ、ディーゼル
    ◎━財 布:カルティエ、ブルガリ、グッチ、ブラダ、コーチ
    ◎━時 計:ロレックス、パネライ、シャネル
    ■◎━━◎低価格 低価格◎━━◎■
    ■◎━━◎年末引割り◎━━◎ ■
    ☆●●●●●運賃無料実施中●●●●●☆
    ↓↓↓
    ロレックス レディース フラワー 2ch http://www.fujisanbrand.com/watch/rolex/index.htm

  2. ดูบอลออนไลน์ |

    Excellent article! We are linking to this particularly great post on our site.
    Keep up the good writing.

  3. monster warlord cheat |

    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. PHP5.2.*防止Hash冲突拒绝服务攻击的Patch树林/咖啡 成都专业php网站制作 | 树林/咖啡 成都专业php网站制作 |

    [...] 风雪之隅 » PHP源码分析 Posted in: php / Tagged: PHP5.2.*防止Hash冲突拒绝服务攻击的Patch [...]

  5. webguo在路上 » PHP哈希表碰撞攻击原理 |

    [...] 针对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。 [...]

  6. 运维军团——运维技术与开源架构交流 » Hash冲突实现各种拒绝服务攻击 |

    [...] http://www.laruence.com/2011/12/30/2440.html [...]

  7. sk |

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

  8. George |

    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

  9. laruence |

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

  10. George |

    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

  11. 雪候鸟 |

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

  12. none |

    please fix this bug https://bugs.php.net/bug.php?id=60708 in you https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars patch

  13. easyboy |

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

  14. zlsky |

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

  15. 安装防止Hash冲突拒绝服务攻击的PHP Patch | Mr.Bird |

    [...] 在之后laruence放出了PHP对应的补丁,以解决这一问题. [...]

  16. 安装防止Hash冲突拒绝服务攻击的PHP Patch « Lauyu的茶几 |

    [...] 在随后几天laruence放出了PHP对应的补丁,以解决这一问题. [...]

  17. PHP哈希表碰撞攻击原理 - 博客 - 伯乐在线 |

    [...] 针对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。 [...]

  18. PHP哈希表碰撞攻击原理 - 博客 - 伯乐在线 |

    [...] 针对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。 [...]

  19. 雪候鸟 |

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

  20. rui7905 |

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

  21. 三少 |

    发现这个补丁在参数超过设置时错误信息并不能显示出来。

    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:

  22. Anonymous |

    发现这个补丁在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:
    ……

  23. 雪候鸟 |

    @一寒 Windows下, 可以考虑安装suhosin扩展: http://www.hardened-php.net/suhosin/ 它也有类似的suhosin.post.max_vars的设置

  24. 一寒 |

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

  25. 不懂 |

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

  26. Justin |

    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

  27. boyaa |

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

  28. 饼饼 |

    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:

    不行挖。。

  29. Anders |

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

  30. coralzd |

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

  31. 蘑菇 |

    呃,php 5.3.9 在哪?

  32. -_- |

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

  33. 雪候鸟 |

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

  34. 板子 |

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

  35. cha369 |

    鸟哥效率啊,造福大众

Leave a Reply

*