Struts2-057(CVE-2018-11776)漏洞分析 – FreeBuf互联网安全新媒体平台 | 关注黑客与极客

3.探求namespace为/path1的package,假如存在这个package,则在这个package中探求名字为addUser的action,若找到则履行,否则转步骤5;假如不存在这个package则转步骤4

Struts2-057,2018/8/22刚爆发的一个struts2的远程代码履行破绽,网上已经有很多复现的文章了,这里并不盘算对破绽做复现,只是在代码层面钻研破绽

官方对此次破绽的描述是:

1.定义XML设置设置设备摆设摆设时假如namespace值未设置且上层动作设置设置设备摆设摆设(Action Configuration)中未设置或用通配符namespace时可能会导致远程代码履行

2.url标签未设置value和action值且上层动作未设置或用通配符namespace时可能会导致远程代码履行

Namespace用于将action分为逻辑上的不合模块,可以有效避免action重名的环境默认的namespace为空,当所有namespace中都找不到时才会在这个namespace中探求

先解释第一种环境:在struts.xml设置设置设备摆设摆设文件中,假如没有为根基xml设置设置设备摆设摆设中定义的result设置namespace,且上层你好Struts2 Tag

FilterDispatcher是struts2的核心节制器,认真拦截所有的用户哀求,然后FilterDispatcher经由过程调用ActionMapper(接口)来抉择调用哪个Action

出问题的第一步就在这里:

Struts2默认的是调用DefaultActionMapper这一实现类中的getMapping这一措施解析request来判断调用哪个action(报错namespace、name、method),此中ActionMapper是经由过程parseNameAndParameters措施来获取namespace的

可以必要说下alwaysSelectFullNamespace这个属性,当alwaysSelectFullNamespace为true时,会严格按照uri供给的namespace去探求action,找不到就会报404,以是这种环境下就算我们可以构造随意率性的namespace,但因为找纰谬应的action,在将namespace当ognl表达式履行代码前哀求就会报404的差错,进击不能成功好在alwaysSelectFullNamespace的缺省值为true,这时

1.假设哀求路径的URI,例如url是:http://localhost:8081/项目名/path1/path2 /addUser.action

2.首先探求namespace为/path1/path2的package,假如存在这个package,则在这个package中探求名字为addUser的action,若找到则履行,否则转步骤5;假如不存在这个package则转步骤3

4.探求namespace为/的package,假如存在这个package,则在这个package中探求名字为addUser的action,若找到则履行,转步骤5;假如不存在转步骤5

5.假如存在缺省的命名空间,就在该package下查找名字为addUser的action,若找到则履行,否则页面提示找不到action;否则提示面提示找不到action

这也便是前文中所描述的为什么进击必要“上层标签中没有设置namespace或者是应用通配符namespace时”这一前提,这种环境下,可以构造随意率性namespace而哀求不会掉足(这里便是source点了)

出问题的第二步(也便是sink点):

仅仅构造了随意率性的namespace还不敷,还必要一个爆发点才行这里以edirectAction这一返回类型来进行阐发,redirectAction对应的类是org.apache.struts2.result.ServletActionRedirectResult(实际上不止这一个类有问题,chain和postback这两个返回类型都有问题)

在所哀求的Action履行完后,会调用ServletActionRedirectResult.execute()进行重定向Result的解析,经由过程ActionMapper.getUriFromActionMapping()重组namespace和name后,由setLocation() 将带namespace的location放入父类ServletRedirectResult中调用exectue措施,然后ServletRedirectResult又会调用父类StrutsResultSupport中的exectue措施

着末由StrutsResultSupport调用conditionalParse(location,invocation)措施,经由过程TextParseUtil.translateVariables()调用OgnlTextParser.evaluate()解析履行url中的OGNL表达式,导致代码履行

*本文作者路上路人途经,转载请注明来自FreeBuf.COM

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包