PolarCTF靶场 WEB方向java题目全题解
字数 3414 2025-08-29 08:29:58

PolarCTF靶场WEB方向Java题目全解析

1. ezjava (2023秋季个人挑战赛)

漏洞类型: SPEL表达式注入

解题要点:

  • 题目无回显,需要外带flag
  • 直接构造SPEL表达式进行注入攻击

利用方法:

  • 构造恶意SPEL表达式实现命令执行
  • 通过DNS外带或其他方式获取flag

flag: flag{cab20046-3945-f9f4-7125-7ca2703a31df}

2. CB链 (2023冬季个人挑战赛)

漏洞类型: 反序列化漏洞(CommonsBeanutils链)

解题要点:

  • user路由接收base64解码后的user参数并反序列化
  • 存在CC和CB依赖
  • 环境不出网,需打内存马

利用方法:

  1. 构造类加载器(MyClassLoader)动态加载字节码
  2. 准备内存马内容,base64加密后放入类加载器
  3. 将类加载器和内存马一起序列化打入
  4. 通过header进行RCE

内存马实现:

  • 编写自定义类加载器加载恶意字节码
  • 实现命令执行功能并通过header返回结果

flag: flag{cab20046-3945-f9f4-7125-7ca2703a31df}

3. Fastjson (2024春季个人挑战赛)

漏洞类型: Fastjson反序列化(1.2.24版本)

解题要点:

  • 环境不出网,需打TemplatesImpl+内存马
  • 利用TemplatesImpl加载恶意字节码

利用方法:

  1. 构造TemplatesImpl链的payload
  2. 结合内存马实现命令执行
  3. 通过特定header触发执行

payload构造:

  • 使用TemplatesImpl加载恶意类
  • 结合内存马实现回显

flag: flag{d05ce4e30c9a11638763758a2bc44c29}

4. ezJson (2024夏季个人挑战赛)

漏洞类型: Fastjson反序列化(1.2.83版本)

解题要点:

  • 存在fastjson1.2.83依赖
  • 环境不出网,需打内存马
  • 使用classloader加载恶意类

利用方法:

  1. 构造fastjson原生反序列化payload
  2. 使用类加载器加载内存马
  3. 实现命令执行功能

flag: flag{410214d0adf4af64394160a7c55e90e4}

5. CC链 (2024夏季个人挑战赛)

漏洞类型: Commons Collections反序列化(3.1版本)

解题要点:

  • 存在commons-collections 3.1依赖
  • 使用CC6链打内存马
  • 环境不出网

利用方法:

  1. 构造CC6链的payload
  2. 结合内存马实现命令执行
  3. 通过特定方式触发执行

内存马实现:

  • 利用CC6链触发恶意类加载
  • 实现命令执行回显

flag: flag{cf5fa591bc52e50f25b6269e8d690c13}

6. FastJsonBCEL (2024夏季个人挑战赛)

漏洞类型: Fastjson+Tomcat-dbcp BCEL注入

解题要点:

  • 同时存在fastjson和tomcat-dbcp依赖
  • 利用fastjson打BCEL注入
  • 漏洞触发点为JSONObject.parse(jsonString)

payload构造:

{
  "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource",
  "driverClassLoader": {
    "@type": "com.sun.org.apache.bcel.internal.util.ClassLoader"
  },
  "driverClassName": "
$$
BCEL
$$
..."
}

内存马实现:

  • 将恶意类编译为BCEL格式
  • 通过BasicDataSource加载执行

flag: flag{1e96bc6d84ae94cb180a80e1f808f455}

7. SnakeYaml (2024秋季个人挑战赛)

漏洞类型: SnakeYaml反序列化+C3P0 HEX链

解题要点:

  • 存在C3P0和snakeyaml依赖
  • 使用HEX链实现RCE
  • 选择CC6链打内存马

利用方法:

  1. 构造HEX格式的恶意类
  2. 通过SnakeYaml反序列化触发
  3. 结合CC6链加载内存马

poc构造:

  • 将恶意类转换为HEX格式
  • 通过特定yaml结构触发加载

flag: flag{aab7425dd1d2ab847489b0c710d0a43b}

8. PolarOA (2024春季个人挑战赛)

漏洞类型: Shiro反序列化

解题要点:

  • 存在rememberMe=deleteMe标志字段
  • cookie长度限制3500字节
  • 使用DynamicClassGenerator写短内存马
  • 打CB链

绕过限制:

  • 构造精简版内存马
  • 使用DynamicClassGenerator减少payload大小

poc构造:

  • 针对3500字节限制优化payload
  • 使用CB链触发内存马加载

flag: flag{d50d0c23-262d-4a16-1046-e55b27ff8f6b}

9. PolarOA2.0 (2024夏季个人挑战赛)

漏洞类型: Shiro反序列化(非默认密钥)

解题要点:

  • rememberMe字段存在但非默认密钥
  • 爆破用户密码为admin/admin123
  • 发现actuator泄露
  • 下载heapdump分析得到shirokey
  • 加密模式为AES GCM
  • Shiro版本1.8.0对应commons-beanutils 1.9.4
  • cookie长度限制3000字节

利用步骤:

  1. 爆破获取管理员凭证
  2. 扫描发现/actuator/heapdump
  3. 分析heapdump获取shirokey: /G7eW8Ibb3w3Mh3k1ZzIdA==
  4. 构造精简版payload适应3000字节限制

flag: flag{7ca96d0ede726d6a4d68b0c0d7456e11}

10. 一写一个不吱声 (2024秋季个人挑战赛)

漏洞类型: AspectJWeaver任意文件写入+反序列化

解题要点:

  • 存在aspectjweaver 1.9.5依赖
  • 无CC依赖,利用题目自带的UserBean类readObject方法
  • 写入恶意字节码到Java目录
  • 路径: /usr/lib/jvm/java-8-openjdk-amd64/jre/classes/
  • 通过反序列化触发恶意readObject

利用方法:

  1. 构造恶意类重写readObject方法
  2. 在readObject中嵌入BCEL格式的回显马
  3. 利用poc将恶意类写入指定目录
  4. 再次反序列化触发执行

回显马实现:

  • 编写命令执行类
  • 编译为BCEL格式嵌入

poc构造:

  • 利用AspectJWeaver文件写入漏洞
  • 写入恶意类到可加载路径

flag: flag{534563e5d4b3db6067b2e708354dbf40}

11. ezUtil (2024冬季个人挑战赛)

漏洞类型: 任意类方法调用+文件上传漏洞

解题要点:

  • /admin/api/GetClassValue路由可反射调用任意类方法
  • FileUtil.generateZip可上传任意zip文件
  • unZipFile存在目录穿越漏洞
  • Filter限制需绕过

利用方法:

  1. 绕过Filter限制: 使用/admin;admin/api/GetClassValue
  2. 上传恶意字节码到JAVA_HOME
  3. 通过反射调用加载恶意类
  4. 使用BCELClassLoader加载回显马

Filter绕过:

  • handleFilter检查admin/后的../;
  • AdminFilter检查路由以/admin/开头
  • 使用/admin;admin/绕过

BCELClassLoader实现:

  • 将回显马转为BCEL格式
  • 嵌入反射调用脚本

exp构造:

  1. 构造恶意zip文件包含目录穿越路径
  2. 上传到指定位置
  3. 通过反射调用加载执行

flag: flag{2ccba6a1b34ec052f3510a2ef297e420}

总结

本系列题目涵盖了Java Web安全中的多种漏洞类型和利用技术,包括:

  1. 表达式注入(SPEL)
  2. 多种反序列化链(CB、CC、Fastjson、SnakeYaml)
  3. Shiro反序列化
  4. 任意文件写入+类加载
  5. 反射调用+文件上传组合漏洞

关键防御建议:

  • 及时更新组件版本
  • 禁用不必要的反序列化功能
  • 对用户输入进行严格过滤
  • 限制文件上传路径和内容
  • 使用安全配置加固框架
PolarCTF靶场WEB方向Java题目全解析 1. ezjava (2023秋季个人挑战赛) 漏洞类型 : SPEL表达式注入 解题要点 : 题目无回显,需要外带flag 直接构造SPEL表达式进行注入攻击 利用方法 : 构造恶意SPEL表达式实现命令执行 通过DNS外带或其他方式获取flag flag : flag{cab20046-3945-f9f4-7125-7ca2703a31df} 2. CB链 (2023冬季个人挑战赛) 漏洞类型 : 反序列化漏洞(CommonsBeanutils链) 解题要点 : user路由接收base64解码后的user参数并反序列化 存在CC和CB依赖 环境不出网,需打内存马 利用方法 : 构造类加载器(MyClassLoader)动态加载字节码 准备内存马内容,base64加密后放入类加载器 将类加载器和内存马一起序列化打入 通过header进行RCE 内存马实现 : 编写自定义类加载器加载恶意字节码 实现命令执行功能并通过header返回结果 flag : flag{cab20046-3945-f9f4-7125-7ca2703a31df} 3. Fastjson (2024春季个人挑战赛) 漏洞类型 : Fastjson反序列化(1.2.24版本) 解题要点 : 环境不出网,需打TemplatesImpl+内存马 利用TemplatesImpl加载恶意字节码 利用方法 : 构造TemplatesImpl链的payload 结合内存马实现命令执行 通过特定header触发执行 payload构造 : 使用TemplatesImpl加载恶意类 结合内存马实现回显 flag : flag{d05ce4e30c9a11638763758a2bc44c29} 4. ezJson (2024夏季个人挑战赛) 漏洞类型 : Fastjson反序列化(1.2.83版本) 解题要点 : 存在fastjson1.2.83依赖 环境不出网,需打内存马 使用classloader加载恶意类 利用方法 : 构造fastjson原生反序列化payload 使用类加载器加载内存马 实现命令执行功能 flag : flag{410214d0adf4af64394160a7c55e90e4} 5. CC链 (2024夏季个人挑战赛) 漏洞类型 : Commons Collections反序列化(3.1版本) 解题要点 : 存在commons-collections 3.1依赖 使用CC6链打内存马 环境不出网 利用方法 : 构造CC6链的payload 结合内存马实现命令执行 通过特定方式触发执行 内存马实现 : 利用CC6链触发恶意类加载 实现命令执行回显 flag : flag{cf5fa591bc52e50f25b6269e8d690c13} 6. FastJsonBCEL (2024夏季个人挑战赛) 漏洞类型 : Fastjson+Tomcat-dbcp BCEL注入 解题要点 : 同时存在fastjson和tomcat-dbcp依赖 利用fastjson打BCEL注入 漏洞触发点为JSONObject.parse(jsonString) payload构造 : 内存马实现 : 将恶意类编译为BCEL格式 通过BasicDataSource加载执行 flag : flag{1e96bc6d84ae94cb180a80e1f808f455} 7. SnakeYaml (2024秋季个人挑战赛) 漏洞类型 : SnakeYaml反序列化+C3P0 HEX链 解题要点 : 存在C3P0和snakeyaml依赖 使用HEX链实现RCE 选择CC6链打内存马 利用方法 : 构造HEX格式的恶意类 通过SnakeYaml反序列化触发 结合CC6链加载内存马 poc构造 : 将恶意类转换为HEX格式 通过特定yaml结构触发加载 flag : flag{aab7425dd1d2ab847489b0c710d0a43b} 8. PolarOA (2024春季个人挑战赛) 漏洞类型 : Shiro反序列化 解题要点 : 存在rememberMe=deleteMe标志字段 cookie长度限制3500字节 使用DynamicClassGenerator写短内存马 打CB链 绕过限制 : 构造精简版内存马 使用DynamicClassGenerator减少payload大小 poc构造 : 针对3500字节限制优化payload 使用CB链触发内存马加载 flag : flag{d50d0c23-262d-4a16-1046-e55b27ff8f6b} 9. PolarOA2.0 (2024夏季个人挑战赛) 漏洞类型 : Shiro反序列化(非默认密钥) 解题要点 : rememberMe字段存在但非默认密钥 爆破用户密码为admin/admin123 发现actuator泄露 下载heapdump分析得到shirokey 加密模式为AES GCM Shiro版本1.8.0对应commons-beanutils 1.9.4 cookie长度限制3000字节 利用步骤 : 爆破获取管理员凭证 扫描发现/actuator/heapdump 分析heapdump获取shirokey: /G7eW8Ibb3w3Mh3k1ZzIdA== 构造精简版payload适应3000字节限制 flag : flag{7ca96d0ede726d6a4d68b0c0d7456e11} 10. 一写一个不吱声 (2024秋季个人挑战赛) 漏洞类型 : AspectJWeaver任意文件写入+反序列化 解题要点 : 存在aspectjweaver 1.9.5依赖 无CC依赖,利用题目自带的UserBean类readObject方法 写入恶意字节码到Java目录 路径: /usr/lib/jvm/java-8-openjdk-amd64/jre/classes/ 通过反序列化触发恶意readObject 利用方法 : 构造恶意类重写readObject方法 在readObject中嵌入BCEL格式的回显马 利用poc将恶意类写入指定目录 再次反序列化触发执行 回显马实现 : 编写命令执行类 编译为BCEL格式嵌入 poc构造 : 利用AspectJWeaver文件写入漏洞 写入恶意类到可加载路径 flag : flag{534563e5d4b3db6067b2e708354dbf40} 11. ezUtil (2024冬季个人挑战赛) 漏洞类型 : 任意类方法调用+文件上传漏洞 解题要点 : /admin/api/GetClassValue 路由可反射调用任意类方法 FileUtil.generateZip可上传任意zip文件 unZipFile存在目录穿越漏洞 Filter限制需绕过 利用方法 : 绕过Filter限制: 使用 /admin;admin/api/GetClassValue 上传恶意字节码到JAVA_ HOME 通过反射调用加载恶意类 使用BCELClassLoader加载回显马 Filter绕过 : handleFilter检查 admin/ 后的 ../ 和 ; AdminFilter检查路由以 /admin/ 开头 使用 /admin;admin/ 绕过 BCELClassLoader实现 : 将回显马转为BCEL格式 嵌入反射调用脚本 exp构造 : 构造恶意zip文件包含目录穿越路径 上传到指定位置 通过反射调用加载执行 flag : flag{2ccba6a1b34ec052f3510a2ef297e420} 总结 本系列题目涵盖了Java Web安全中的多种漏洞类型和利用技术,包括: 表达式注入(SPEL) 多种反序列化链(CB、CC、Fastjson、SnakeYaml) Shiro反序列化 任意文件写入+类加载 反射调用+文件上传组合漏洞 关键防御建议: 及时更新组件版本 禁用不必要的反序列化功能 对用户输入进行严格过滤 限制文件上传路径和内容 使用安全配置加固框架