sh1vmani/secure-file-locker

GitHub: sh1vmani/secure-file-locker

一个演示如何通过多层防护阻断路径遍历攻击的实验性 Flask 应用。

Stars: 0 | Forks: 0

# secure-file-locker ![Python](https://img.shields.io/badge/python-3.11%2B-blue) ![Flask](https://img.shields.io/badge/flask-3.1.0-lightgrey) ![License](https://img.shields.io/badge/license-MIT-green) ## 概述 本仓库记录了一个自主实验,旨在探索路径遍历漏洞在 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 请求, 允许列表, 反向代理, 安全加固, 安全实验室, 安全开发, 安全运维, 文件上传安全, 无后门, 最小权限, 正则过滤, 漏洞修复, 网络安全, 网络安全培训, 蓝队分析, 路径规范化, 路径遍历, 输入验证, 逆向工具, 链路防护, 防御深度, 防护层, 隐私保护