恶心的网站扫描工具 {#恶心的网站扫描工具}
用公网网站的应该都会遇到,从你上线一个公开网站的那天开始,你的 Nginx 错误日志里面每天都会有大量的 404 请求出现,而且很多都是重复的请求,比如各种以 .php
结尾的请求。
这些错误请求就像下面这样:
这些就是某些黑产使用网站扫描工具干的,就是在无差别的进行扫描,看你的网站是否有漏洞可以利用。
而且这里有个特点,就是很多请求都是 wordpress 的,毕竟以前使用 wordpress 建站是大多数人的选择,所以被公开的漏洞相对多一些吧。
这种错误日志太多了,首先会占用 Nginx 的日志空间,虽然不大,但是也是浪费,其次是会影响我们查看真正报错的 404 日志,所以可以想想办法解决这个问题。
Gzip 炸弹💣方案 {#gzip-炸弹方案}
什么是 Gzip 炸弹 {#什么是-gzip-炸弹}
Gzip 炸弹(Gzip Bomb)是一种恶意构造的压缩文件,旨在通过利用压缩算法的特性,使得解压缩这个文件时占用大量的系统资源,甚至导致系统崩溃或拒绝服务。Gzip 炸弹通常通过递归地嵌套压缩来实现,因此在解压缩时会逐渐膨胀成极大的文件。
我们可以使用 dd
命令结合 gzip
命令制造一个 Gzip 炸弹:
dd if=/dev/zero bs=1M count=1024 | gzip > bomb.gzip
这个命令创建了一个压缩文件 bomb.gzip,虽然这个压缩文件只有1M,但是解压之后会有1G这么大。
也就是说服务器只返回一个1M的文件,客户端如果接收并解压开的话,会占用内存1G。
使用 Gzip 炸弹 {#使用-gzip-炸弹}
在 Nginx 中配置指定的请求返回这个炸弹,比如上面提到的那些经常被扫描工具关顾的地址。
location ~* \.php$ {
default_type text/html;
add_header Content-Encoding gzip;
alias /etc/nginx/conf.d/bomb/bomb.gzip;
}
这个配置使用正则匹配任何以 .php 结尾的请求都会返回上面那个炸弹文件,如果客户端去解压打开的话,就会占用1G内存。
效果评估 {#效果评估}
可以看一下浏览器里面的请求效果:
可以看到在浏览器的内存占用里面是超过了1G的,这是因为浏览器会自动解压带有gzip请求头的内容。
虽然这个在浏览器请求里面效果很明显,但是扫描工具并不是浏览器,而是黑产的工具,黑产是什么,他们又不傻,这种低级的 Gzip 炸弹真的可以恶心到他们吗?
我是持否定意见的,具体可以看一些爬虫避开 Gzip 炸弹的例子:
忽略报错日志的方案 {#忽略报错日志的方案}
我们重新回到我们的问题上来思考,扫描工具真正影响到我们的是什么?其实无非就是会生成一些重复的无效的错误日志,那我们何不直接忽略掉这种错误的请求,不要记录任何日志,直接抛弃就行。
看下面这个配置:
location ~* \.php$ {
access_log off;
log_not_found off;
return 444;
}
这个配置的说明:
location ~* \.php$
: 也是匹配以 .php 结尾的请求,因为我的网站没有这种以 .php 结束的路由,所以只要有人请求这个,我都可以直接忽略。access_log off;
:关闭访问日志记录,意味着对于匹配到的请求,Nginx 不会记录访问日志,即使请求被拒绝也不会记录。log_not_found off;
:关闭未找到日志记录,意味着对于未找到的文件或目录的请求,Nginx 不会记录错误日志。return 444;
:返回状态码 444,表示连接被关闭,不返回任何内容。这个状态码通常被用于拒绝访问,表示请求被无条件地拒绝,客户端会收到一个空白的响应。
配置生效,日志干净了很多,当然,还有很多其他的路径的请求,也可以按照这种方式添加到匹配规则里面进行忽略。
总结 {#总结}
Gzip 炸弹干扰网站扫描工具的方案看似很厉害,实际上我认为根本不会起到任何作用,而且返回炸弹本身也是需要消耗网站流量和带宽的,所以并不划算。而使用 Nginx 配置直接忽略非正常请求的方式可以有效的节省服务端的处理,也可以节省日志空间,怎么看都是收益最高的选择。