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

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

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

    1. 欧文斯
      欧文斯 回复

      Mac OS X 10_15_6Safari 605.1.15来自 福建 的大神

      有点,我更喜欢 444 icon_mrgreen.gif

  2. vircloud
    vircloud 回复

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

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

    1. 欧文斯
      欧文斯 回复

      Windows 10Chrome 89.0.4389.128来自 福建 的大神

      好的,我来更新一下

  3. 提莫酱
    提莫酱 回复

    Windows 10Chrome 95.0.4638.69来自 河南 的大神

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

    1. 欧文斯
      欧文斯 回复

      Windows 10Chrome 95.0.4638.54来自 福建 的大神

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

      1. 提莫酱
        提莫酱 回复

        Windows 10Chrome 96.0.4664.55来自 河南 的大神

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

        1. 欧文斯
          欧文斯 回复

          Windows 10Chrome 95.0.4638.54来自 福建 的大神

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

          1. 提莫酱
            提莫酱 回复

            Windows 10Chrome 96.0.4664.55来自 河南 的大神

            nice,似乎更好玩了 /doge

          2. 欧文斯
            欧文斯 回复

            Windows 10Chrome 95.0.4638.54来自 福建 的大神

            对呀,玩一下看看