细学《Magic In Java API》(hessian部分)

前言
这篇文章主要是对yemoli
和R1ckyZ
在KCON2023中的议题《Magic In Java API》的一次学习记录
对应的slide可以在https://github.com/knownsec/KCon/tree/master/2023中获取
概述
该议题的结构如下
API的介绍
该API在各个框架或者组件能够的影响细节
在RASP中利用该API的小技巧
根据各个组件的修复方式总结了一些有效的防御措施
API介绍
议题中API指代的就是sun.print.UnixPrintServiceLookup
这个类
这是一个用于打印服务注册的功能的接口
一个用于查找可用的打印机服务
public static void main(String[] args) throws IOException {
// 获取 UnixPrintServiceLookup 实例
PrintServiceLookup lookup = (PrintServiceLookup) PrintServiceLookup.lookupDefaultPrintService();
// 使用 UnixPrintServiceLookup 查找所有可用的打印服务
PrintService[] printServices = lookup.getPrintServices();
if (printServices.length == 0) {
System.out.println("No printers available.");
} else {
System.out.println("Available printers:");
for (PrintService printer : printServices) {
System.out.println(printer.getName());
}
}
}
在windows中对应的功能是在Win32PrintServiceLookup
中实现的
public static void main(String[] args) {
// 获取 PrintServiceLookup 实例
// 获取所有可用的打印服务
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
if (printServices.length == 0) {
System.out.println("No printers available.");
} else {
System.out.println("Available printers:");
for (PrintService printer : printServices) {
System.out.println(printer.getName());
}
}
}
在UnixPrintServiceLookup
初始化的时候
创建了一个PrinterChangeListener
监听器,是一个线程类,不断的更新服务
过程中存在有可能利用的点getAllPrinterNamesBSD
方法中
存在有命令执行的位置,传入的参数是在lpcAllCom
数组中的其中一个元素
如果我们能够控制传入的参数就能够达到RCE的目的
之后就是从修改类属性的”不同方法“的角度来阐明该API可能导入RCE的情况
想要更改类的属性值,我们常用的结合反序列化可以通过java
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录