网站被恶意扫描时的反击魔法之一:用gzip压缩炸弹给恶意请求埋地雷

最近查看网站访问日志,发现有不少恶意扫描和采集本站的请求,虽然被我的防护规则阻挡了,但看着这些源源不断的恶意扫描器的请求,光抵抗不反击,心里头还是有火的。我们的伟大领袖说过:打得一拳开,免得百拳来。为了贯彻领袖的指导思想,决定进行适当的反击还是需要的。冷静下来,搞了一个用魔法打败魔法的方法:用gzip压缩炸弹给恶意请求埋地雷

一、先来说说文件压缩炸弹

文件压缩炸弹其实十几年前我就遇到过,那时还是一脸懵圈的时候,只知道某些特殊的压缩包解压后的文件大小是个越级恐怖的大,才知道有个东西叫文件压缩炸弹,是通过打包压缩一些非常多的空文件或小文件,然后在解压时释放出海量的小文件,并大量占用磁盘空间。

 

二、再来说说gzip文件的特点

其它场景不说,只在浏览器请求时(也包含网络爬虫等类似场景下),服务端是可以发送压缩后的gzip文件,浏览器拿到gzip文件后会进行解压处理。因此,借用此机制,就可以发挥一些想象空间了。

 

三、linux中的dd命令

在 Unix 和 Linux 系统中,dd 是一个功能强大的命令行工具,可以进行低级别的数据复制、创建磁盘镜像、备份磁盘等任务。这里也列一下 dd 命令的常见用法和选项:

基本语法:dd if=<输入文件> of=<输出文件> [其他选项]

常用选项
if=<文件>:指定输入文件,默认为标准输入(stdin)。
of=<文件>:指定输出文件,默认为标准输出(stdout)。
bs=<字节数>:指定读写操作的字节数,即块大小(block size)。
count=<块数>:指定要复制的块数。
status=<级别>:显示命令的状态信息,level 可以是 none、noxfer 或 progress。

示例:

4MB 的块大小复制 inputfile 到 outputfile:dd if=inputfile of=outputfile bs=4M
‌创建磁盘镜像‌,将 /dev/sda 整个磁盘的内容复制到 SimonSu.img 文件中: dd if=/dev/sda of=SimonSu.img bs=4M
‌从镜像恢复‌,把 SimonSu.img 的内容写回到 /dev/sda 磁盘中:dd if=SimonSu_cn.img of=/dev/sda bs=4M
‌创建一个固定大小的文件‌,创建一个大小为 100MB 的文件 simonsu,内容全部为零:dd if=/dev/zero of=simonsu bs=1M count=100
‌数据备份到网络‌,把本地磁盘 /dev/sda 的内容通过 SSH 复制到远程主机上的 SimonSu.img 文件中:dd if=/dev/sda | ssh user@remotehost 'dd of=SimonSu_cn.img bs=4M'
‌显示进度‌,加上参数status=progress这将显示复制过程中的进度信息: dd if=/dev/sda of=SimonSu.img bs=4M status=progress
注意事项:

dd 命令非常强大,但也非常危险,如果不小心使用可能会导致数据丢失或覆盖。在执行涉及磁盘的操作时,一定要确认目标设备和文件路径,避免误操作。可以先使用 lsblk 或 fdisk -l 等命令查看磁盘设备信息,确保选择正确的设备。通过掌握 dd 命令的这些基本用法和选项,你可以更灵活地进行数据复制、备份和恢复等操作。

 

四、回到本往篇主题,如何在网站被恶意扫描时,用魔法打败魔法。方法就是给恶意扫描器进行埋地雷:

4.1、生成一个超级大的gzip文件,可参考上面的示例生成。如生成了一个1M大小的SimonsSu.cn_backup.gzip的,解压后为100G的gzip文件;

4.2、在系统目录下新建一个PHP文件,如bomp_no_open.php,内容为如下。

header('Content-Encoding: gzip');//设置文件头
echo file_get_contents('SimonsSu_backup.gzip');//读取刚才生成的GZIP文件,这里要注意目录是否同一级,若不是,指定目录

4.3、在Nginx的对应站点配置中,可以添加访问请求的http_user_agent中包含恶意标识的(并非一定要用user aget,用找到恶意IP或其它标识也一样效果,只要相应添加就行了)

location / {
#UA BOMB
if ($http_user_agent ~* "(恶意user-agent1|恶意user-agent2)") {
rewrite ^/.*  /bomp_no_open.php last;
}
}

此时恶意的扫描或者请求,就会重定向到这个gzip包,然后就解这个gzip的包为100G的数据,基本就能干崩溃扫描器的请求。如果觉得100G不够大,可以生成几个T的gzip也行~~~

当然了,以上思路也不全是我的想法,也根据网上的一些方式进行完善调整的。

 

五、我为何称这个方法为埋地雷呢。因为炸弹是主动触发的,而我这个用gzip压缩成小包,释放大包的方法是恶意攻击我时,才会被动触发的。

同时,这个方法能不用就不要用,避免误伤。误伤也没事哈~~~~~~最多浏览器(不是用浏览器访问的都不是正经的)的当前页面崩溃掉,本机的CPU有些波动而已。

阅读剩余
THE END
诺言博客