编辑推荐: |
本文主要讲解了HTTP协议基础,HTTP GET Flood攻击与防御,包括:302重定向认证,验证码认证,URI动态指纹学习,URI行为监测等相关内容。
本文来自于华为企业互动社区,由火龙果软件Anna编辑、推荐。
|
|
看过了我们上一篇解密的搜狐视频攻击事件,大家一定心有惶惶,上网看视频本属于娱乐消遣活动,居然会触发DDoS攻击,而每一个观看视频的人在不知不觉中就变成了攻击者的帮凶。可见,网络江湖异常险恶,攻防之间此消彼长,了解攻击才能更好的防御,这也是华安写作解密系列的初衷。
在该事件中,攻击者利用搜狐视频网站的XSS漏洞(Cross Site Scripting,跨站脚本攻击),劫持视频观看者的流量,向受害者发起海量的HTTP请求。最终,数以千万计的HTTP请求形成了一次规模巨大的DDoS攻击,使受害者无法提供正常的服务。
攻击产生的源头和攻击方式都与HTTP协议有关。HTTP协议是当前使用最广泛的协议,我们浏览网页、看新闻查资料的背后都是HTTP协议在默默工作。上一篇我们已经对HTTP协议进行了简单的介绍,本篇我们深入剖析基于HTTP协议的DDoS攻击方式和防御原理,首先来了解HTTP协议的基础知识。
0x01 HTTP协议基础
HTTP是一种请求/响应式的协议,客户端向服务器发起请求,服务器收到请求后,向客户端返回响应信息。HTTP报文分为请求报文和响应报文,HTTP请求报文的格式如下所示:
下面结合HTTP请求报文的抓包信息来学习各个字段的含义。
HTTP请求报文由请求行、请求头部、空行和请求数据四个部分组成,各部分的具体解释如下:
请求行
请求行由请求方法字段、URL字段和协议版本字段组成,这三个字段之间使用空格分隔,最后由回车符\r+换行符\n结束。例如,GET
/index.html HTTP/1.1\r\n。这里顺便提一下URL和URI,URL全称是Uniform
Resource Locator(统一资源定位),URI全称是Uniform Resource Indentifier(统一资源标识),一般情况下我们看到浏览器处理的是URL,而在HTTP协议规范中会使用更通用的概念URI作为资源标识符。
请求行中值得关注的就是请求方法字段,常用的请求方法有GET,表示客户端从服务器获取数据,即要求服务器将URL定位的资源放在响应报文中,返回给客户端;POST,表示客户端向服务器提交数据,由服务器进行处理,如表单提交、账号登录等操作使用的就是POST请求方法。
GET和POST这两种请求方法经常会被用来进行DDoS攻击,例如在搜狐视频攻击事件中,广大“帮凶”使用的就是GET请求方法,向受害者发起海量的HTTP请求。除了这两种请求方法,HTTP协议还支持HEAD、PUT、OPTIONS、DELETE等请求方法,此处不再赘述。
请求头部
请求头部由“关键字/值”对组成,每行一对,关键字和值之间使用英文冒号“:”分隔,最后由回车符+换行符结束。请求头部中可以包含多个类型的关键字,这些关键字用于通知服务器有关于客户端请求的信息。
例如,User-Agent表示客户端告知服务器自己的浏览器信息;Host表示接受请求的服务器地址;Content-Length表示客户端要向服务器提交的数据长度;Cookie表示客户端向服务器发送自己的Cookie信息等等。
空行
请求头部的后面会有一个空行,里面包括回车符和换行符,表示请求头部结束,接下来为请求数据部分。这一行必不可少,因为它用来告知服务器以后不再有请求头,如果服务器没有收到这个空行则会一直保持连接。后面我们也会讲到攻击者伪造不包含空行的HTTP请求报文来消耗服务器资源,进行DDoS攻击的情况。
请求数据
请求数据是HTTP报文的载荷,即HTTP报文要传输的内容。请求数据部分是可选的,请求方法是GET时,HTTP报文中就不包含请求数据;请求方法是POST时,HTTP报文中包含请求数据。
了解HTTP请求报文的格式后,接下来我们看一看HTTP响应报文的格式:
结合HTTP响应报文的抓包信息来学习各个字段的含义。
HTTP响应报文由状态行、响应头部、空行和响应数据四个部分组成,各部分的具体解释如下:
状态行
状态行由协议版本字段、状态码字段和状态码描述字段组成,这三个字段之间使用空格分隔,最后由回车符+换行符结束。例如,HTTP/1.1
200 OK\r\n。
状态行中值得关注的是状态码字段,常用的状态码有200,表示服务器响应成功;302,表示请求方法为GET时,服务器告知客户端需要重定向到新的URL;307表示请求方法为POST时,服务器告知客户端需要重定向到新的URL;404,表示服务器无法找到所请求URL对应的资源;408,表示请求超时,客户端需要重新提交请求。
响应头部
响应头部与请求头部类似,也是由“关键字/值”对组成,每行一对,关键字和值之间使用英文冒号“:”分隔,最后由回车符+换行符结束。响应头部中可以包含多个类型的关键字,用来通知客户端有关于服务器响应的信息。
空行
响应头部的后面也会有一个空行,里面包括回车符和换行符,表示响应头部结束,接下来为响应数据部分。
响应数据
响应数据是服务器返回给客户端的信息,上面抓包示意图中显示的响应数据是一个HTML网页,也可以是图片、视频等信息。
上面介绍了HTTP报文的格式,并对其中的关键字段进行了解释,下面再来了解一下HTTP协议的基本交互流程。我们提到过,HTTP是一种请求/响应式的协议,客户端与服务器建立TCP三次握手后,客户端向服务器发出HTTP请求,服务器向客户端返回HTTP响应,在一来一回之间完成了数据的传输,如下图所示。
学习完前面的内容,相信大家对HTTP协议有了更进一步的认识。目前Internet上运行着多种基于HTTP协议的Web信息系统,这些Web信息系统存在的安全问题必须重视。像搜狐视频攻击事件中的XSS攻击,以及SQL注入、CSRF(Cross-Site
Request Forgery,跨站请求伪造)等攻击方式都在危害着Web信息系统的安全,甚至会触发DDoS攻击。由Web信息系统的一个安全漏洞演化为大规模的DDoS流量型攻击,其中的安全问题值得深思。
回到DDoS攻击上来,针对HTTP协议的DDoS攻击主要有利用GET和POST请求方法的Flood类攻击,以及利用HTTP协议实现机制的慢速类攻击,我们先来看HTTP
GET Flood攻击。
0x02 HTTP GET Flood攻击与防御
HTTP GET Flood攻击的原理很简单,攻击者利用攻击工具或者操纵僵尸主机,向目标服务器发起大量的HTTP
GET报文,请求服务器上涉及数据库操作的URI或其它消耗系统资源的URI,造成服务器资源耗尽,无法响应正常请求。
华为Anti-DDoS解决方案防御HTTP GET Flood攻击的常用手段是源认证,这种防御方式适用于客户端为浏览器的场景,因为浏览器支持完整的HTTP协议栈,可以正常回应Anti-DDoS系统发出的探测报文。源认证包括两种方式,最基本的方式是302重定向认证。
302重定向认证
302重定向认证的原理是Anti-DDoS系统代替服务器向客户端响应302状态码(针对GET请求方法的重定向),告知客户端需要重定向到新的URL,以此来验证客户端的真实性。真实客户端的浏览器可以自动完成重定向过程,通过认证;而虚假源或者一般的攻击工具没有实现完整的HTTP协议栈,不支持自动重定向,无法通过认证。
1、当连续一段时间内去往目标Web服务器的HTTP GET请求报文超过告警阈值后,Anti-DDoS系统启动源认证机制。源认证机制启动后,Anti-DDoS系统将会代替服务器与客户端建立TCP三次握手。
2、Anti-DDoS系统拦截HTTP请求,代替Web服务器回应302状态码,将客户端的访问重定向到一个新的URI。
3、如果这个源是虚假源,或者不支持完整HTTP协议栈的攻击工具,不会向新的URI发起请求。
4、如果这个源是真实客户端,则会向新的URI发起请求。Anti-DDoS系统收到请求后,将该客户端的源IP地址加入白名单。然后Anti-DDoS系统会再次回应302状态码,将客户端的访问重定向到一开始访问的URI。
5、后续这个客户端发出的HTTP请求报文命中白名单直接通过。
我们结合一组抓包信息来看一下交互报文的具体情况。
1、Anti-DDoS系统代替Web服务器与客户端建立TCP三次握手,然后客户端发起访问请求。
2、Anti-DDoS系统代替Web服务器回应302状态码,希望客户端访问一个新的URI地址“http://156.*.*.*/?dbiekfcjekngdjec”,然后双方关闭连接。
3、真实客户端会再次与Anti-DDoS系统建立TCP三次握手,并向新的URI“http://156.*.*.*/?dbiekfcjekngdjec”发起请求。
4、Anti-DDoS系统收到请求后,判定该客户端为真实客户端,将其IP地址加入白名单。同时Anti-DDoS系统会再次回应302状态码,将客户端的访问重定向到一开始访问的URI,然后双方关闭连接。后面该客户端发出的HTTP请求报文就可以命中白名单直接通过了。
除了302状态码重定向方式,还有一种META Refresh重定向方式。META Refresh方式是通过修改HTML页面来实现重定向,具有局限性;而302状态码方式是利用HTTP协议规范来实现重定向,适用性更好。所以302状态码方式是目前使用比较广泛的重定向方式。
另外还有一种情况,网络中存在HTTP代理服务器时,只要代理服务器IP地址通过源认证加入白名单,僵尸主机就可以利用代理服务器IP地址绕开源认证,导致防御失效。针对这种情况,Anti-DDoS系统提供了代理检测功能。开启该功能后,Anti-DDoS系统会检测HTTP请求是不是通过代理服务器发出的。如果是,Anti-DDoS系统会从HTTP报文中获取请求者的实际IP地址进行源认证,通过认证后才加入白名单。
302重定向认证利用HTTP响应报文中的302状态码来实现对客户端的源认证功能,但是如果攻击工具实现了完整的HTTP协议栈,或者像搜狐视频攻击事件中攻击源都是真实的浏览器这种情况,会导致302重定向认证方式失效。此时,可以使用源认证中的增强方式,即验证码认证。
验证码认证
验证码认证的原理是Anti-DDoS系统要求客户端输入验证码,以此来判断请求是否由真实的用户发起,而不是由攻击工具或僵尸主机发起。因为攻击工具或僵尸主机无法自动响应随机变化的验证码,所以能够有效的防御攻击。
1、当连续一段时间内去往目标Web服务器的HTTP GET请求报文超过告警阈值后,Anti-DDoS系统启动源认证机制。源认证机制启动后,Anti-DDoS系统将会代替服务器与客户端建立TCP三次握手。
2、Anti-DDoS系统拦截HTTP请求,向客户端返回验证码页面,要求客户端输入验证码。
3、如果这个源是攻击工具或僵尸主机,不会输入验证码。
4、如果这个源是真实客户端,则会输入验证码并通过认证,Anti-DDoS系统将该客户端的源IP地址加入白名单。然后Anti-DDoS系统会请客户端继续访问一开始的URI。
5、后续这个客户端发出的HTTP请求报文命中白名单直接通过。
下面给出了Anti-DDoS系统向客户端返回的验证码页面的报文,以及对应的实际页面:
验证码认证方式与302认证方式相比,防御效果更好,但是由于需要人机交互输入验证码,用户体验稍差一些。在实际使用验证码认证方式时,可以增加源IP统计的环节,即Anti-DDoS系统先基于目的IP进行统计,当去往某个目的IP的HTTP请求超过阈值时,启动基于源IP的统计。当来自某个源的HTTP请求也超过阈值时,才启动验证码认证机制。这样就会精确控制需要进行验证码认证的源IP范围,避免大范围的源IP都要输入验证码。
302重定向认证和验证码认证这两种源认证方式是防御HTTP GET Flood攻击的有效手段,但是源认证方式也存在一定的局限,比如机顶盒视频点播、特定移动网络等场景中,无法对客户端使用源认证方式。为此,Anti-DDoS系统还支持URI动态指纹学习和URI行为监测防御方式,作为源认证方式的补充,满足不同场景的需求。
URI动态指纹学习
URI动态指纹学习方式适用于攻击源访问的URI比较固定的情况,因为要形成攻击效果,攻击者一般都会以容易消耗系统资源的URI作为攻击目标。一个攻击源会发出多个针对该URI的请求,最终呈现为该源对特定的URI发送大量的请求报文。
基于这个原理,Anti-DDoS系统对客户端所访问的URI进行指纹学习,找到攻击目标URI指纹。在一定的周期内,当同一个源发出的包含同一指纹的请求超过设置的阈值时,就将该源加入黑名单。
URI行为监测
URI行为监测防御方式要先设置需要重点监测的URI,可以将消耗资源多、容易受到攻击的URI加入到“重点监测URI”列表中。URI行为监测防御方式通过判断两个比例是否超过阈值来确定攻击源。
首先,在特定时间内对某个目的服务器的所有访问中,对重点监测URI的访问数与总访问数的比例超过设置的阈值时,Anti-DDoS系统启动针对源的URI检测。当这个源对某个重点检测URI的访问数与总访问数的比例超过设置的阈值时,就将该源加入黑名单。
HTTP GET Flood攻击的原理和防御方式介绍完毕,下一篇我们将介绍利用POST请求方法的HTTP
POST Flood攻击以及HTTP慢速攻击,请大家继续关注。
|