【精选优质专栏推荐】
- 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用
- 《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看
- 《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解
- 《网安渗透工具使用教程(全)》 —— 一站式工具手册
- 《CTF 新手入门实战教程》 —— 从题目讲解到实战技巧
- 《前后端项目开发(新手必知必会)》 —— 实战驱动快速上手
每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。
文章目录
一、引言:为什么要关注目录穿越风险?
在Web服务架构中,Nginx因高性能、高可靠性被广泛用作反向代理或静态资源服务器。但很多开发者在使用Nginx时,往往直接采用默认配置快速部署服务,却忽视了默认配置中潜藏的安全风险。目录穿越攻击就是典型代表——攻击者利用URL中的特殊字符(如“…/”“…\”)或其编码形式,让服务器误解析请求路径,从而访问到网站根目录以外的敏感文件,如配置文件、日志文件甚至系统核心文件,可能导致数据泄露、服务被劫持等严重后果。
本文通过实际测试,还原Nginx默认配置下目录穿越攻击的可行性,并给出具体的安全加固方案,为Web服务的安全部署提供参考。
二、测试环境与工具准备
2.1 测试环境
-
操作系统:Windows 10(测试环境,Linux环境原理一致)
-
Web服务器:Nginx 1.15.11(采用默认配置)
-
Python环境:Python 3.10.2(用于编写测试脚本)
-
测试文件:在Nginx网站根目录下创建“Test”文件夹,并在其中放置T.txt文件,文件内容为“Success”,用于验证访问结果
2.2 核心工具:requests库
Python的requests库是常用的HTTP请求工具,能够便捷地发送GET、POST等请求并获取响应结果。本次测试通过requests库构造不同的访问路径,验证Nginx对目录穿越符的处理行为。安装命令如下:
pip install requests
三、测试脚本设计与实现
测试脚本分为“正常访问测试”和“目录穿越测试”两部分。正常访问测试用于验证目标文件可被正常访问,作为测试基准;目录穿越测试则通过构造包含“…/”“…\”“…%2F”(URL编码后的“/”)等常见目录穿越符的路径,测试Nginx是否会拦截此类请求。
3.1 完整测试脚本
import requests
# 本地 Nginx 地址
base_url = "http://127.0.0.1/Test/T.txt"
# 正常访问应该返回 "success"
normal_paths = [
"T.txt",
]
# 尝试目录穿越访问
traversal_paths = [
"../Test/T.txt",
"..\\Test\\T.txt",
"../../Test/T.txt",
"..%2FTest%2FT.txt" # URL 编码 /
]
def test_paths():
print("正常访问测试")
for path in normal_paths:
url = f"http://127.0.0.1/Test/{path}"
r = requests.get(url)
print(f"访问 {url} => {r.status_code}, 内容: {r.text}")
print("\n目录穿越测试")
for path in traversal_paths:
url = f"http://127.0.0.1/Test/{path}"
try:
r = requests.get(url)
print(f"访问 {url} => {r.status_code}, 内容: {r.text}")
except Exception as e:
print(f"访问 {url} 失败: {e}")
if __name__ == "__main__":
test_paths()
3.2 脚本核心逻辑解析
-
路径设计思路:目录穿越符的核心作用是“返回上级目录”,脚本中构造的路径看似复杂,本质都是通过“…/”或其变种,试图绕过“Test/”目录的限制,最终仍指向“Test/T.txt”文件。若Nginx未拦截此类请求,则会正常返回文件内容。
-
结果输出:清晰展示每个请求的URL、HTTP状态码和响应内容,便于直观判断Nginx的处理结果——若状态码为200且响应内容为“Success”,则说明目录穿越请求被成功执行。
四、测试结果与风险分析
4.1 完整测试输出
PS D:\I\Envir\Python\WorkSpace> & D:/I/Envir/Python/python.exe d:/I/Envir/Python/WorkSpace/T.py
正常访问测试
访问 http://127.0.0.1/Test/T.txt => 200, 内容: Success
目录穿越测试
访问 http://127.0.0.1/Test/../Test/T.txt => 200, 内容: Success
访问 http://127.0.0.1/Test/..\Test\T.txt => 200, 内容: Success
访问 http://127.0.0.1/Test/../../Test/T.txt => 200, 内容: Success
访问 http://127.0.0.1/Test/..%2FTest%2FT.txt => 200, 内容: Success

4.2 结果分析:Nginx默认配置的问题
从测试结果可以看出,无论是正常访问路径,还是包含“…/”“…\”“URL编码穿越符”的目录穿越路径,Nginx均返回200状态码和“Success”内容,这表明默认情况下,Nginx会对URL中的路径进行“规范化处理”,自动解析“…/”“…\”等符号,将其转换为实际的文件路径,而非直接拒绝请求。例如,“Test/…/Test/T.txt”会被解析为“Test/T.txt”,从而正常返回文件内容。
五、安全加固:Nginx配置优化方案
针对上述测试暴露的风险,需通过修改Nginx配置,限制URL路径的解析范围,拦截目录穿越请求。核心思路是“明确资源根目录”“禁止路径向上穿越”“验证请求路径合法性”,以下是具体实现方案。
5.1 核心配置优化
修改Nginx的站点配置文件(通常位于conf/nginx.conf或conf.d/default.conf),在location块中添加以下配置:
server {
listen 80;
server_name localhost;
# 网站根目录(根据实际情况修改,如D:/nginx/html)
root D:/nginx/html;
index index.html index.htm;
location / {
# 1. 限制请求路径只能在根目录内(核心配置)
# 将$uri解析后的路径与根目录拼接,若结果不在根目录内则返回403
if ($request_filename !~* ^$root.*) {
return 403;
}
# 2. 禁止URL中包含../(直接拦截包含穿越符的请求)
if ($uri ~* "\.\./") {
return 403;
}
# 3. 规范化URL路径,避免解析异常(可选,增强稳定性)
rewrite ^/(.*)$ /$1 break;
}
# 静态资源访问限制(可选,针对特定目录加固)
location /Test/ {
# 强制将请求路径映射到指定目录,禁止向上穿越
alias D:/nginx/html/Test/;
# 仅允许访问txt、jpg等指定类型文件(按需调整)
types {
text/plain txt;
image/jpeg jpg;
}
# 禁止访问其他类型文件
default_type application/octet-stream;
}
}
5.2 配置作用解析
1.路径合法性校验:
if ($request_filename !~* ^$root.*) 表示若解析后的请求文件路径不在网站根目录($root)范围内,则返回403禁止访问,从根本上阻止跨目录访问。
2.穿越符直接拦截:
if ($uri ~* “…/”) 通过正则匹配URL中包含的“…/”符号,直接拒绝此类请求,防御基础的目录穿越攻击。
3.alias与root的区别:
在location /Test/中使用alias而非root,可强制将请求路径映射到“D:/nginx/html/Test/”,即使出现“…/”也无法跳出该目录,进一步强化路径限制。
4.文件类型限制:
通过types配置仅允许访问指定类型的文件,避免攻击者通过目录穿越获取敏感配置文件(如.conf、.ini)。
5.3 配置生效与验证
修改配置后,需重启Nginx使配置生效,命令如下:
# Windows系统(Nginx安装目录下)
nginx.exe -s reload
# Linux系统
systemctl reload nginx
重启后再次执行测试脚本,若所有目录穿越请求均返回403状态码,仅正常访问路径返回200,则说明加固配置生效。
六、总结
本次测试通过Python脚本验证了Nginx默认配置下的目录穿越风险——默认配置会自动解析URL中的目录穿越符,无法有效拦截此类攻击。这警示开发者:“默认配置≠安全配置”,快速部署服务的同时必须重视安全加固。
通过“路径合法性校验”“穿越符拦截”“权限控制”等多层防御手段,可有效规避目录穿越风险。Web安全防护的核心在于“最小权限原则”,无论是Nginx配置还是应用开发,都应严格限制资源访问范围,从源头阻断攻击路径。
2375

被折叠的 条评论
为什么被折叠?



