Skip to content

Latest commit

History

131 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

CodeSecOne - Java 代码审计学习靶场

一个基于 Spring Boot 的故意存在漏洞的 Java Web 应用,专为学习和练习 Java 代码安全审计 而设计。项目参考了 java-sec-codeHello-java-Sec ,并在此基础上进行了扩展和完善。这次主要是 宇子哥 帮我把 ReamMe 更新了一下。前端页面暂时未完善,主要还是直接看后端controller代码逻辑进行学习,前端页面以后再完善吧。

每个漏洞模块均提供 漏洞触发接口安全修复接口,方便对比学习漏洞原理与防御方式。


目录


项目架构

┌─────────────────────────────────────────────────────┐
│ Spring Boot 2.4.1 │
├───────────┬──────────┬────────────┬──────────────────┤
│ Thymeleaf │ MyBatis │ Shiro │ Swagger │
│ (模板引擎) │ (ORM) │ (认证鉴权) │ (API文档) │
├───────────┴──────────┴────────────┴──────────────────┤
│ 交互式前端 │
│ 个别漏洞分类页面 │
├─────────────────────────────────────────────────────┤
│ Controller 层 │
│ SQLi | XSS | RCE | SSTI | SpEL | XXE | SSRF │
│ 反序列化 | JNDI | 文件操作 | URL跳转 | CORS/JSONP │
│ JWT | 越权 | XPath | IP伪造 | DoS | 未授权访问 │
├─────────────────────────────────────────────────────┤
│ Service 层 / Mapper 层 / Entity 层 │
├─────────────────────────────────────────────────────┤
│ MySQL 数据库 │
└─────────────────────────────────────────────────────┘

技术栈

类别技术版本说明
核心框架Spring Boot2.4.1故意降级以暴露 Thymeleaf SSTI 漏洞
模板引擎Thymeleaf-SSTI 漏洞演示
ORMMyBatis2.2.2SQL 注入演示
数据库MySQL8.0.28-
认证Apache Shiro1.2.4Shiro-550 反序列化漏洞 (CVE-2016-4437)
认证JWTjava-jwt 4.2.1 / jjwt 0.9.1JWT 安全演示
API 文档Swagger (SpringFox)3.0.0未授权 API 暴露演示
前端框架Bootstrap 55.3.0 (CDN)响应式 UI,无需构建

故意引入的漏洞依赖

依赖版本对应漏洞
Fastjson1.2.24 / 1.2.41反序列化 RCE
Log4j2.8.2Log4Shell (CVE-2021-44228)
Jackson-databind2.11.0反序列化漏洞
Commons Collections3.2.1CC1-CC6 反序列化链
Commons Collections44.0CC4 反序列化链
XStream1.4.14XML 反序列化 RCE
Hessian4.0.63Hessian 反序列化
ROME1.7.0ROME 反序列化链
Groovy2.5.6GroovyShell 代码执行
xmlbeam1.4.14XXE 漏洞
Commons JXPath1.3CVE-2022-41852

前端界面

访问 http://127.0.0.1:28888/ 可看到 index.html 页面的 漏洞展示;

访问 http://127.0.0.1:28888/login 默认账号:admin / 123456


漏洞模块概览

漏洞分类

  • Injection 注入漏洞 -- SQLi、XSS、SpEL、XPath、JNDI、SSTI
  • Remote Code Execution -- RCE、Reflection
  • Network & Protocol -- XXE、SSRF、CORS/JSONP、URL Redirect、JWT
  • File Operations -- 文件上传/下载/读取
  • Access Control -- 越权、IP 伪造、信息泄露
  • Advanced Attacks -- 反序列化、ReDoS

项目包含 近 20 类漏洞,每类漏洞均包含 /vul (漏洞) 和 /safe (安全) 两种实现:

#漏洞类型Controller 路径关键漏洞点
1SQL 注入/SQLI/Statement 拼接、${} 占位符、ORDER BY 注入
2XSS/XSS/反射型、存储型 (Cookie)
3RCE 远程命令执行/RCE/Runtime.exec、ProcessBuilder、GroovyShell、ScriptEngine
4SSTI 模板注入/SSTI/Thymeleaf 模板路径可控、@PathVariable 注入
5SpEL 表达式注入/SpEL/StandardEvaluationContext 任意代码执行
6XXE 外部实体注入/XXE/XMLReader、SAXParser、SAXReader、xmlbeam
7SSRF 服务端请求伪造/SSRF/URLConnection、HttpURLConnection
8反序列化/Deserialize/Fastjson、Jackson、Shiro-550、XStream、YAML、Hessian、ROME、CC 链
9JNDI 注入/JNDI/InitialContext.lookup()、LDAP/RMI
10文件操作/filepath/路径穿越、任意文件读取/上传/下载
11URL 跳转/Redirect/redirect:、sendRedirect、setHeader("Location")
12CORS/JSONP/CORS//jsonp/Origin 反射、通配符 *、JSONP 劫持
13JWT/jwt/弱密钥、Cookie 存储
14越权访问/BAC/水平/垂直越权、Tomcat URI 规范化绕过
15XPath 注入/XPath/字符串拼接注入、JXPath CVE-2022-41852
16IP 伪造/ip//XFF/X-Forwarded-For / X-Real-IP 伪造
17DoS 拒绝服务/DOS/正则回溯导致 ReDoS
18未授权访问/Unauth/拦截器配置不当、Swagger UI 暴露
19高级攻击/AdvancedAttack/ClassLoader 远程类加载、反射机制利用

部署方式

前置要求

工具版本要求说明
JDK1.8 (必须)高版本不兼容
Maven3.6+编译构建
MySQL8.0+数据库

方式一:手动编译部署

适合需要修改代码或调试的场景。

# 1. 确认 JDK 版本
java -version # 需要 1.8# 2. 初始化数据库
mysql -u root -p < src/main/resources/db.sql
# 或手动执行 src/main/resources/db.sql 中的 SQL 语句# 3. 修改数据库配置(如需要)# 编辑 src/main/resources/application.properties# 修改 spring.datasource.url / username / password# 4. 编译打包
mvn clean package -DskipTests
# 5. 运行
java -jar target/CodeSecOne-0.0.1-SNAPSHOT.jar
# 5.1 如需 JNDI 漏洞利用,添加 JVM 参数:
java -Dcom.sun.jndi.rmi.object.trustURLCodebase=true -jar target/CodeSecOne-0.0.1-SNAPSHOT.jar
# 5.2 Maven 直接运行(跳过打包)
mvn spring-boot:run

方式二:IDE 直接运行

适合开发调试。

  1. 使用 IntelliJ IDEA 或 Eclipse 导入项目(Maven 项目)
  2. 确保 Project SDK 设置为 JDK 1.8
  3. 确保 MySQL 已启动并执行了 db.sql
  4. 运行主类 com.madaha.codesecone.CodeSecOneApplication
  5. 运行启动后访问:

IntelliJ IDEA 提示:如需 JNDI 漏洞利用,在 Run Configuration 的 VM options 中添加: -Dcom.sun.jndi.rmi.object.trustURLCodebase=true

数据库初始化

如果使用已有的 MySQL 实例,需要手动初始化数据库:

-- 创建数据库和表
source src/main/resources/db.sql;
-- 或手动执行:CREATEDATABASEIF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
USE test;
CREATETABLE `users` (
`id`int(11) unsigned NOT NULL AUTO_INCREMENT,
`user`varchar(50) NOT NULL,
`pass`varchar(128) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO`users`VALUES (1, 'zhangwei', '123456');
INSERT INTO`users`VALUES (2, 'admin', 'password');
CREATETABLE `auth` (
`id`int(6) unsigned NOT NULL AUTO_INCREMENT,
`user`varchar(50) NOT NULL,
`ip`varchar(50) NOT NULL,
`date`varchar(60) NOT NULL,
PRIMARY KEY (`id`)
);

默认数据库配置 (application.properties):

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

项目结构

CodeSecOne/
├── pom.xml # Maven 依赖配置
├── README.md
│
├── src/main/java/com/madaha/codesecone/
│ ├── CodeSecOneApplication.java # Spring Boot 入口
│ ├── controller/ # 漏洞演示控制器 (按漏洞类型分包)
│ │ ├── Login.java # 登录认证
│ │ ├── sqli/ # SQL 注入 (JDBC / MyBatis / Hibernate)
│ │ ├── xss/ # XSS 跨站脚本
│ │ ├── rce/ # 远程命令执行 (Runtime / ProcessBuilder / Groovy / ScriptEngine / YAML)
│ │ ├── ssti/ # 服务端模板注入
│ │ ├── spel/ # SpEL 表达式注入
│ │ ├── xxe/ # XML 外部实体注入
│ │ ├── ssrf/ # 服务端请求伪造
│ │ ├── jndi/ # JNDI 注入 (LDAP/RMI)
│ │ ├── filepath/ # 文件操作漏洞 (上传/下载/读取/列目录)
│ │ ├── url/ # URL 跳转
│ │ ├── sopCors/ # CORS/JSONP
│ │ ├── jwt/ # JWT 安全
│ │ ├── BAC/ # 越权访问
│ │ ├── xpath/ # XPath 注入
│ │ ├── ipforge/ # IP 伪造
│ │ ├── ddos/ # DoS 拒绝服务
│ │ ├── unauth/ # 未授权访问 / 信息泄露
│ │ └── AdvancedAttack/ # 高级攻击 (反序列化 / ClassLoader / 反射)
│ ├── config/ # 配置类
│ │ ├── MvcConfigurer.java # MVC 配置 (拦截器、视图映射)
│ │ ├── ShiroConfig.java # Shiro 认证配置
│ │ ├── SwaggerConfig.java # Swagger API 文档
│ │ ├── FilterConfig.java # Servlet 过滤器注册
│ │ └── ServletConfig.java # Servlet 端点注册
│ ├── entity/ # 实体类 (User, CMDJson)
│ ├── mapper/ # MyBatis Mapper 接口
│ ├── service/ # 业务逻辑
│ ├── util/ # 工具类 (SecurityUtils, JwtUtils, etc.)
│ ├── Filter/ # Servlet 过滤器实现
│ └── Servlet/ # Servlet 端点实现
│
├── src/main/resources/
│ ├── application.properties # 应用配置 (端口 28888、数据库、Thymeleaf)
│ ├── db.sql # 数据库初始化脚本
│ ├── mapper/mapper.xml # MyBatis XML 映射
│ ├── ESAPI.properties # OWASP ESAPI 配置
│ │
│ ├── templates/ # Thymeleaf 模板
│ │ ├── index.html # Dashboard 首页
│ │ ├── login.html # 登录页面
│ │ ├── upload.html # 文件上传页面
│ │ ├── shiroLogin.html # Shiro 登录页面
│ │ ├── amis-rce-page.html # Baidu amis RCE 演示
│ │ ├── commons/
│ │ │ ├── commons.html # commons 测试页面
│ │ │ ├── 401.html # 401 错误页面
│ │ │ └── 403.html # 403 错误页面
│ │
│ └── static/
│ ├── img/dog.png # Logo 图片
│ ├── evil/ # 预置漏洞利用 Payload
│ ├── fileUpload/ # 文件上传测试用例
│ └── amis_sdk/ # Baidu amis SDK (前端 RCE 演示)

安全工具类

项目提供了一个统一的安全工具类 SecurityUtils (com.madaha.codesecone.util.SecurityUtils),包含以下防护方法:

方法功能
SQL 注入黑名单过滤关键字检测与过滤
XSS 编码HTML 实体编码
XXE 检测外部实体注入检测
路径穿越过滤URL 解码 + .. 检测
内网 IP 检测SSRF 防护 - 识别内网地址
URL 白名单校验SSRF 防护 - 域名白名单
OS 命令检测RCE 防护 - 检测管道符和命令连接符

注意事项

  1. 仅供学习使用:本项目包含大量真实漏洞,请勿在生产环境或公网环境部署运行。
  2. 网络隔离:建议在本地虚拟机或 Docker 容器中运行,确保网络隔离。
  3. JDK 版本:必须使用 JDK 1.8,高版本可能存在兼容性问题。
  4. Spring Boot 版本:项目故意使用 Spring Boot 2.4.1 (非最新版),以便暴露 Thymeleaf SSTI 等漏洞。
  5. 依赖版本:所有漏洞依赖均为故意引入的特定版本,切勿在实际项目中使用这些版本。
  6. 默认凭据:数据库密码 123456、登录账号 admin/123456 仅用于本地学习环境。

致谢

  • java-sec-code - JoyChou93
  • Hello-java-Sec - j3ers3
  • 宇子哥 - 感谢对 后端逻辑、前端页面 和 ReadMe 的梳理。(我本周四离职,在安全行业从业5年了,准备休息一段时间。再这个离别之际,好哥们还在努力帮我写这“毕业总结”,哈哈哈哈~。~)

免责声明

本项目仅用于安全研究和教学目的。使用者应遵守当地法律法规,不得将本项目用于任何非法用途。因使用本项目造成的任何后果,由使用者自行承担。

About

Java代码审计入门

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages