CHAINS.md

January 1, 2023 · View on GitHub

如何构建方法调用链

通过Controller传递的所有参数都认为是污点(以此为开头进行分析)

例如以下rce1方法的data参数,首先会查找该方法中所有和data有关的方法调用,认为是下一步调用链

注意:我会记录所有调用方法的污点参数位置,并且在下一个链的方法中设置对应位置参数是污点以继续分析

@RequestMapping("/rce1")
public String rce1(String data) {
    return rceService.rce1(data);
}

实际上调用的Service是一个接口

我已经做了处理,可以通过接口找到它的实现,并且认为每一个实现都是一个新的方法调用链

public interface RCEService {
    String rce1(String data);
}

由于我记录了污点data的参数位置,在ServiceImpl类的rce1方法中设置对应的参数是污点

注意:并不一定同名,这里命名data只是恰好

@Service
public class RCEServiceImpl implements RCEService {
    @Override
    public String rce1(String data) {
        try {
            // 此时污点data被当成参数传入了exec方法
            // 认为这里是漏洞
            Runtime.getRuntime().exec(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "ok";
    }
}

通过扫描可以发现这样一条漏洞链:

[info] [18:40:43] Runtime exec RCE
	code/inspector/demo/web/RCEController.rce1
	code/inspector/demo/service/RCEService.rce1
	code/inspector/demo/service/impl/RCEServiceImpl.rce1