温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。
在《网站如何屏蔽垃圾蜘蛛爬取》一文中,我们知道针对异常访问可以通过三种方式来屏蔽:① Robots 禁封、② UA 禁封、③ IP 禁封,今天发现还有一种方法叫做 Gzip Bomb(炸弹),一起来看看。
原理
浏览器默认支持 gzip 压缩方法,接收到服务器响应的数据后,会自动进行解压、解析;不论是 Linux 系统还是 Windows 系统,都可以很方便地创建大型空白文件(参见《Windows 及 Linux 下如何通过命令生成任意大小的空文件》),而对空白文件进行压缩又可以实现非常高的压缩比;
因此我们可以创建大型空白文件并压缩放在服务器上,当侦测到异常访问时返回该文件,使对方使用的客户端因解压、解析该文件时占据大量内存,使之系统崩溃,以达到降低服务器安全风险的目的。
步骤
以 Linux Ubuntu 18.04 为例。
创建文件
root@fw:~# cd /var/www/html
root@fw:~# dd if=/dev/zero bs=1M count=1024 | gzip > 1G.gzip
上述示例创建了一个 1G 的空白文件,经过 gzip 压缩后大约 1M 左右。
配置网站
root@fw:~# vim /etc/nginx/sites-available/default
......
server {
listen 80 default_server;
server_name _;
root /var/www/html;
location = / {
index index.html;
}
location / {
try_files $uri /bomb;
}
location = /bomb {
default_type text/html;
add_header Content-Encoding gzip;
gzip off;
root /var/www/html/1G.gzip;
}
.....
}
......
上述示例中:
- 当客户端访问
根目录
或/index.html
时,直接返回 index.html,属于正常访问; - 当访问异常路径或其他文件时,就会返回炸弹 1G.gzip;
- 当访问域名与配置不一致,也会返回炸弹(这里
server_name _
可以匹配所有域名,default_server
表示默认网站);
效果
客户端访问异常路径或其他文件时,Nginx
会返回 1M 大小的炸弹文件,由于无法判断目标文件的 MIME
,就会使用我们定义的 default_type
中声明的 Content-Type:text/html
,再配合 Content-Encoding: gzip
,指导浏览器解开 gzip
,慢慢吃光客户端所有内存,然后一步一步走向死亡的深渊。
局限性
这种方法仅对会对网站内容做解析的客户端有效,对于只取头部信息或者下载的客户端效果不大,因为不会做解析就不会解压,比如 HEAD
请求。
另外如果网站使用了 CDN,而 CDN 又开启了对 text/html
类型进行缓存,那么炸弹貌似也没有多大效果。
参考文章:
1、《How to defend your website with ZIP bombs》
2、《使用 GZip Bomb 对抗站点扫描工具》
3、《学到了,通过User-Agent禁止机器人并返回炸弹》
4、《使用nginx阻止gzip炸弹未经授权访问的积极障碍》
Windows 10Chrome 86.0.4240.198来自 美国 的大神
伤敌一千,自损800
有点,我更喜欢 444
Mac OS X 10_15_7Chrome 90.0.4430.85来自 广东 的大神
境外解析的 CF 节点访问不了了
好的,我来更新一下
Windows 10Chrome 95.0.4638.69来自 河南 的大神
直接返回404或者444或者502/503
可以的,新版 Nginx 甚至支持不发送证书
Windows 10Chrome 96.0.4664.55来自 河南 的大神
!??????新版这么!》
对的,就可以解决证书嗅探问题
Windows 10Chrome 96.0.4664.55来自 河南 的大神
nice,似乎更好玩了 /doge
对呀,玩一下看看