首页 > 代码库 > 应用层拒绝服务攻击
应用层拒绝服务攻击
DOS:Denial Of Service
DDOS:Distributed Denial Of Service(利用僵尸网络——由“肉鸡”组成,发起 DoS 攻击)
常见的 DDOS 攻击
SYN flood(经典,利用了 TCP 协议“三次握手”设计中的缺陷),UDP flood,ICMP flood 等。
SYN flood
在攻击时首先伪造大量的源 IP,分别向服务器端发送大量的 SYN 包。此时服务器端返回 SYN/ACK 包,由于源地址是伪造的,SYN/ACK 包不会被应答。服务器端会重试 3~5次并等待一个 SYN Time(30~120秒),如果超时则丢弃连接。防御方式:SYN Cookie(为每个 IP 地址分配一个 Cookie,并统计每个 IP 的访问频率。如果在段时间内收到大量的来自同一个 IP 的数据包,则认为受到攻击,之后来自这个 IP 地址的包将被丢弃)、SYN Proxy、safereset 等算法。
在很多对抗 DDOS 的产品中,一般会综合使用各种算法,结合一些 DDOS 攻击的特征,对流量进行清洗。对抗 DDOS 的网络设备可以串联或者并联在网络出口处。
应用层 DDOS
不同于网络层 DDOS,应用层 DDOS 已经完成了 TCP 的三次握手,连接已经建立,所以发起攻击的 IP 地址都是真实的。当前的商业 Anti-DDOS 设备只在对抗网络层 DDOS 时效果较好,而对应用层 DDOS 攻击却缺乏有效的作用。
CC 攻击:Challenge Collapasar(Collapasar 是绿盟的反 DDOS 设备,能有效地清洗 SYN Flood 等有害流量),CC 攻击的原理就是对一些消耗资源(查询数据库、读写硬盘文件等)较大的应用页面不断发起正常的请求,以此达到消耗服务资源的目的。
应用层 DDOS 攻击的一种实现方式:在黑客入侵了一个流量很大的网站后,通过篡改页面,将巨大的用户流量分流到目标网站。比如在大流量网站上插入如下代码:
<iframe src="http://targetSite" height=0 width=0></iframe>
一些优化服务器性能的方法能够缓解应用层 DDOS 攻击(提升服务能力、资源容量)。常用的防御措施是在应用中限制每个“客户端” 做请求频率的限制(基于 IP、Cookie 确定客户端,攻击者可以使用代理服务器发起攻击突破该限制)。
防御应用层 DDOS
人机识别(验证码)是应用层防御 DDOS 的好物,只是会影响用户的体验。
在 Apache 的配置中,有些参数可以缓解 DDOS,比如调小 Timeout、KeepAlive Timeout 值,增加 MaxClients 值(可能影响正常业务)。Apache 提供的模块接口可以扩展 Apache、设计防御措施,比如 mod_qos(限制单个 IP 地址的访问频率),mod_evasive。
Yahoo 的 Detecting system abuse。
资源耗尽攻击
Slowloris 攻击:以极低的速度往服务器发送 HTTP 请求。由于 Web Server 对于并发的连接数都有一定的上限,因此若恶意地占用这些连接不释放,那么 Web Server 的所有连接都将被恶意连接占用,从而无法接受新的请求,导致拒绝服务。
HTTP POST DOS:在发送 HTTP POST 包时,指定一个非常大的 Content-Length 值,然后以很低的速度发包,比如 10~100s 发送一个字节,保持住这个连接不断开。当客户端连接数多了以后,占用住了 Web Server 的所有可用连接,从而导致 DOS。
Server Limit DOS:Web Server 对 HTTP 包头的长度有限制,如果客户端发送的 HTTP 包头超过限制,服务器将返回 4xx 错误。攻击者可以通过 XSS 往客户端写入一个超长的 Cookie,则用户在清空 Cookie 前将无法再访问该 Cookie 所在域的任何页面(Cookie 是存放在 HTTP 包头里发送的)。防御:可以将 Apache 的配置参数 LimitRequestFieldSize 设置为 0 (大小不限制)。
正则表达式引发的 DOS 攻击——ReDOS
正则表达式是基于 NFA 的一个状态机,每个状态和输入符号都可能有许多不同的下一个状态。正则解析引擎将遍历所有可能的路径直到最后。由于每个状态都有若干个“下一个状态”,因此决策算法将逐个尝试每种情况,直到匹配到一个路径。如果正则表达式编写不当,将引起解析过程变复杂,消耗计算资源。
存在 ReDOS 的正则表达式:
a++ (a+)+
charclass+ ([a-zA-Z]+)*
a_or_aa (a|aa)+
a_or_a (a|a?)+
a_11 (.*a){11}
a_65 (.*a){65}
Friedl ([^\\"‘]+)*
上述表达式的变体:^expr$
OWASP ^[a-zA-Z]+(([‘\,\.\-][a-zA-Z ])?[a-zA-Z]*)*$
DataVault ^\[(,.*)*\]$
EntLib ^([^"]+)(?:\\([^"]+))*$
JavaClassname ^(([a-z])+.)+[A-Z]([a-z])+$
Cox_10 a?a?a?a?a?a?a?a?a?a?aaaaaaaaaa
Cox_25 a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaaaa
ReDOS 的测试用例
a_12X aaaaaaaaaaaaX
a_18X a_33X a_49X
Cox_10 aaaaaaaaaa
Cox_20 Cox25 Cox34
JavaClassname aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
EmailValidation a@aaaaaaaaaaaaaaaaaaaaaaaaaaaaa!
EmailValidation a@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaX
invalid_Unicode (.+)+\u0001
DataVault_Dos [,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
EntLib_DoS \\\\\\\\\\\\\\\\\\\\\\\\\\"
EntLib_DoSX \\\\\\\\\\\\\\\\\\\\\\\\\\"X
应用层拒绝服务攻击