路由信息提取
最近在审计一些比较大的项目时,经常会遇到很复杂的项目结构,静态分析路由很麻烦,记录一下,这里以FineReport 11为例。
我们知道,Sping的Controller是由RequestMappingHandlerMapping管理的,所以只需要拿到这个实例进行遍历就可以获取所有的Controller信息。
在这个产品中,这个类在com.fr.third.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
执行命令
vmtool --action getInstances --className com.fr.third.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
就可以拿到对应的对象,然后来尝试获取所有的path和实现类
vmtool --action getInstances --className com.fr.third.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping --express "instances[0].getHandlerMethods()"获取到所有的Controller,重定向到文本再进行简单的处理就拿到所有的路由信息了,这里提供一个Python脚本
import re
text=open("url.txt","r").read()
pattern = r'@RequestMappingInfo\[\{\[([^\]]+)\].*?methods=\[([^\]]+)\].*?public \S+ (\S+)\('
matches = re.findall(pattern, text)
for match in matches:
path, method, handler = match
print(f"路径: {path} | 方法: {method} | Handler: {handler}")
可以成功提取对应的信息,实际上这种思路也可以应用到提取Filter、Servlet、Interceptor等信息,或者去寻找一些Sink,这里就不过多赘述。
总结
实际上,除了Arthas这种方式,也可以通过打断点再使用idea提供的表达式执行的方式来获取所有路由信息,对于一些小众的框架也有一些其他方式可以用。