[web安全] 应用层拒绝服务攻击

DDOS又称为分布式拒绝服务,全称是Distributed Denial of Service。DDOS本是利用合理的请求造成资源过载,导致服务不可用。

分布式拒绝服务攻击,将正常请求放大了若干倍,通过若干网络节点同时发起攻击,以达成规模效应。这些网络节点往往是黑客们所控制的“肉鸡”,数量达到一定规模后,就形成了一个“僵尸网络”。

常见的DDOS攻击有SYN flood、UDP flood、ICMP flood等,这些又称为网络层DDoS。
SYN Flood攻击就是第三次握手的ACK报文不发送给服务器端,使得服务器端重试3~5次并且等待一个SYN TIME,无暇理睬正常的连接请求。
对抗SYN Flood的主要措施SYN Cookie/SYN Proxy、safereset等算法。SYN Cookie的主要思想是为每一个IP地址分配一个“Cookie”,并统计每个IP地址的访问频率。如果在短时间内受到大量的来自同一个IP地址的数据包,则认为受到攻击,之后来自这个IP地址的包将被丢弃。

一、应用层DDOS
1.CC攻击
原理:对一些消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务器端资源的目的。在Web应用中,查询数据库、读/写硬盘文件等操作,相对都会消耗比较多的资源。
应对方法:将使用频率高的数据放在memcache中,相对于查询数据库所消耗的资源来说,查询memcache所消耗的资源可以忽略不计。
2.限制请求频率
最常见的针对应用层DDOS攻击的防御措施,是在应用中针对每个“客户端”做一个请求频率的限制。

二、验证码
如果忽略对用户体验的影响,那么引入验证码这一手段能够有效地阻止自动化的重放行为。

三、防御应用层DDOS
思路1:识别人与机器
1.服务器端应用可以判断HTTP头中的User-Agent字段来识别客户端,但从安全性来看这种方法不可靠。
2.让客户端解析一段JavaScript,并给出正确的运行结果,由此可以判断出客户端到底是不是浏览器。类似的,发送一个flash让客户端解析,也可以起到同样的作用。但有的自动化脚本是内嵌在浏览器中的“内挂”,就无法检测出来了。

思路2:在web server中做防御(好处是请求尚未到达后端的应用程序里)
1.Apache的配置文件,调小Timeout、KeepAliveTimeout值,增加MaxClients值。
2.Apache的扩展模块,“mod_qos”是Apache的一个Module,可以帮助缓解应用层DDOS攻击,思路是限制单个IP地址的访问频率。(mod_evasive也有类似效果)
3.Yahoo,根据IP地址和Cookie等信息,可以计算客户端的请求频率并进行拦截。Yahoo设计的这套系统也是为Web Server开发的一个模块,但在整体架构上会有一台master服务器集中计算所有IP地址的请求频率,并同步策略到每台WebServer上。

四、资源耗尽攻击
1.Slowloris攻击
以极低的速度往服务器发送HTTP请求。由于Web Server对于并发的连接数都有一定的上限,因此若是恶意地占用住这些连接不放,那么Web Server的所有链接都将被恶意连接占用,从而无法接受新的请求,导致拒绝服务。
具体方法是:正常的HTTP请求头部分是以\r\n\r\n作为结束的,这里会仅用一个\r\n作为结束,此时Web Server会认为Headers部分还没有结束,因此会保持此连接不放,继续等待完整的请求,此时客户端再发送任意HTTP头,保持住连接即可。
此类拒绝服务攻击的本质,实际上是对有限资源的无限制滥用。

2.HTTP POST DOS
类似于Slowloris
原理是:发送HTTP POST包时,指定一个非常大的Content-Length值,然后以很低的速度发包,比如10~100s发一个字节,保持住这个连接不断开。

3.Server Limit DOS
由Cookie造成的拒绝服务攻击。
Web Server对HTTP包头都有长度限制,以Apache为例,默认是8192字节,超过这个大小服务器就会返回一个4xx错误。
攻击者可以通过XSS攻击,恶意地往客户端写入一个超长的Cookie,则该客户端在清空Cookie之前,将无法再访问该Cookie所在域的任何页面。
要解决此问题,需要调整Apache配置参数LimitRequestFieldSize,这个参数设置为0时,对HTTP包头的大小没有限制。

五、ReDOS
正则表达式造成的拒绝服务
例如有正则表达式:^(a+)+$
当输入为aaaaX,则只有16条可能的路径。当输入aaaaaaaaaaaaaaaaX就变成了65535条可能的路径。此后每增加一个“a”,路径的数量都会翻倍。

这极大地增加了正则引擎解析数据时的消耗。当用户恶意构造输入时,这些有缺陷的正则表达式就会消耗大量的系统资源(比如CPU和内存),从而导致整台服务器的性能下降,表现的结果是系统速度很慢,有的进程或服务失去响应,与拒绝服务的后果是一样的。

备注:上文提到的参数所在位置
Timeout:设置如果多少秒后没有收到或者送出任何数据就切断连接。
KeepAliveTimeout:在使用保持连接功能时,两个相邻的连接时间间隔超过多少秒后就切断连接。
MaxClients:服务器最多可以开启的进程数量,或者说是最大的并发客户连接数。
DEFAULT_LIMIT_REQUEST_FIELDSIZE:限制客户端发送的请求头的字节数。

以现在机器为例,apache配置信息所在的路径为C:\wamp\bin\apache\Apache2.2.21\conf
如果调节Timeout、KeepAliveTimeout值,需要先将httpd.conf中Include conf/extra/httpd-default.conf前面的注释符#删掉。
随后打开C:\wamp\bin\apache\Apache2.2.21\conf\extra\httpd-default.conf就可以看到
[web安全] 应用层拒绝服务攻击_第1张图片
如果调节MaxClients值,需要先将httpd.conf中Include conf/extra/httpd-mpm.conf前面的注释符#删掉
随后打开C:\wamp\bin\apache\Apache2.2.21\conf\extra\httpd-mpm.conf就可以看到
[web安全] 应用层拒绝服务攻击_第2张图片
如果要调节LimitRequestFieldSize值,可以打开C:\wamp\bin\apache\Apache2.2.21\include\httpd.h文件
找到参数DEFAULT_LIMIT_REQUEST_FIELDSIZE来设置
[web安全] 应用层拒绝服务攻击_第3张图片

你可能感兴趣的:(web安全)