念念不忘,必有回响。——《一代宗师》
DDOS简介
- DDOS又称分布式拒绝服务,利用合理的请求造成资源过载,导致服务不可用
- 常见的DDOS攻击:SYN flood、UDP flood、ICMP flood
SYN flood
SYN flood是网络层的DDOS
hacker视角
- 搜集肉鸡:发现用户漏洞->取得用户权限->取得控制权->植入木马->清楚痕迹->留后门->做好攻击准备
- 搜集到足够的肉鸡,构成攻击网络
- 利用僵尸网络,伪造大量的源IP地址,分别向服务器发送大量的SYN包
服务器视角
- 收到肉鸡的SYN包后,要返回SYN/ACK包,但由于IP地址是伪造的,所以不会对服务器的响应做出应答
- 服务器等不到应答,会重试3-5次,并且等待一个SYN Time(30s-2min)
- 服务器的资源被大量占用,无法对正常的请求作出回应
如何防御SYN flood
- 主要措施有SYN Cookie、SYN Proxy、safereset等算法
- SYN Cookie:为每一个IP分配一个“Cookie”,来统计每个IP地址的访问频率,如果频率过高,就会认为收到了攻击,之后来此IP的包将被丢弃
应用层DDOS
- 因为发生在应用层,所以TCP3次握手已经完成,IP也是真实的
- 本质:对有限资源的无限制滥用
- 解决问题的核心思想:限制每个不可信任的资源使用者的配额
CC攻击
- CC全称:Challenge Collapasar
- 原理:对一些消耗资源较大的页面不断发起正常的请求,以达到消耗服务端资源的目的
- 在web应用中,查询数据库、读写硬盘文件等操作,相对都会消耗比较多的资源
- spider爬死小网站的情况和DDOS很像
DDOS攻击还可以这样实现
- hacker侵入一个流量很大的网站
- 在这个网站插入代码
1
<iframe src="http://target" height=0 width=0 ></frame>
- 所有访问该页面的用户,都会对target发一次GET请求,导致target拒绝服务
服务器的应对措施
- 考虑把使用频率高的数据放在memcache中,相对于查询数据库,查询memcache所用时间可以忽略不计,但其实这种优化的初衷并不是为了防止应用层的DDOS,因为如果肉鸡请求memcache里没有的数据,还是要查询数据库
- 最常见的应对应用程DDOS的防御措施:在应用中针对每个“客户端”做一个请求频率的限制。例如,通过IP和值和Cookie定位一个客户端,如果客户端在一定时间内请求过于频繁,那之后来自此客户端的请求会重定向到一个出错的页面
hacker的应对措施
- 在服务器的应对措施中,关键是通过IP和Cookie定位一个客户端,但IP是可变的,Cookie也是可以清空的
- hacker在进行应用层DDOS时,会大量使用代理服务器或者傀儡机来隐藏自己的真实IP,hacker用这种方式不断改变自己的IP
所以如何处理应用层DDOS呢?
- 应用代码要做好性能优化(例如memcache、即使释放资源、即使断开数据库连接等)
- 在网络框架上做好优化(例如利用负载均衡分流,避免用户的流量集中在一个服务器上;利用CDN和镜像站点的分流作用,缓解主站的压力)
- 实现一些对抗手段(例如限制IP的请求频率)
验证码
- 验证码是用来区分人和计算机的,引入验证码可以有效阻止自动化的重放行为
- 验证码的验证过程:对比用户提供的验证码明文和服务端Session里保存的验证码明文
- 也有很多破解验证码的技术:成熟的图像处理技术
其他防御措施
- 验证码会影响用户体验,不可能经常使用
- 验证码的防御思路是识别人和电脑
识别人和电脑
- 让客户端解析一段Javascript,看是否可以有正确的运行结果。
- 因为大部分的自动化脚本都是直接构造HTTP包,并非是在一个浏览器的环境中发起请求
在web server层做些防御
- 这样的话请求就到不了服务器的程序里面
- 例如,在Apache配置文件中,调小Timeout、KeepAliveTimeout,增加MaxClients等。这些设定也会影响正常的用户,所以要视情况而定
- Apache的”mod_qos”模型,本质也是相知IP的访问频率。如果hacker使用代理服务器怎么办呢?
Yahoo的思路
- 因为应用层的IP都是真实的,所以hacker手里的IP也不会无限制增长,例如有1000个,如果发起了10000次请求,每个IP平均就有10次请求,如果攻击持续下去,就是在这1000个IP中做轮询,单个IP的频率也会上去
- Yahoo设计了一个算法,根据IP、Cookie等信息,计算客户端的请求频率,并进行拦截
- Yahoo的这套系统其实也是作为一个web server模块在开发,只不过它会有一个专门计算的master服务器,然后把结果同步到web server上
资源耗尽攻击
- hacker还没有利用一些web server的漏洞或设计缺陷,直接进行DDOS攻击
Slowloris攻击
- 原理:用很多肉鸡以极低的速度向服务器发送HTTP请求,并保持这些连接不会断开
- 因为web server并发的连接数是有限的,所以如果所有连接都被恶意占用,那么就无法接受新的请求,导致拒绝服务
- 如何保证每一个连接都不断开呢?构造一个畸形的HTTP请求,例如在HTTP请求头中包括
Content-Length: 42\r\n
,在正常的HTTP包头中,是以2个CLRF表示HTTP Headers部分的结束,但现在web server只收到了一个\r\n
,所以web server会认为没有结束,会保持连接不释放。然后hacker在发送HTTP头,保持住连接即可,例如发送X-a: b\r\n
HTTP POST DOS
- 原理:用很多肉鸡发送HTTP POST包,包里面把Content-Length设置得很大,然后以极低的速度法宝,比如10s-100s一个字节,用来保证连接不断开。从而占用了web server所有可能的连接
- 和Slowloris一样,都是针对Apache的MaxClients的限制
- 要解决这样的问题,可以使用web应用防火墙,或者定制一个web server安全模版
- 可以举一反三,凡是资源有限的地方,都可能发生资源滥用而导致拒绝服务
Server Limit DOS
- 以Apache举例,默认限制HTTP包头的长度为8192字节,如果头部太长,Apache就会返回一个4xx错误
- hacker如果通过XSS向用户写入一个超长的Cookie,那么在Cookie请空之前,用户就无法访问该Cookie所载的域的任何页面。因为Cookie也是作为head来发送的
- 解决方法:调整Apache参数LimitRequestFieldSize为0,那么head就没有长度限制了
ReDOS
hacker通过在有“坏”的正则表达式的地方,恶意构造语句,让表达式去匹配,以此增加正则引擎(DFA或者NFA)的消耗,从而消耗大量服务器系统资源,使得服务器性能下降,最终服务器会速度很慢甚至失去响应
正则表达式在计算机中的运算是很愚蠢的
例如,当你需要用x*y表达式对字符串xxxxxxxxxxxxxx进行匹配时,显然是无法匹配的,但在计算机中,会进行遍历匹配:
1 | i = 1 |
本文作者:
Bano
本文链接: https://bano247.com/2021/11/06/拒绝服务攻击/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://bano247.com/2021/11/06/拒绝服务攻击/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!