Files
Sec-Interview/_book/Chapter7/7-33.md
T
2025-11-08 21:00:06 +08:00

32 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 任意文件下载漏洞防御方法
**1. 严格校验用户输入**
这是最根本也是最重要的防御措施。在处理文件下载请求时,绝对不能相信用户提供的任何文件路径信息
- **白名单机制:** 建议使用**白名单**来限制用户可下载的文件。即只允许下载特定目录下的特定文件。例如,你可以定义一个允许下载的文件列表,当用户请求文件时,先检查请求的文件名是否在白名单中
- **黑名单机制(不推荐):** 尽管可以通过黑名单来过滤一些危险的文件名(如`../``../../``/etc/passwd``C:/Windows/win.ini`),但这种方法很容易被绕过。攻击者可以使用编码(如 URL 编码)或者其他技巧来绕过黑名单,因此不推荐单独使用黑名单
- **路径规范化:** 在处理用户输入的文件路径前,必须对路径进行规范化。你可以使用编程语言提供的函数来获取文件的规范路径,然后检查这个路径是否在你的下载目录下。例如,在 Python 中可以使用`os.path.abspath()`来获取绝对路径
- **禁止使用路径穿越符:** 检查用户输入中是否包含 `../``..\` 等路径穿越符。如果发现,应立即拒绝请求或进行特殊处理
- **限定下载目录:** 所有可供下载的文件都应存放在一个**专门的、与 Web 根目录隔离**的下载目录中。下载请求应该只允许访问这个目录下的文件
**2. 权限控制**
- **最小权限原则:** Web 服务器(如Nginx、Apache)或运行 Web 应用的账户,应该以**最小权限**运行。不要使用`root``Administrator` 等高权限账户。这样即使出现漏洞,攻击者也无法下载到系统关键文件
- **文件权限设置:** 确保 Web 目录下的文件权限设置正确。例如,配置文件、日志文件、数据库文件等敏感文件应设置为只有特定用户才能读取,并且禁止 Web 应用账户读取
**3. 编程实现中的安全实践**
- **使用绝对路径:** 在代码中,永远使用**绝对路径**来构建文件下载的路径。不要使用用户提供的相对路径
- **文件名或 ID 映射:** 更好的一种方法是,不要直接暴露文件名给用户。你可以为每个可下载文件生成一个**唯一的ID**,并将其存储在数据库中。用户请求时,只提供这个 ID,后端程序根据 ID 从数据库中查找对应的文件路径并进行下载。这样可以彻底避免用户直接操纵文件名
例如:
- **不安全的方式:** `download.php?file=../../etc/passwd`
- **安全的方式:** `download.php?id=123` (ID 123 对应的是一个安全的、预设的文件路径)
**4. Web 应用防火墙(WAF**
- **部署 WAF** 在 Web 服务器前部署 Web 应用防火墙(WAF)。WAF 可以帮助你检测和拦截包含路径穿越(Path Traversal)攻击特征的请求,如 `../``/etc/passwd` 等,从而在请求到达应用服务器前就将其拦截