sh1vmani/secure-file-locker
GitHub: sh1vmani/secure-file-locker
一个演示如何通过多层防护阻断路径遍历攻击的实验性 Flask 应用。
Stars: 0 | Forks: 0
# secure-file-locker



## 概述
本仓库记录了一个自主实验,旨在探索路径遍历漏洞在 Web 应用程序中的表现形式,以及如何通过分层防护来消除这些漏洞。应用程序从受限制的上传目录提供文件,并证明单一防护措施是不够的——有效的修复需要在操作系统、应用程序和网络层进行协调防御。
该实验室围绕一个最小化的 Flask 应用程序构建,该程序针对 CWE-22(路径名未正确限制到受限目录)进行了加固。每一层都能独立阻止已知的攻击变体,从而形成一个有弹性的系统,即使绕过一层防护,其他层仍然保持完整。
## 威胁模型
防御的攻击模式:
| Pattern | Description |
|---|---|
| `../../etc/passwd` | 使用 `../` 序列的经典相对遍历 |
| `..\..\..\windows\system32` | Windows 风格反斜杠遍历 |
| `%2e%2e%2f` | URL 编码的点斜杠序列 |
| `%2e%2e%5c` | URL 编码的点反斜杠序列 |
| Symlink escape | 指向 `BASE_DIR` 之外的符号链接 |
| Extension bypass | 访问 `.sh`、`.py`、`.conf` 或其他未列入允许列表的扩展名 |
目标:攻击者无法通过 `?name=` 查询参数读取 `/var/www/safe_uploads` 目录外的文件,也无法访问未列入允许列表扩展名的文件。
## 架构
```
Client Request
|
v
[ Cloudflare WAF ] <-- Layer 3: Edge pattern blocking (managed rulesets)
|
v
[ Nginx Reverse Proxy ] <-- Layer 2: IP allowlist, deny all by default
|
v
[ Flask Middleware ] <-- Layer 2: Regex-based traversal pattern rejection
|
v
[ App Logic ] <-- Layer 1: Extension allowlist + canonical path check
|
v
[ OS Permissions ] <-- Layer 0: Least-privilege user, restricted directory
|
v
File Response / 404
```
## 防御层
### 第 0 层 — 系统(OS 权限)
上传目录 `/var/www/safe_uploads` 归属于一个专用的服务账户,该账户没有 Shell 访问权限。Flask 进程以此用户身份运行,仅对 `safe_uploads` 拥有只读权限,无法访问敏感系统路径。即使所有应用层防护被绕过,操作系统也会拒绝读取 `/etc/passwd` 或 `/root/`。
参考:[CIS Benchmark — Linux File Permissions](https://www.cisecurity.org/cis-benchmarks/)
### 第 1 层 — 应用程序(Flask)
这里包含两个独立的防护措施:
**扩展名允许列表**(`is_allowed_file`):仅允许 `.txt`、`.pdf`、`.jpg` 和 `.png`。任何其他扩展名都会在路径解析开始前返回 404。
**规范路径检查**(`get_safe_path`):将文件名与 `BASE_DIR` 使用 `os.path.join` 拼接,通过 `os.path.normpath` 标准化,再使用 `os.path.realpath`(解析符号链接)转换为绝对真实路径。结果必须以 `BASE_DIR` 的真实路径开头;否则函数返回 `None` 并拒绝请求。
参考:[OWASP WSTG-AUTHZ-01](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/05-Authorization_Testing/01-Testing_Directory_Traversal_File_Include)、[CWE-22](https://cwe.mitre.org/data/definitions/22.html)
### 第 2 层 — 网络(Nginx + 中间件)
**Flask `@before_request` 中间件**:一个编译好的正则表达式在路由处理程序执行前扫描完整请求路径(包括查询字符串),查找遍历模式(`../`、`..\`、`%2e%2e`、`%2f`、`%5c`)。匹配到的请求会立即返回 HTTP 400。
**Nginx IP 允许列表**:反向代理配置为 `allow 127.0.0.1; deny all;`,即只有来自本地主机的请求才能到达 Flask 进程。直接对 5000 端口的外部访问在网络边界被阻止。
参考:[MITRE ATT&CK T1083 — File and Directory Discovery](https://attack.mitre.org/techniques/T1083/)
### 第 3 层 — 边缘(Cloudflare WAF)
架构图中包含边缘处的 Cloudflare WAF 层。托管规则集(OWASP Core Rule Set)可在请求到达源站前基于签名阻止已知的遍历载荷。此层是配置驱动的,未在本仓库中实现,但用于表示真实的生产部署姿态。
## 设置
```
git clone https://github.com/sh1vmani/secure-file-locker.git
cd secure-file-locker
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
# 创建上传目录和测试文件
mkdir -p /var/www/safe_uploads
echo "hello world" > /var/www/safe_uploads/test.txt
python app.py
# 在 http://127.0.0.1:5000 上提供服务
```
获取文件:
```
GET http://127.0.0.1:5000/file?name=test.txt
```
## 攻击模拟结果
| Test Payload | Blocking Layer | HTTP Response |
|---|---|---|
| `../../etc/passwd` | Flask middleware (regex) | 400 |
| `%2e%2e/%2e%2e/etc/passwd` | Flask middleware (regex) | 400 |
| `secret.sh` | App logic (extension allowlist) | 404 |
| `test.txt` | — (valid request) | 200 |
所有遍历载荷都在中间件层被拦截,未到达路径解析阶段。扩展允许列表会拦截非允许扩展名的非遍历尝试。合法请求可通过所有层。
## 我学到的内容
- **纵深防御不等于冗余**——每一层防护针对不同的攻击类别;组合起来覆盖的表面积远大于单一控制。
- **`os.path.realpath` 对符号链接安全至关重要**——仅靠 `normpath` 无法解析符号链接,攻击者可在安全目录内放置符号链接进行绕过。
- **在原始请求路径上使用正则表达式可捕获编码变体**,避免它们被解码后到达应用程序并绕过字符串级检查。
- **扩展名允许列表优于拒绝列表**——维护危险扩展名的拒绝列表很脆弱;采用已知安全类型的允许列表是默认关闭的策略。
- **Nginx `deny all` 默认姿态**意味着任何上游服务的配置错误都会导致“失败关闭”而非“失败开放”。
## 参考文献
- [OWASP WSTG-AUTHZ-01: Path Traversal](https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing/05-Authorization_Testing/01-Testing_Directory_Traversal_File_Include)
- [CWE-22: Improper Limitation of a Pathname to a Restricted Directory](https://cwe.mitre.org/data/definitions/22.html)
- [MITRE ATT&CK T1083: File and Directory Discovery](https://attack.mitre.org/techniques/T1083/)
- [Flask Security Considerations](https://flask.palletsprojects.com/en/3.1.x/security/)
标签:API密钥检测, Cloudflare, CWE-22, Flask, GitHub Advanced Security, IP白名单, MITRE ATT&CK, Nginx, OS安全, PB级数据处理, Python, WAF, Web安全, XML 请求, 允许列表, 反向代理, 安全加固, 安全实验室, 安全开发, 安全运维, 文件上传安全, 无后门, 最小权限, 正则过滤, 漏洞修复, 网络安全, 网络安全培训, 蓝队分析, 路径规范化, 路径遍历, 输入验证, 逆向工具, 链路防护, 防御深度, 防护层, 隐私保护