FardinIqbal/vulnsocial

GitHub: FardinIqbal/vulnsocial

一个基于 PHP + MySQL 的故意设计存在漏洞的社交网络沙箱,用于 Web 安全漏洞利用开发、安全编码修复和漏洞分析报告的实践教学。

Stars: 0 | Forks: 0

# VulnSocial VulnSocial 是一个故意设计存在漏洞的 Twitter 克隆项目,运行在 PHP 8.2 + MySQL 8.4 上,被打包成双容器的 Docker 技术栈。它内置了三个教科书级别的 Web 漏洞:登录和搜索路径中基于 UNION 的 **SQL 注入**,帖子时间线中的存储型 **跨站脚本 (XSS)** 接收点,以及一个可通过上述 XSS 绕过的已记录的 **CSRF** 边界——此外,它还提供了一个干净、防御完善的基线(每个会话的 CSRF token、bcrypt 密码哈希、代码库其余部分均使用预处理语句、`HttpOnly`/`SameSite=Lax` cookie),从而保证了这些漏洞是*针对性*存在的,而不是随处可见的低级错误。 这是我构建的一个业余项目,旨在提供一个紧凑、独立的演练场,用于练习漏洞利用开发、安全编码修复以及编写漏洞分析报告——它既足够贴近真实代码库而显得有趣,又小巧到可以一口气读完。 ## 目录 - [包含内容](#whats-inside) - [快速开始](#quickstart) - [架构一览](#architecture-at-a-glance) - [漏洞列表](#vulnerability-catalog) - [漏洞利用参考](#reference-exploits) - [文档](#documentation) - [项目结构](#project-layout) - [安全提示](#safety-notice) - [许可证](#license) ## 包含内容 | 层级 | 选择 | 原因 | | ----------- | ----------------------------------- | ---------------------------------------------------------------------------------- | | Web 层 | PHP 8.2 + Apache (`php:8.2-apache`) | 极小的镜像,零框架依赖——映射了现实中大量遗留的 PHP 代码。 | | 数据库 | MySQL 8.4 (`mysql:8.4.8`) | UTF-8mb4 默认配置;`OR`/`UNION` 语义在各版本间保持稳定。 | | 驱动 | `mysqli` 与 `execute_query` | 安全(参数化)和不安全(插值拼接)的执行路径并存。 | | 前端 | Bootstrap 4 + jQuery (CDN) | 无构建步骤。页面在服务器端渲染;JS 仅用于填充 CSRF token 和字符计数器。 | | 认证 | bcrypt via `password_hash` + `password_verify` | 强加密原语——漏洞在于*使用方式*,而不在于算法本身。 | | 会话 | PHP 默认 `PHPSESSID`, `HttpOnly`, `SameSite=Lax` | 现实的基线配置;由于 token 的作用域限制在会话内,CSRF 防护依然有效。 | | 工具 | Python 3 + `requests` + `beautifulsoup4` | 一个 150 行的驱动脚本 (`script.py`) 即可执行完整的攻击链。 | 该 Web 应用实现了标准的社交网络功能集:注册、登录/登出、发布状态、搜索帖子、关注/取关(“好友”语义——双向的)、个人主页以及好友请求收件箱。 ## 快速开始 ``` # 1) 启动 stack docker compose up --build # 2) 访问 webapp open http://localhost:8080 # 3) 使用任意 seeded user 登录 # Username: alice Password: password123 # 4) 运行完整 exploit chain (Python 3.10+) pip install requests beautifulsoup4 python3 script.py ``` 该脚本将执行以下操作: 1. 注册一个新的 `attacker_acct` 用户。 2. 通过基于 UNION 的 SQL 注入以 `admin` 身份登录。 3. 将每一对 `(username, bcrypt-hash)` 数据导出到 `db.csv`。 4. 注入一个存储型 XSS payload,当任何已登录的用户查看时,会自动向 `attacker_acct` 发送好友请求。 销毁环境:`docker compose down -v`。 ## 架构一览 ``` flowchart LR Browser((Browser)) subgraph stack["Docker network: vulnsocial"] Apache["webapp container
php:8.2-apache
port 80"] MySQL[("db container
mysql:8.4.8
port 3306")] end Browser -- "HTTP :8080" --> Apache Apache -- "mysqli (port 3306)" --> MySQL Apache -. "init.sql seed" .-> MySQL ``` 两个容器,一个 bridge 网络。Web 应用通过服务名 (`db`) 与 MySQL 通信。数据库**没有**暴露给宿主机——仅 Web 应用开放在 `:8080` 端口。有关请求生命周期、会话/CSRF 状态机以及完整的 ER 图,请参见 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。 ## 漏洞列表 | ID | 类别 | 位置 | 接收点 | 严重程度 (沙箱环境) | | --- | -------- | --------------------------------------- | ------------------------------------------------- | ------------------ | | V-1 | SQLi | `webapp/db/functions.php:44` | `checkUserAuth()` — 登录表单,基于 UNION | 严重 (身份验证绕过) | | V-2 | SQLi | `webapp/db/functions.php:90` | `filterPostsByContent()` — 搜索,基于 UNION | 高 (全表数据窃取) | | V-3 | XSS | `webapp/components/post.php:7` | `

` 帖子正文,原始输出 | 高 (存储型,持久化) | | V-4 | CSRF-via-XSS | `webapp/actions/get_csrf_token.php` | 可从 V-3 触达的同源 token oracle | 链式调用 — 一旦 V-3 被利用,CSRF 防御即刻瓦解 | 其余的每一个涉及状态更改的端点都*受到* CSRF 保护(基于会话的 token,`hash_equals`),其他的每一个数据库调用都使用了预处理语句,所有的用户名显示都经过 `htmlspecialchars` 编码。这些漏洞的存在是极其精准且克制的。有关完整的威胁模型和根本原因分析,请参见 [`docs/SECURITY.md`](docs/SECURITY.md)。 ## 漏洞利用参考 ``` # V-1 — 以 admin 登录 username: ' UNION SELECT 1,'admin','$2y$10$edpOw5BKReEYXiGNpv9coOIhLWxlsAY4IY0yBQPTG.u4KYYfZpXtC' -- - password: pwned # V-2 — 窃取 users table search: %' UNION SELECT id, id, password FROM users -- - # V-3 + V-4 — 驱动 CSRF 认证 friend request 的 stored XSS ``` 逐步推导过程详见 [`docs/EXPLOITS.md`](docs/EXPLOITS.md)。 ## 文档 | 文档 | 涵盖内容 | | -------------------------------------------- | ----------------------------------------------------------------------------- | | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | 容器拓扑,请求生命周期,会话/CSRF 状态机,ER 图。 | | [docs/SECURITY.md](docs/SECURITY.md) | 威胁模型,漏洞深入分析,深度防御审计。 | | [docs/EXPLOITS.md](docs/EXPLOITS.md) | Payload 构建,逐字节分析,验证步骤。 | | [docs/HARDENING.md](docs/HARDENING.md) | 针对每个漏洞的补丁级别修复及代码差异对比。 | | [docs/API.md](docs/API.md) | 每一个 HTTP 端点:方法,参数,认证,副作用,状态码。 | | [docs/DATABASE.md](docs/DATABASE.md) | 模式,索引,约束,种子数据,查询模式。 | | [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) | 本地开发流程,调试,容器配置机制,常见陷阱。 | | [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) | 代码风格,分支管理,如何负责任地添加新的“漏洞”功能。 | | [recon.md](recon.md) | 基于源代码的信息收集笔记(类似于渗透测试人员最初会草拟的内容)。 | ## 项目结构 ``` . ├── compose.yml # Two-service Docker stack ├── webapp/ # PHP application │ ├── Dockerfile │ ├── index.php # Timeline + welcome page │ ├── header.php # Session bootstrap + CSRF mint + navbar │ ├── profile.php # User profile (with self-redirect) │ ├── info.php # phpinfo() — for debugging only, see SECURITY.md §6 │ ├── auth/ # login.php, signup.php, logout.php │ ├── actions/ # CSRF-protected POST endpoints (friend req, posts, ...) │ ├── components/ # Reusable view fragments │ ├── db/ # Connection + query helpers (auth.php, functions.php) │ ├── js/ # CSRF auto-fill + textarea counter │ └── assets/ # Static images ├── sql_db/ # Database container │ ├── Dockerfile │ └── init.sql # Schema + seeded users ├── script.py # End-to-end exploit driver ├── recon.md # Recon notes ├── exploits.txt # Cheat-sheet payloads └── docs/ # Long-form documentation ``` ## 安全提示 VulnSocial 是**故意设计为可被利用的**。请勿将其暴露在公共网络中,请勿复用其中的密码,也不要将其部署在任何有真实用户的环境中。在本地运行它,从中学习,然后销毁它。完整的免责声明请参见 [`docs/SECURITY.md`](docs/SECURITY.md) §0。 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。

标签:CISA项目, CTF训练, Docker, ffuf, intentionally vulnerable, MySQL 8.4, PHP 8.2, Twitter克隆, Web安全, 安全编码, 安全防御评估, 漏洞修复, 漏洞演练平台, 漏洞靶场, 社交网络靶场, 网络安全, 网络安全培训, 蓝队分析, 请求拦截, 跨站脚本攻击(XSS), 跨站请求伪造(CSRF), 逆向工具, 防御检测, 隐私保护