KoreanHackerTeam
Moderator
fastjson 反序列化任意命令执行漏洞
漏洞原理
- http://xxlegend.com/2017/04/29/title- fastjson 远程反序列化poc的构造和分析/
- https://github.com/shengqi158/fastjson-remote-code-execute-poc
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
中有一个私有属性_bytecodes
,其部分方法会执行这个值中包含的Java字节码。所以,想要使用
TemplatesImpl
的_bytecodes
属性执行任意命令,有几个条件:- 目标网站使用fastjson库解析json
- 解析时设置了
Feature.SupportNonPublicField
,否则不支持传入私有属性 - 目标使用的jdk中存在
TemplatesImpl
类
TemplatesImpl
的利用方法漏洞复现
本环境目录结构如下:- src 本项目源码
- main/java java类
- IndexFilter.java web源码
- Poc.java POC源码
- main/java java类
- pom.xml 配置文件,使用maven可以直接将本项目编译成war包
- exploit.php 读取编译好的POC字节码,并转换成base64
- fastjson-1.0.war 打包好的web环境,可以直接放到tomcat下运行
生成字节码
第一步就是编写一个Java类,在这个类中执行命令。然后编译该类,获得.class文件,获得字节码。修改Poc.java中你想要执行的命令,然后在本目录下使用maven对本项目进行编译,生成
target/classes/Poc.class
:
코드:
|
코드:
|
WEB-INF/classes/Poc.class
。exploit.php中就是读取的这个我已经编译好的class文件。构造POC
生成.class文件后,将该文件的内容进行base64编码,放在json中_bytecodes的值的位置,如下:
코드:
|
코드:
|

使用jdk1.8编译,执行的命令是
touch /tmp/success
,所以在Windows下会执行失败。Windows用户请自己修改Poc.java,生成自己的POC。漏洞利用
目标是一个web应用,访问返回“Hello world”。正常POST一个json,目标会提取json对象中的name和age拼接成一句话返回:
发送步骤二中获取的POC,成功执行命令:


如上图,/tmp/success文件成功被创建。