一个用于学习和演示OWASP Top 10安全漏洞的完整实验环境,包含前端React应用和后端Spring Boot API。
本项目是一个教育性质的Web安全漏洞演示平台,旨在帮助开发者和安全研究人员:
- 理解常见的Web安全漏洞
- 学习漏洞的利用方法
- 掌握安全防护措施
- 提高Web应用安全意识
- XSS (跨站脚本攻击) - 反射型、存储型、DOM型
- SQL注入 - 登录绕过、UNION注入、盲注
- SSRF (服务器端请求伪造) - 内网探测、文件读取
- XXE (XML外部实体注入) - 文件读取、SSRF、DoS攻击
- RCE (远程代码执行) - 命令注入、系统命令执行
- IDOR 未授权直接对象引用
- Mass Assignment 过度赋值
- Open Redirect 开放重定向
- File Upload + Path Traversal 文件上传与路径遍历
- 不安全反序列化 (Java)
- 不安全 JWT (alg=none)
- ReDoS 正则拒绝服务
- React 18 - 现代化前端框架
- Ant Design - 企业级UI组件库
- Vite - 快速构建工具
- Axios - HTTP客户端
- Spring Boot 2.3.12 - Java企业级框架
- Spring Security - 安全框架
- H2 Database - 内存数据库
- JPA/Hibernate - ORM框架
- Maven - 项目管理工具
- Java 8+ (推荐使用JDK 8)
- Node.js 16+
- npm 或 yarn
- Git
git clone https://github.com/your-username/owasp-vulnlab.git
cd owasp-vulnlabcd backend
# 设置JAVA_HOME (macOS示例)
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home
# 启动Spring Boot应用
mvn clean compile spring-boot:run后端服务将在 http://localhost:8080 启动
cd frontend
# 安装依赖
npm install
# 启动开发服务器
npm run dev前端应用将在 http://localhost:5173 启动(默认端口)
- 管理员:
admin/admin123 - 普通用户:
john/password123jane/qwertybob/123456alice/password
访问 http://localhost:5173 使用图形界面进行漏洞测试(左侧菜单包含 SQLi/XSS/SSRF/XXE/RCE;“更多漏洞” 页面包含新增漏洞)
参考 POC_测试手册.md 文件,使用curl命令进行API测试
所有接口基址为 http://localhost:8080/api。
SQL 注入
- 产生点
- 直接拼接凭据:
backend/src/main/java/com/owaspvulnlab/vulnerability/sqli/SqlInjectionService.java:34-41 - 组合 LIKE 查询:
backend/src/main/java/com/owaspvulnlab/vulnerability/sqli/SqlInjectionService.java:78-83 - ID拼接查询:
backend/src/main/java/com/owaspvulnlab/vulnerability/sqli/SqlInjectionService.java:105-110
- 直接拼接凭据:
- 触发
- 登录绕过:
POST /sqli/vulnerable/login,username=admin' OR '1'='1' -- - 联合查询:
GET /sqli/vulnerable/search?keyword=' UNION SELECT id,username,password,email,role,secret FROM users -- - 错误/盲注:
GET /sqli/vulnerable/user/1' AND (SELECT COUNT(*) FROM users) > 0 --
- 登录绕过:
- 修复
- 使用参数化查询:
backend/src/main/java/com/owaspvulnlab/vulnerability/sqli/SqlInjectionService.java:131-139
- 使用参数化查询:
XSS
- 产生点
- 反射型:直接返回输入
backend/src/main/java/com/owaspvulnlab/vulnerability/xss/XssService.java:21-27 - 存储型:原样入库
backend/src/main/java/com/owaspvulnlab/vulnerability/xss/XssService.java:39-47 - DOM 型:拼接脚本
backend/src/main/java/com/owaspvulnlab/vulnerability/xss/XssService.java:76-85
- 反射型:直接返回输入
- 触发
- 反射型:
GET /xss/reflected?input=<script>alert('XSS')</script> - 存储型:提交
POST /xss/stored/comment然后GET /xss/stored/comments - DOM 型:前端页面
/xss执行注入片段
- 反射型:
- 修复
- 输出转义、内容安全渲染(示例:
HtmlUtils)
- 输出转义、内容安全渲染(示例:
SSRF
- 产生点
- 任意 URL 直连:
backend/src/main/java/com/owaspvulnlab/vulnerability/ssrf/SsrfService.java:49-56 - 图片代理直连:
backend/src/main/java/com/owaspvulnlab/vulnerability/ssrf/SsrfService.java:85-93 - 文件下载直连:
backend/src/main/java/com/owaspvulnlab/vulnerability/ssrf/SsrfService.java:136-144
- 任意 URL 直连:
- 触发
GET /ssrf/vulnerable/fetch?url=http://169.254.169.254/latest/meta-data/GET /ssrf/vulnerable/image-proxy?imageUrl=http://example.com/logo.png
- 修复
- 协议/域名白名单与内网IP拒绝:
backend/src/main/java/com/owaspvulnlab/vulnerability/ssrf/SsrfService.java:166-205,209-236
- 协议/域名白名单与内网IP拒绝:
XXE
- 产生点
- DOM4J 默认允许外部实体:
backend/src/main/java/com/owaspvulnlab/vulnerability/xxe/XxeService.java:33-46 - JAXP 默认允许外部实体:
backend/src/main/java/com/owaspvulnlab/vulnerability/xxe/XxeService.java:67-83
- DOM4J 默认允许外部实体:
- 触发
- 文件读取:
POST /xxe/vulnerable/dom4j携带<!ENTITY xxe SYSTEM "file:///etc/hosts"> - SSRF:
POST /xxe/vulnerable/documentbuilder携带SYSTEM "http://127.0.0.1"
- 文件读取:
- 修复
- 禁用实体与外部 DTD:
backend/src/main/java/com/owaspvulnlab/vulnerability/xxe/XxeService.java:116-126
- 禁用实体与外部 DTD:
命令执行 / RCE
- 产生点
- 拼接
ping命令并通过 shell 执行:backend/src/main/java/com/owaspvulnlab/vulnerability/rce/RceService.java:35-48 - 直接执行任意系统命令:
backend/src/main/java/com/owaspvulnlab/vulnerability/rce/RceService.java:90-103 - 文件操作命令拼接:
backend/src/main/java/com/owaspvulnlab/vulnerability/rce/RceService.java:149-166
- 拼接
- 触发
POST /rce/vulnerable/system?command=idPOST /rce/vulnerable/ping?host=127.0.0.1; whoami
- 修复
- 使用参数数组与白名单:
backend/src/main/java/com/owaspvulnlab/vulnerability/rce/RceService.java:221-241,261-306
- 使用参数数组与白名单:
IDOR / 过度赋值
- 产生点
- 未授权读取敏感字段:
backend/src/main/java/com/owaspvulnlab/vulnerability/idor/IdorController.java:18-25 - 绑定实体并持久化(允许改
role/secret):backend/src/main/java/com/owaspvulnlab/vulnerability/idor/IdorController.java:27-45
- 未授权读取敏感字段:
- 触发
GET /idor/user/1POST /idor/user/update提交敏感字段修改
- 修复
- 资源级鉴权与字段白名单
开放重定向
- 产生点
- 直接拼接跳转目标:
backend/src/main/java/com/owaspvulnlab/vulnerability/redirect/RedirectController.java:11-17
- 直接拼接跳转目标:
- 触发
GET /redirect?target=http://example.com
- 修复
- 目标白名单与相对路径跳转
文件上传 / 路径遍历
- 产生点
- 原样保存用户文件名:
backend/src/main/java/com/owaspvulnlab/vulnerability/upload/UploadController.java:17-27 - 任意路径读取:
backend/src/main/java/com/owaspvulnlab/vulnerability/upload/UploadController.java:29-36
- 原样保存用户文件名:
- 触发
POST /upload/file表单上传GET /upload/read?path=../../../../etc/hosts
- 修复
- 路径规范化与存储目录限制、MIME/扩展校验
不安全反序列化(Java)
- 产生点
- 反序列化任意对象:
backend/src/main/java/com/owaspvulnlab/vulnerability/deserialization/DeserializationController.java:20-27 - 反序列化回调副作用:
backend/src/main/java/com/owaspvulnlab/vulnerability/deserialization/EvilObject.java:17-23
- 反序列化任意对象:
- 触发
GET /deser/payload?msg=pwn获取 Base64,再POST /deser/vulnerable提交
- 修复
- 使用安全的序列化格式(JSON/Protobuf),或启用反序列化类型白名单
不安全 JWT(alg=none)
- 产生点
- 颁发无签名 token:
backend/src/main/java/com/owaspvulnlab/vulnerability/jwt/JwtController.java:19-27 - 解析不校验签名:
backend/src/main/java/com/owaspvulnlab/vulnerability/jwt/JwtController.java:30-41
- 颁发无签名 token:
- 触发
POST /jwt/login获取 token,再GET /jwt/me?token=...
- 修复
- 强制签名算法与密钥校验,拒绝
alg=none
- 强制签名算法与密钥校验,拒绝
ReDoS 正则拒绝服务
- 产生点
- 灾难性回溯正则:
backend/src/main/java/com/owaspvulnlab/vulnerability/regex/RegexController.java:14-19
- 灾难性回溯正则:
- 触发
GET /regex/test?input=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- 修复
- 使用线性回溯的正则或设置超时
CSRF(跨站请求伪造)
- 产生点
- 无 CSRF Token 的状态修改:
backend/src/main/java/com/owaspvulnlab/vulnerability/csrf/CsrfController.java:41-61 - 登录设置可跨站使用的
sessioncookie:backend/src/main/java/com/owaspvulnlab/vulnerability/csrf/CsrfController.java:18-30
- 无 CSRF Token 的状态修改:
- 触发
- 先
POST /csrf/login?user=alice,再从任意站点发起POST /csrf/transfer?to=attacker&amount=100
- 先
- 修复
- 同步/双重提交 CSRF Token,
SameSite与严格 CORS + 认证策略
- 同步/双重提交 CSRF Token,
SSTI(服务端模板注入)
- 产生点
- 处理用户提供的模板字符串:
backend/src/main/java/com/owaspvulnlab/vulnerability/ssti/SstiController.java:26-35
- 处理用户提供的模板字符串:
- 触发
POST /ssti/render,{"template":"Hello [[${T(java.lang.System).getProperty('os.name')}]]"}
- 修复
- 禁止动态模板渲染或限制表达式评估能力
NoSQL 注入(模拟)
- 产生点
- 不安全正则:
backend/src/main/java/com/owaspvulnlab/vulnerability/nosql/NosqlController.java:29-46 $where动态执行:backend/src/main/java/com/owaspvulnlab/vulnerability/nosql/NosqlController.java:49-73
- 不安全正则:
- 触发
GET /nosql/regex?q=.*或GET /nosql/where?code=username.length()>2
- 修复
- 构建安全查询、禁用动态执行与用户控制的正则
Clickjacking(点击劫持)
- 产生点
- 可被嵌入的敏感页面:
backend/src/main/java/com/owaspvulnlab/vulnerability/clickjacking/ClickjackingController.java:13-22
- 可被嵌入的敏感页面:
- 触发
- 在任意页面用
<iframe src="http://localhost:8080/api/clickjacking/vulnerable"></iframe>叠加诱导点击
- 在任意页面用
- 修复
- 设置
X-Frame-Options: DENY或Content-Security-Policy: frame-ancestors 'none'(示例:/safe)
- 设置
HTTP 请求走私(模拟)
- 产生点
- 错误的长度/分块优先级解析:
backend/src/main/java/com/owaspvulnlab/vulnerability/smuggling/SmugglingController.java:21-31,31-47
- 错误的长度/分块优先级解析:
- 触发
POST /smuggle/parse原始文本携带Content-Length与Transfer-Encoding: chunked混合,观察解析结果
- 修复
- 遵循正确的解析优先级,在代理/网关层统一与规范化请求头
owasp-vulnlab/
├── README.md # 项目说明文档
├── POC_测试手册.md # 详细的POC测试指南
├── backend/ # Spring Boot后端
│ ├── src/main/java/
│ │ └── com/owaspvulnlab/
│ │ ├── OwaspVulnlabApplication.java
│ │ ├── config/ # 配置类
│ │ ├── entity/ # 数据实体
│ │ └── vulnerability/ # 漏洞演示模块
│ │ ├── xss/ # XSS漏洞
│ │ ├── sqli/ # SQL注入
│ │ ├── ssrf/ # SSRF漏洞
│ │ ├── xxe/ # XXE漏洞
│ │ ├── rce/ # RCE漏洞
│ │ ├── idor/ # IDOR与过度赋值
│ │ ├── redirect/ # 开放重定向
│ │ ├── upload/ # 文件上传与路径遍历
│ │ ├── deserialization/ # 不安全反序列化
│ │ ├── jwt/ # 不安全JWT
│ │ ├── regex/ # ReDoS
│ │ ├── csrf/ # CSRF
│ │ ├── ssti/ # SSTI
│ │ ├── nosql/ # NoSQL注入(模拟)
│ │ ├── clickjacking/ # 点击劫持
│ │ └── smuggling/ # 请求走私(模拟)
└── frontend/ # React前端
│ └── pom.xml # Maven配置
└── frontend/ # React前端
├── src/
│ ├── components/ # 通用组件
│ ├── pages/ # 页面组件(含 More 页面)
│ └── App.jsx # 主应用组件
└── package.json # npm配置
- 仅用于教育目的: 本项目仅用于学习和研究Web安全
- 禁止恶意使用: 不得用于攻击真实系统
- 测试环境限制: 仅在授权的测试环境中使用
- 遵守法律法规: 使用时请遵守当地法律法规
- 包含安全和不安全两种实现方式
- 详细的安全防护措施说明
- 完整的漏洞修复示例
- 安全编码最佳实践
欢迎提交Issue和Pull Request来改进项目:
- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
- OWASP Top 10 - 安全漏洞参考
- Spring Boot - 后端框架
- React - 前端框架
- Ant Design - UI组件库
如有问题或建议,请通过以下方式联系:
- 提交 GitHub Issue
- 发送邮件至: baozongwi@outlook.com