Vulnhub官方复现教程
https://vulhub.org/#/environments/fastjson/vuln/
漏洞原理
- http://xxlegend.com/2017/04/29/title-%20fastjson%20%E8%BF%9C%E7%A8%8B%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96poc%E7%9A%84%E6%9E%84%E9%80%A0%E5%92%8C%E5%88%86%E6%9E%90/
- https://github.com/shengqi158/fastjson-remote-code-execute-poc
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性值。而JDK自带的类com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
中有一个私有属性_bytecodes
,其部分方法会执行这个值中包含的Java字节码。
所以,想要使用TemplatesImpl
的_bytecodes
属性执行任意命令,有几个条件:
- 目标网站使用fastjson库解析json
- 解析时设置了
Feature.SupportNonPublicField
,否则不支持传入私有属性 - 目标使用的jdk中存在
TemplatesImpl
类
当然不排除有其他不需要TemplatesImpl
的利用方法。
复现漏洞
启动环境
https://blog.csdn.net/JiangBuLiu/article/details/93853056
进入路径为
cd /root/vulhub/fastjson/vuln
搭建及运行漏洞环境:
docker-compose build && docker-compose up -d
用时:7分半
生成字节码
第一步就是编写一个Java类,在这个类中执行命令。然后编译该类,获得.class文件,获得字节码。
修改Poc.java中你想要执行的命令,然后在本目录下使用maven对本项目进行编译,生成target/classes/Poc.class
:
mvn compile
如果你没有安装maven,也可以直接使用fastjson-1.0.war这个压缩包中的WEB-INF/classes/Poc.class
。exploit.php中就是读取的这个我已经编译好的class文件。
本环境目录结构
- src 本项目源码
- main/java java类
- IndexFilter.java web源码<
- main/java java类