- 官方描述:
Struts2的DefaultActionMapper支持一种方法,可以使用”action:”, “redirect:” , “redirectAction:”对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的 struts2中,没有对”action:”, “redirect:” , “redirectAction:”等进行处理,导致ongl表达式可以被执行。
该漏洞利用st2特性:1.路由 2.OGNL表达式 3.执行流程 - http://www.foo.com/bar/hello.action?foo!bar
foo!bar这种形式是动态的调用action中的方法,其中foo是action,bar是方法名,但是调用的前提是在struts.xml中事先进行配置。当然这只是一种,这个类还有个重要的作用就是处理redirect、redirectAction、method、action
3.Payload加上路由关键字进行OGNL表达式接受处理执行">分析审计思路:
获取配置信息:
1.过滤器(拦截器),框架包,触发请求,框架特性(ognl,路由等)
2.打开对应st2对应过滤器,配合st2路由配置文件,解读:
分析开源框架的漏洞还是从其源码入手,问题出在了DefaultActiionMapper上,这个类主要是用来处理一些灵活的URL调用,比如处理Action中动态调用方法的形式,如:
http://www.foo.com/bar/hello.action?foo!bar
foo!bar这种形式是动态的调用action中的方法,其中foo是action,bar是方法名,但是调用的前提是在struts.xml中事先进行配置。当然这只是一种,这个类还有个重要的作用就是处理redirect、redirectAction、method、action
3.Payload加上路由关键字进行OGNL表达式接受处理执行 - https://pan.baidu.com/s/1miETaZcez30jmUEA5n2EWw 提:xiao">断点调试查看执行代码文件分析
根据st2框架执行流程测试:对比上图
未触发关键字-断点文件-调试到过滤器
触发关键字-断点文件-未调试到过滤器
struts2
已知漏洞:找框架自身的版本,利用漏洞库去确定漏洞
未知漏洞:执行流程,过滤器,拦截器,框架特性
验证:
采用断点调试,确定.action文件断点后,无法拦截执行请求,说明满足路由规则请求方法后跳出过滤拦截器,绕过实现ongl表达式漏洞.
spring
已知漏洞:找框架自身的版本,利用漏洞库去确定漏洞
有spel表达式注入漏洞-未知漏洞测试
从自身源码分析到文件sql语句中有注入漏洞,尝试成功(未发现过滤器及拦截器)
总结:
1.先确定源码中是否存在框架 -
执行流程,特性(表达式,拦截器或过滤器自带或自写?),
已知的框架版本漏洞 利用
2.确定源码中是否存在过滤器 - 自带或引用或自定义拦截规则
3.过滤器中怎么触发,过滤器规则
涉及资源:
https://pan.baidu.com/s/1miETaZcez30jmUEA5n2EWw 提:xiao
代码审计-JAVA项目框架类漏洞分析报告
#知识点
简称OGNL,对象导航图语言(Object Graph Navigation Language),是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。
Spring Expression Language(缩写为SpEL)是一种强大的表达式语言。在Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。
1、HttpServeletRequest
请求信息。
2、ActionContextCleanUP
3、Other filters
2,3不重要,貌似现在已经没用了。
4、Filter Dispatcher
过滤器,这个应该是最底层的过滤器。
5、ActionMapper
Struts2中主要检测请求信息是否需要Struts2处理。
6、ActionProxy
一个中间层,就是可以调用其他类什么的。
7、ConfigurationManager
ConfigurationManager则负责将struts.xml文件中配置文件映射到内存中去的
8、Struts.xml
Struts配置文件需要程序员填写。
9、ActionInvocation
包含四个属性分别获取前端传递的值,action,struts.xml信息,其他一些数据。
10、Interceptor
拦截器不是太理解应该是获取前端传递的属性值,然后封装到action的属性域中。
11、Tag Subsystem
Struts2自带标签库没用
12、Templete
Struts2的前端模版,没用吧,不清楚。
13、HttpServletResponse
响应用户的类。
Filter是基于函数回调的,而Interceptor则是基于Java反射的。
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
最重要的要记住他们的执行顺序: 先filter 后 interceptor,
另外在不同框架中有的是自带有的是需要自写,具体可以查看开发资料。
演示案例:
- 过滤器及拦截器相关区别解释
- Struts2-016远程代码执行漏洞分析-黑盒流程
- SpringBoot-SpEL表达式注入漏洞分析-白盒思路