2iaad/csrf-exploit-lab
GitHub: 2iaad/csrf-exploit-lab
一个全栈的 CSRF 漏洞演示与修复实验室,通过模拟跨站攻击场景帮助开发者直观理解 Cookie 的 SameSite 防御机制。
Stars: 0 | Forks: 0
# CSRF 漏洞利用实验室
一个小巧的全栈实验室,用于_直观体验_跨站请求伪造(CSRF)攻击的运行过程,
随后仅通过一个 cookie 属性将其拦截:**SameSite**。
## 快速开始
```
git clone git@github.com:2iaad/csrf-exploit-lab.git
cd csrf-exploit-lab
make hosts # one-time: adds app.test + evil.test to /etc/hosts (asks sudo)
make up # builds + starts everything (TLS cert is auto-generated)
```
然后在浏览器中:
1. 打开 **https://app.test:8080** 并接受证书警告(应用)。
2. 打开 **https://app.test:4000/health** 并同样接受警告(API)。
3. 注册、登录 —— 你将进入个人资料页面。
4. 访问 **http://evil.test:9090** → 返回个人资料页面并刷新:你的
用户名现在变成了 `exploited_by_csrf`。这就是 CSRF。
下文将详细解释其原理及修复方法。
## 包含内容
| 服务 | URL | 说明 |
| ---------- | ------------------------- | --------------------------------------------------------------- |
| `db` | localhost:5433 | PostgreSQL,存储用户 (`init.sql`) |
| `backend` | https://app.test:4000 | Express API。身份验证为 cookie 中的 JWT。**存在漏洞。** |
| `frontend` | https://app.test:8080 | 合法应用:注册 / 登录 / 个人资料(黑白界面) |
| `exploit` | http://evil.test:9090 | 位于**不同站点**的 "Hello world" 页面,会伪造请求 |
只有当攻击者与应用处于**不同站点**时,攻击才有意义 —— 这就是为什么会有
两个主机名,以及为什么我们需要使用 HTTPS(`SameSite=None` 的 cookie 只有
在其同时为 `Secure` 时才被允许)。
## 设置(仅一次)
你需要在机器上修改的**唯一**内容就是 hosts 文件 —— 将这两个
名称都指向你的本机(使用 `sudo`):
```
127.0.0.1 app.test
127.0.0.1 evil.test
```
TLS 证书会在 Docker 内部自动为你生成(自签名)并存储在
一个命名卷中 —— 不会向你的主机写入任何内容,也不需要 openssl/mkcert。
## 运行
```
make up # docker compose up -d --build
```
因为证书是自签名的,所以**首次**访问时,你必须为每个 HTTPS 源
接受一次浏览器的警告(“高级 → 继续前往”) —— 而且攻击的隐藏
iframe 会向后端发送请求,因此你也必须接受后端的证书:
1. 打开 **https://app.test:8080** → 跳过警告继续前往(应用)。
2. 打开 **https://app.test:4000/health** → 跳过警告继续前往(API)。
(这个警告是为了避免在你的主机上安装受信任的 CA 而作出的取舍。如果想要
从头重新生成证书,可以通过 `make clean` 清除卷,下一次
执行 `make up` 时就会生成全新的证书。)
## 查看攻击
标签:CSRF, Docker, MITM代理, Web安全, 安全防御评估, 安全靶场, 测试用例, 版权保护, 自定义脚本, 蓝队分析, 请求拦截