第13章 应用层拒绝服务攻击
DDOS攻击被认为是安全领域中最难解决的问题之一,迄今为止也没有一个完美的解决方案。
13.1 DDOS简介
- Distributed Denial of Service,DDOS。
- DDOS,通过若干网络节点同时发起攻击,以达成规模效应,造成资源过载,导致服务不可用。
- 常见的DDOS攻击有SYN flood、UDP flood、ICMP flood等。
- 其中SYN flood是一种最为经典的DDOS攻击。
- 对抗SYN flood的主要措施有SYN Cookies/SYN Proxy\safereset等算法。
- SYN Cookie的主要思想是为每一个IP地址分配一个“Cookie”,并统计每个IP地址的访问频率。
- 如果短时间收到大量……,则认为受到攻击,之后来自这个IP地址的包将被丢弃。
- 对抗DDOS的网络设备可以串联或并联在网络出口处。
13.2 应用层DDOS
应用层DDOS发生在应用层,TCP三次握手已经完成,连接已经建立,所以发起攻击的IP地址也都是真实的。
13.2.1 CC攻击
- CC攻击
- Challenge Collapasar
- 原理:对一些消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的。
- 在Web应用中,查询数据库、读/写硬盘文件等操作,相对都会消耗比较多的资源。
- 以爬虫类比:应用层DDOS攻击与正常业务的界线比较模糊。
- 应用层DDOS攻击还可以这样完成:
- 在黑客入侵了一个流量很大的网站后,通过篡改页面,将巨大的用户流量分流到目标网站。
- eg. target拒绝服务
- 应用层DDOS攻击是针对服务器性能的一种攻击,许多优化服务器性能的方法,都或多或少地能缓解此种攻击。
- 但很多性能优化的方案并非是为了对抗应用层DDOS攻击而设计的,因此攻击者想要找到一个资源消耗大的页面并不困难。
13.2.2 限制请求频率
- 最常见的针对应用层DDOS攻击的防御措施,是在应用中针对每个“客户端”做一个请求频率的限制。
- 案例代码
- 思路:通过IP地址和Cookie定位一个客户端,如果客户端的请求在一定时间内过于频繁,则对之后来自该客户端的所有请求都重定向到一个出错页面。
- 架构上,这段代码需要放在业务逻辑之前,才能起到保护后端应用的目的。
13.2.3 道高一尺,魔高一丈
- 如何让IP地址发生变化?
- 使用“代理服务器”
- 代理猎手
- AccessDriver
- 使用“代理服务器”
- 如何解决应用层DDOS攻击?
- 应用代码要做好性能优化
- 合理使用memcache
- 及时地释放资源
- 在网络架构上做好优化
- 善于利用负载均衡分流
- 实现一些对抗手段
- 比如限制每个IP地址的请求频率
- 应用代码要做好性能优化
13.3 验证码的那些事儿
- 验证码的破解,除了直接利用图像相关算法识别验证码外,还可以利用Web实现上可能存在的漏洞破解验证码。
- 验证码的验证过程,是比对用户提交的明文和服务器端Session里保存的验证码明文是否一致。
- 漏洞案例
- 验证码消耗掉后SessionID为更新,导致使用原有的SessionID可以一直重复提交同一个验证码。
- 有的验证码实现方式,是提前将所有的验证码图片生成好,以哈希过的字符串作为验证码图片的文件名。使用验证码时,则直接从图片服务器返回已经生成好的验证码,这种设计原本的想法时为了提高性能。
- 破解方式:枚举+遍历,建立验证码到明文之间的一一对应关系,从而形成一张“彩虹表”
- 修补方式:验证码的文件名需要随机化,满足“不可预测性”原则。
13.4 防御应用层DDOS
- 人机识别
- 验证码的核心是识别人与机器。
- 可以让客户端解析一段JavaScript,判断客户端是否是在一个浏览器环境中发起的请求。
- 在Web Server这一层做些防御
- Apache的mod_qos
- Yahoo的专利
13.5 资源耗尽攻击
除了CC攻击外,攻击者还可能利用一些Web Server的漏洞或设计缺陷,直接造成拒绝服务。
- Slowloris攻击
- 此类拒绝服务的本质,实际上是对有限资源的无限制滥用。
- HTTP POST DOS
- 这种攻击的本质也是针对Apache的MaxClients限制的。
- 解决方法:使用Web应用防火墙,或者一个定制的WebServer安全模块。
- 以上两个例子:凡是资源有“限制”的地方,都可能发生资源滥用,从而导致拒绝服务,也就是一种“资源耗尽攻击”。
- Server Limit DOS
- 通过XSS攻击,向客户端写入一个超长的Cookie,客户端发送的HTTP包头过大,服务器返回一个4xx错误,导致客户端在清空Cookie之前,将无法再访问该Cookie所在域的任何页面。
- 解决方法:调整Apache配置参数LimitRequestFieldSize,这个参数设置为0时,对HTTP包头的大小没有限制。
- “拒绝服务攻击”的本质实际上时一种“资源耗尽攻击”,因此再设计系统时,需要考虑到各种可能出现的场景,避免出现“有限资源”被恶意滥用的情况。
13.6 一个正则引发的血案:ReDOS
- ReDOS是一种代码实现上的缺陷。
- 正则表达式是基于NFA(Nonedeterministic Finite Automaton)的,它是一个状态机,每个状态和输入符号都可能有许多不同的下一个状态。正则引擎将遍历所有可能的路径直到最后。
- 这将极大地增加正则引擎解析数据时的消耗。
- 恶意构造输入时,导致整台服务器的性能下降,表现的结果是系统速度很慢,有的进程或服务失去相应,与拒绝服务的后果是一样的。
# 13.7 小结
- 应用层拒绝服务攻击的本质也是对有限资源的无限制滥用所造成的。
- 解决这个问题的核心思路就是限制每个不可信任的资源使用者的配额。