漏洞复现
部署脆弱服务
下载struts-2.5.12-all.zip,将 struts-2.5.12/src/apps/ 目录下的 rest-showcase 导入 idea,再配置,如下:
运行后可以看到一个Struts2的一个Demo,大概提供一个订单服务,提供增删改查:
生成攻击载荷
使用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,放之后服务器报错并且弹出计算器:
漏洞分析
先看org.apache.struts2.rest.ContentTypeInterceptor.intercept()方法,它是客户端每次发送html请求的入口:
向下调两步,可以看到selector对application/xml选择的handler是XStreamHandler,再看到60行,它调用了XStreamHandler.toObject方法,这里跟进去看一下:
调用XStream.fromXML():
umarshal是一个将已经序列化的xml文本反序列化成Java对象的函数,而先前的marshalsec就是将装配好POP链的类序列化成xml。