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构造:
{
"@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链打内存马
利用方法:
- 构造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反序列化
- 任意文件写入+类加载
- 反射调用+文件上传组合漏洞
关键防御建议:
- 及时更新组件版本
- 禁用不必要的反序列化功能
- 对用户输入进行严格过滤
- 限制文件上传路径和内容
- 使用安全配置加固框架