官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
前言
这篇文章主要是对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