目录
- 过滤器及拦截器相关区别解释
- Struts2-016远程代码执行漏洞分析-黑盒流程
- SpringBoot-SpEL表达式注入漏洞分析-白盒思路
过滤器及拦截器相关区别解释
Filter是基于函数回调的,而Interceptor则是基于Java反射的。
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
简单来说这两个的作用是没有区别的,但是两个的申明调用有些小区别,但是这个我们可以不用去理解它
最重要的要记住他们的执行顺序: 先filter 后 interceptor
另外在不同框架中有的是自带有的是需要自写,具体可以查看开发资料。
不是说每个框架都有filter 和 interceptor,框架本身自带了一些,但是有些自带的满足不了他的需求,比如我们要对注入进行过滤,这个时候自带的没有这个东西,就需要自己写;有些无关紧要的,例如字体编码、汉字的正常显示,像这些东西一般都有自带,那这种我们就忽略不计,我们主要看的是他有没有一些对安全攻击的防护,有些是有的,有些是需要自己写的,需要自己去配置
Struts2-016远程代码执行漏洞分析-黑盒流程
Struts2目前已经脱离主流了,在传统企业用一点,目前主流的是SSM,Spring、Spring MVC、MyBatis
我们先看Filter和Interceptor,再决定后面代码会不会受到Filter和Interceptor的影响
框架特性就是框架自身的写法,有那些独有的东西,因为这些特有的东西,可能会出安全问题,框架代码审计之所以难,是因为执行流程复杂
术语解释:
1、HttpServletRequest 请求信息
2、ActionContextCleanUp 不重要,现在貌似不用了
3、Other filters 不重要,现在貌似不用了
4、Filter Dispatcher 过滤器,这个应该是最底层的过滤器
5、ActionMapper Struts2中主要检测请求信息是否需要Struts2处理
6、ActionProxy 一个中间层,就是可以调用其他类什么的
7、ConfigurationManger 负责将Struts.xml配置文件映射到内存中去
8、Struts.xml Struts.xml配置文件需要程序员填写
9、ActionInvocation 包含四个属性分别获取前端传递的值,action,struts.xml信息,其他一些数据。
10、Interceptor 拦截器
11、Tag Subsystem Struts2自带标签库 没用
12、Templete struts2的前端模板,没用吧,不清楚
13、HttpServletResponse 响应用户的类
首先我们看配置信息这里,看有没有过滤器、拦截器、引用框架信息这些东西
我们看到有引用struts2框架
看pom.xml也能看到
这边是过滤器运行的主要地方,访问.action后缀文件的时候,就会触发过滤器的代码
也就是说访问这个地址时,会触发过滤器
下断点,点击调式,我们看一下代码的执行流程
每下个文件就会执行流程
这个就是我们刚才指向过滤器的地址
这个payload就是测试漏洞的,输出OK,说明我们文件写入成功
但是这个代码没有触碰到jsp这里来
我们去掉post请求或者把前面的东西改一下,就可以触碰到
这是因为代码的设置,只要是这四个参数,就可以不用触碰代码
原因是下面这个
官方描述
Struts2的DefaultActionMapper支持一种方法,可以使用’action:",“redirect”,"redirectAction:“对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的 struts2中,没有对"action:”,“redirect:”,"redirectAction:"等进行处理,导致ongl表达式可以被执行。
因为没有经过rasp.jsp,所以过滤器没有触发到从而导致了命令执行
我们要搞清楚执行流程,执行流程是用来可以尝试绕过过滤器和拦截器的一种方式,因为有时候它满足一些规则之后,就会跳出过滤器和拦截器,走其它地方
该漏洞利用st2特性: 1.路由 2.OGL表达式 3.执行流程
用已知漏洞去分析源码有没有安全问题,就是看它框架的版本是否在网上有公开漏洞
断点调试查看执行代码文件分析
根据st2框架执行流程测试:对比上图
未触发关键字-断点文件-调试到过滤器
触发关键字-断点文件-未调试到过滤器
漏洞其实是执行流程上的问题,配合struts2的特性来实现绕过
OGNL介绍
简称OGNL,对象导航图语言 (Object Graph Navigation Language) ,是应用于Java中的一个开源的表达式语言 (Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。
这个表达式我们不用去学,每个框架里面都有一个表达式,OGNL是Struts2框架里面特有的表达式
源文件是jsp,访问显示action,是因为action框架可以改变后缀
SpringBoot-SpEL表达式注入漏洞分析-白盒思路
Spring Expression Language (缩写为SpEL)是一种强大的表达式语言。在 Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。
SpEL表达式可以理解为php的eval,将里面的代码以脚本执行,它就会将代码中你传入的一些数据以java去识别数据去执行
分析审计思路
获取配置信息:
1.过滤器(拦截器),框架包,触发请求,框架特性 (ogn1,路由等)
2.打开对应st2对应过滤器,配合st2路由配置文件,解读:
分析开源框架的漏洞还是从其源码入手,问题出在了DefaultActiionMapper上,这个类主要是用来处理一些灵活的URL调用,比如处理Action中动态调用方法的形式,如:
我们看SpringBoot框架源码
我们并没有看到配置文件,我们就去看pom.xml文件,看到SpringBoot框架是1.3.0版本的
我们去网上搜这个版本的SpringBoot框架,发现这个版本存在漏洞
我们把项目启动起来
访问/SpELVuIRCE.php地址的时候,指向的就是spel.jsp,接收id
JDBC和DAO模块是用来处理数据库的
由于这个网站在访问信息显示页面,这个数据必定在数据库里面
这个地方跟我们之前讲过的sql注入有点问题,不是采用预编译的写法
明显有注入点,我们采用数据库监控工具就可以判断
按照正常来讲,我们访问这个文件,你即使这样写,有自身过滤器的话,也会进行拦截
这个拦截器需要它自己写的,也就是说sping框架里面没有写拦截器、没有去配置它的话,等同于说没有任何防护,除了这个防护代码是写在下面
struts2
已知漏洞: 找框架自身的版本,利用漏洞库去确定漏洞
未知漏洞: 执行流程,过滤器,拦截器,框架特性
在网上找不到这个漏洞,或者说这个漏洞没有在网上存在过,就是俗称的0day
验证:
采用断点调试,确定.action文件断点后,无法拦截执行请求,说明满足路由规则请求方法后跳出过滤拦截器,绕过实现ongl表达式漏洞
spring
已知漏洞: 找框架自身的版本,利用漏洞库去确定漏洞
有spel表达式注入漏洞-未知漏洞测试
从自身源码分析到文件sql语句中有注入漏洞,尝试成功 (未发现过滤器及拦截器)
spring自带的过滤器和拦截器有,但是自带的过滤器和拦截器只是为了网站的访问和异常进行修复,并不会对漏洞进行防护,你针对spring框架进行漏洞分析的时候,还是要看过滤器和拦截器是自带的还是写的
总结:
1.先确定源码中是否存在框架-
执行流程,特性(表达式,拦截器或过滤器自带或自写?)
已知的框架版本漏洞 利用
2.确定源码中是否存在过滤器 - 自带或引用或自定义拦截规则
3.过滤器中怎么触发,过滤器规则