0%

Java反序列化3:Struts2-052反序列化漏洞分析

漏洞复现

部署脆弱服务

下载struts-2.5.12-all.zip,将 struts-2.5.12/src/apps/ 目录下的 rest-showcase 导入 idea,再配置,如下:

1546071180604

运行后可以看到一个Struts2的一个Demo,大概提供一个订单服务,提供增删改查:

1546071610856

生成攻击载荷

使用marshalsec工具,clone项目后使用mvn clean package编译得到target\marshalsec-0.0.3-SNAPSHOT.jar

生成一个弹出计算器的payload:

1
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.XStream ImageIO "calc" > poc.xml

弹出计算器

选一个先前Burpsuite抓到的Post包,将content-type改为application/xml,body部分改为上面生成的paylod,放之后服务器报错并且弹出计算器:

1546073207368

漏洞分析

先看org.apache.struts2.rest.ContentTypeInterceptor.intercept()方法,它是客户端每次发送html请求的入口:

1546074867834

向下调两步,可以看到selector对application/xml选择的handler是XStreamHandler,再看到60行,它调用了XStreamHandler.toObject方法,这里跟进去看一下:

1546074203978

调用XStream.fromXML():

1546074176680

umarshal是一个将已经序列化的xml文本反序列化成Java对象的函数,而先前的marshalsec就是将装配好POP链的类序列化成xml。

参考链接

  1. struts2 s2-052 漏洞分析
  2. marshalsec