本文目录导读:

针对“目录未授权访问”漏洞(也称为目录浏览漏洞或目录遍历漏洞),防护的核心原则是:禁止Web服务器列出目录内容,并严格控制对文件系统的访问权限。
以下是从Web服务器配置、应用层代码、架构层三个维度的具体防护措施:
配置Web服务器,禁用目录列表
这是最根本、最有效的防护方法,根据你使用的服务器软件进行配置:
A. Nginx
- 在
server或location段中,确保autoindex指令为off(默认就是关闭的,但建议显式设置):
location / {
autoindex off;
# 其他配置...
}
- 如果想彻底禁止访问某个目录(
.git或配置文件目录),可以返回403或404:
location ~* ^/(\.git|config|backups)/ {
deny all;
return 404; # 或者 403,用404更隐蔽
}
B. Apache
- 在全局配置文件
httpd.conf或.htaccess文件中,对于特定目录禁用Options +Indexes:
<Directory /var/www/html>
Options -Indexes # 关键:减号表示移除Indexes选项
# 或者写成 Options None
</Directory>
- 使用
AccessFileName .htaccess时,可以在.htaccess中输入:
Options -Indexes
C. IIS (Internet Information Services)
- 打开IIS管理器,选择站点或目录。
- 双击“目录浏览”功能。
- 在右侧操作窗格中,点击“禁用”。
D. Tomcat
- 编辑
conf/web.xml文件,配置defaultservlet,设置listings参数为false:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value> <!-- 关键行 -->
</init-param>
</servlet>
应用层代码防御(双重保险)
如果Web服务器配置失效(例如使用了反向代理或自定义路由),代码层面也需要防护。
A. 禁用列目录功能
- 对于静态文件目录(如上传文件夹、临时文件夹),不要在代码中提供列表接口。
- 对于动态页面,使用
Directory.GetFiles()、glob()、os.listdir()等函数时,应仅获取特定文件名,不要输出目录结构。
B. 防御路径穿越(Path Traversal)
目录未授权常伴随路径穿越攻击(如 ../../etc/passwd),防护方法:
-
输入验证:
- 过滤黑名单字符:、、、
%2e%2e%2f、..%252f(二次解码攻击)。 - 使用白名单:限定只能访问特定文件夹内的文件。
- 禁止包含绝对路径(以 或
C:\开头)的请求。
- 过滤黑名单字符:、、、
-
路径规范化(Canonicalization):
- 获取用户请求的文件路径后,在服务器端解析出绝对路径。
- 检查该绝对路径是否以允许的目录路径开头。
示例逻辑(伪代码):
user_path = "uploads/../../etc/passwd" base_dir = "/var/www/uploads/" full_path = base_dir + sanitize_path(user_path) # 规范化 if not full_path.startsWith(base_dir): return 403 Forbidden else: read_file(full_path)
架构与运维层面的高级防护
A. 文件存储分离
- 不要将用户上传的文件(图片、文档等)存放在Web根目录(如
wwwroot、html)。 - 使用对象存储服务(如阿里云OSS、AWS S3、腾讯云COS),通过预签名URL(Signed URL)或临时令牌认证访问。
- 或者将文件存储在Web服务器之外的应用服务器上,由应用层通过内部接口转发。
B. 静态文件由Web服务器直出,动态文件由API处理
- 静态资源(CSS, JS, Images)直接由Nginx/Apache服务,访问规则清晰。
- 敏感文件(备份、配置文件、数据库导出)必须通过带有权限验证的API端点下载,且响应头设置为
Content-Disposition: attachment; filename="...";。
C. 使用WAF(Web应用防火墙)
- 在云WAF(如Cloudflare、阿里云WAF)或开源WAF(如ModSecurity)中,开启“路径穿越/目录遍历”防护规则。
- 通过规则阻断包含 、
..%2f、%00(空字节)等恶意特征的请求。
D. 最小权限原则
- 操作系统层面:Web服务器进程的用户(如
www-data、nobody)对目录只读,且只能访问其职责范围内的目录,绝对不能拥有对所有文件系统的读取权限。 - 定期审计:检查日志中是否有大量404或包含 的请求,这可能意味着扫描器在尝试利用目录未授权漏洞。
优先级清单
- 立即检查并关闭:Web服务器的
Directory listing / autoindex功能(最紧急)。 - 实施路径规范化和白名单:在代码层对所有文件读取操作进行绝对路径校验。
- 迁移敏感文件:将数据库备份、配置、密钥等文件移出Web可访问目录。
- 设置适当的文件权限:Web服务器用户只读且最小化访问权限。
- 启用WAF:作为网络层防线,拦截已知的利用Payload。
通过以上组合策略,可以有效防止攻击者通过目录浏览或路径穿越获取系统敏感信息。