- 本文地址: https://www.laruence.com/2011/12/30/2440.html
- 转载请注明出处
由我前面的俩篇文章介绍(通过构造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
already used code
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!
[…] http://www.laruence.com/2011/12/30/2440.html […]
[…] http://www.laruence.com/2011/12/30/2440.html […]
[…] 针对 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。 […]
Excellent article! We are linking to this particularly great post on our site.
Keep up the good writing.
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
[…] 风雪之隅 » PHP源码分析 Posted in: php / Tagged: PHP5.2.*防止Hash冲突拒绝服务攻击的Patch […]
[…] 针对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。 […]
[…] http://www.laruence.com/2011/12/30/2440.html […]
已经使用。非常不错
5.2.17使用还比较广泛
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
@George
hello, there is no such issue in this patch, so plz don’t worry. 🙂
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
@none 我为5.2提供的patch, 不受此影响. thanks 🙂
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
centos下用yum安装的PHP能打补丁吗?都不知道怎么进入PHP src目录,求教!~
我打了5.2.17的补丁之后,php的session就无法保存了.
大致看了一下应该是cookie的session id 无法映射到服务器里面的session值….
每当页面跳转的时候session值就全部丢失了?会是什么原因造成的.
[…] 在之后laruence放出了PHP对应的补丁,以解决这一问题. […]
[…] 在随后几天laruence放出了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。 […]
[…] 针对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。 […]
@rui7905 你打完补丁以后, make clean了么
5.2.14打过补丁之后,发现file_get_contents函数会报“URL File-Access is Disabled”的错误,修改php.ini的allow_url_include为On之后,就好了。但是补丁之前的allow_url_include也是Off,看过补丁代码也没发现跟这个有关的地方,很奇怪……
发现这个补丁在参数超过设置时错误信息并不能显示出来。
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:
发现这个补丁在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:
……
@一寒 Windows下, 可以考虑安装suhosin扩展: http://www.hardened-php.net/suhosin/ 它也有类似的suhosin.post.max_vars的设置
linux的还有办法打补丁重编译,windows下的php5.2.17怎么编译?现在好多加密程序只支持PHP5.2X系列,用不了5.3,而官方又不给5.2.17提供解决办法。强烈建议出一个经验证的完整的windows编译方法
鸟哥,问你个问题:
在网站访问量比较大的时候,网站应用了伪静态和不用伪静态对主机的性能影响的区别有多大?
应用伪静态会多占用服务器的CPU?
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
it is can not make effect even though I patched the php-5.2.10 successfully !
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:
不行挖。。
貌似必须restart 才行啊, reload都不行呢。
cd Php-5.2.17 ;
执行patch -p1 php-5.2.17-max-input-vars.patch
一直在那里卡住!
呃,php 5.3.9 在哪?
弱弱的问一下 如何给线上运行的PHP打path
@板子 不能怨我啊, 这个方法是国外曝出来的…..
鸟哥,这两篇文章一发,大家都不得不升级了
攻击门槛被降低到约等于0了
鸟哥效率啊,造福大众