Nginx 针对异常访问返回炸弹(GZip Bomb)以降低服务器安全风险方法

小助手读文章 00:00 / 00:00

温馨提示:
本文所述内容具有依赖性,可能因软硬条件不同而与预期有所差异,故请以实际为准,仅供参考。

在《网站如何屏蔽垃圾蜘蛛爬取》一文中,我们知道针对异常访问可以通过三种方式来屏蔽:① 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炸弹未经授权访问的积极障碍


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 部署教程nginx运维gzipbomb 的文章

 本文最后更新于 2021/04/19 08:40:02,可能因经年累月而与现状有所差异

 引用转载请注明: VirCloud's Blog > 运维 > Nginx 针对异常访问返回炸弹(GZip Bomb)以降低服务器安全风险方法

精选评论

  1. 王生
    王生 回复

    Windows 10Chrome 86.0.4240.198来自 美国 的大神

    伤敌一千,自损800 icon_neutral.gif

  2. vircloud
    vircloud 回复

    Mac OS X 10_15_7Chrome 90.0.4430.85来自 广东 的大神

    境外解析的 CF 节点访问不了了

    1. 欧文斯

      好的,我来更新一下

  3. 提莫酱
    提莫酱 回复

    Windows 10Chrome 95.0.4638.69来自 河南 的大神

    直接返回404或者444或者502/503

    1. 欧文斯

      可以的,新版 Nginx 甚至支持不发送证书

      1. 提莫酱
        提莫酱 回复

        Windows 10Chrome 96.0.4664.55来自 河南 的大神

        !??????新版这么!》

        1. 欧文斯

          对的,就可以解决证书嗅探问题

          1. 提莫酱
            提莫酱 回复

            Windows 10Chrome 96.0.4664.55来自 河南 的大神

            nice,似乎更好玩了 /doge

          2. 欧文斯