路由信息提取

项目地址: https://arthas.aliyun.com/

最近在审计一些比较大的项目时,经常会遇到很复杂的项目结构,静态分析路由很麻烦,记录一下,这里以FineReport 11为例。 我们知道,SpingController是由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}")

可以成功提取对应的信息,实际上这种思路也可以应用到提取FilterServletInterceptor等信息,或者去寻找一些Sink,这里就不过多赘述。

总结

实际上,除了Arthas这种方式,也可以通过打断点再使用idea提供的表达式执行的方式来获取所有路由信息,对于一些小众的框架也有一些其他方式可以用。