过滤器是java里面找漏洞很重要的地方,如果对过滤器不了解的话,对漏洞的验证是很有问题的
看构成就是看过滤器是否在前期源码、项目中,是否有过滤器
看指向指的是对应过滤器的代码指向地方,指向的是内部文件还是外部的库文件,这样子是便于我们快速找到对应的代码进行分析
看过滤器在这里的配置信息,一般看两点,一个是触发请求、一个是触发规则,这两点主要是根据请求和规则思考有没有绕过的可能性
看配置和看代码都是在思考过滤的情况和去思考绕过思路的
简要来讲就是一句话,看构成,看指向,看配置,看代码-寻绕过
在javaweb项目中,一般在运行的过程中会经过过滤器,才会到下面去,过滤器在你还没有信息返回的时候,就已经到了过滤器,就相当于前期已经将你相关请求的东西开始进行过滤了,过滤完之后,才会带到后面的数据处理中,所以过滤器是在漏洞或者攻击的过程中,会进行拦截的一个地方,这个地方过滤器写的比较严谨的话,会阻止大部分的攻击,也是我们后期判断漏洞是否真实存在,验证这个漏洞有效性的时候,就是要根据过滤器的规则进行分析,所以过滤器是非常重要的
web.xml查看Filter过滤器
名字,对应class,触发URL,生效规则等
我们打开java项目,框架对应的配置性文件里面会直接标识有没有过滤器
我们进行文件的搜索找到web.xml
打开web.xml文件,其中shiro是过滤器的名字,class是代码储存的地方
自身的程序代码是内部,由于代码会引用一些东西,属于外部,外部就是有些库
我们可以在外部里面找以下有没有对应的名字
初次打开jar文件是打不开的,右键选中jar,选中加载,把它编译进去
这个地方就是它过滤器代码储存的地方
mapping属于路由类东西的设置,后面又设置名字、访问路径,就是说请求admin目录的时候,就会触发shiro控制器,这里是可以指定单个文件、目录、后缀名,打个比方后面加个*.jsp,就是请求admin后面加个任意的jsp文件,触发过滤器里面对应的代码;下面就是以什么形式触发
Filter是JavaWeb中的过滤器,用于过滤URL请求。通过Filter我们可以实现URL请求资源权限验证、用户登陆检测等功能。
Filter是一个接口,实现一个Filter只需要重写 init 、doFilter、destroy 方法即可,其中过滤逻辑都在doFilter 方法中实现。
Filter和Servlet一样是Java web中最为核心的部分,使用Servlet和Filter可以实现后端接口开发和权限控制,当然使用Filter机制也可以实现MVC框架,Struts2 实现机制就是使用的Filter。
Filter的配置类似于Servlet,由 和 两组标签组成,如果Servlet版本大于3.0同样可以使用注解的方式配置Filter。
过滤器里面有比较关键的三串比较重要的代码,init初始化
doFilter过滤器核心代码
destroy销毁
一般要初始化之后,然后到核心代码这里来,最后销毁它就完事了
我们这边来个简单的小实例,我们打开项目,打开web.xml
这边有个过滤器,一般外部库都会有框架的名字,这个名字显然不在外部库
这是它过滤器对应的代码地方
访问这个目录下面的任意文件,都能触发到过滤器的名字,触发里面的请求
我们现在把项目启动起来,项目在启动的过程中,就会触发过滤器的初始化
现在我们随便访问一个地址,访问它的时候并没有提示我们什么
过滤器初始化代码已经被执行了,核心代码没有执行,因为没有访问servlet目录
我们访问一下servlet目录下的文件
我们找到xss.jsp没有这个选项
我们看调式信息,就是触发代码了
Jeesns是java的一套程序开发的,打开Jeesns项目
首先找配置文件,一般是找关键性目录
我们看到这里有XssSqlFilter过滤器,很明显就是过滤xss和sql注入的,看过滤器文件名就知道是内部的
其实这个过滤就是创建对象,对象叫XssWrapper,它的核心代码在XssWrapper对象里面
我们选中对象名字,点击查找使用,跟踪代码
因为它的核心代码在jar包里面,这个jar包是我们反编译才能看到的
点击添加为库
打开里面也是搜不到XssWrapper对象的
我们这边一个个打开看一下
Jeesns1.3之前发现漏洞,1.4.2紧急修复漏洞,然后你具体看一下两个规则的具体写法,请求的方法名不一样
因为这边不是jar包,我们直接点击查找引用
这边构造函数就是它原始申明的地方,双击构造函数
自动定位到XssHttpServletRequestWrapper函数的地方
它使用的是替换方法,所以它是不严谨的,因为它过滤的是关键字
这两个事件就可以触发xss的代码,因为它在这里申明关键字,里面没有包含下面这两个,所以就会触发
<svg/onLoad=confirm(1)>
<img src="x" ONERROR=confirm(0)>
我们看1.4.2这里就加了正则表达式,然后还加了些其它东西
请求任意文件或任意目录,它这里过滤器过滤的是url请求,然后请求里面含有参数,所以它其实检测的就是url请求参数的东西,你可以看到它过滤器框架里面ServletRequest request的写法,所以这里面就是请求和回复,只要请求就会收到回复
我们找个输出地方,即可测试xss,因为跨站漏洞本身漏洞的原因,就是输出地方存在的问题,所以只要找输出的函数,就能找到漏洞存在的地方
java输出函数网上找一下就完事了,你思路懂,你网上搜资料你也会明白
全局搜索输出函数
也可以单独针对某个模块去找
我们找有打印的地方,打印的地方存在变量,把变量给传回去就完事了
漏洞的poc:https://www.seebug.org/vuldb/ssvid-97940
单独的过滤代码写到单独的过滤器里面,这样子是很便于你后期的开发维护,只要你的过滤器访问规则被绕过了,那么你就可以直接修改对应地方,不用在每个要接受验证的代码中进行修改,这肯定不现实,所以这样设计是便于后期维护的,是一种先进的写法
apk可以反编译,反编译成jar包,其实也可以进行代码审计,但是一般apk是app文件,就是我们的移动客户端,移动客户端就是app里面涉及到网站源码,如果没有,就是单纯逻辑上面的代码,不会设计到web层面的代码以及安全,如果app里面就是一些web框架在里面,app打开就是我们访问网站的模版,可能里面就是类似javaweb
有使用框架和没使用框架最大的区别就是构成这里,不同的框架他们的网站配置文件命名是不一样的,可以去网上搜都有的
框架的指向全在外部,文件核心代码全在外部,不可能在内部,因为你用到框架,框架自身是有它自带的过滤器的,框架就好比我们的thinkphp,有它自身的过滤规则
它们的配置请求规则也会不一样,一旦出现框架类的话,就会跟常规有区别,但是整体思路不会有问题的
载入struts2项目
我们分析框架有没有漏洞,看过滤器,框架是有自身的东西的,可以引用框架开发网站,框架自身的过滤器是不是要找配置文件,配置文件找不到的话,可以直接进行搜索
struts2过滤器的命名跟我们前面讲的拦截器的命名是有区别的
这个配置文件里面没有intercepter
那就看一下这里有没有加载一些包含文件,所以我们就去找这个文件
这里已经找到了
找到过滤器代码,过滤器的名字,过滤器储存的class文件、路径
找到过滤器规则的文件
框架一旦加载上去,漏洞一旦发现产生危害大,就是因为框架使用的人多,框架爆出漏洞一般是高危漏洞,因为框架一旦有使用,谁都不能判断框架漏洞是怎么引起的
框架漏洞就是分析它的过滤器挖出来的,把这些文件打开,分析它的过滤规则有没有绕过的
框架类的过滤器首先他的申明不一样,名字也不一样,然后他的过滤器有很多
通过过滤器的名字就能知道大概意思,比如cookie是对cookie相关的东西进行操作,我们看的话,着重看关键字,params这个是java里面代码的接收,请求方式
有些过滤器它仅仅只是为了网站的正常访问,防止出问题这些,就像我们刚刚说的编码,像那些就不用看了,主要是看关键字的一些过滤器,找到它里面的东西
这个代码给到我,也是要查资料慢慢看,因为我也没学过java,有些代码,我们只能简单去理解他,分析他,大概是什么意思,你要一下子看完,除非你搞过开发,我也看不懂只能去猜,从字面上去猜函数的意思,分析这个过滤器是干嘛的,怎么在过滤
简单的学一下java,了解一下架构是有必要的