内容简介:在github上进行Tag对比。分析patch,定位
在github上进行Tag对比。
分析patch,定位 问题点 。
环境搭建
根据漏洞作者的博客描述,直接使用Struts2-2.3.34的showcase项目,修改struts-actionchaining.xml。
使用${1+1}验证漏洞存在。
漏洞分析
DefaultActionMapper 调用 parseNameAndNamespace() 解析 namespace 和 name 。当 alwaysSelectFullNamespace 为 true 时, namespace 的值可以通过URL控制。
Action执行结束时,调用 ServletActionRedirectResult.execute() 进行重定向Result的解析,通过 ActionMapper.getUriFromActionMapping() 重组 namespace 和 name 后,由 setLocation() 将带 namespace 的 location 放入父类 StrutsResultSupport 中。
StrutsResultSupport 拿到 location 后,通过 TextParseUtil.translateVariables() 调用 OgnlTextParser.evaluate() 解析执行URL中的OGNL表达式,导致代码执行。
利用条件
最小条件:
-
alwaysSelectFullNamespace值为true - Struts2配置文件中,
action元素未设置namespace属性,或使用了通配符
漏洞场景:
- 在Struts2配置文件中,对未正确配置的action元素提供如下三类返回元素:
- Redirect Action
- Action Chaining
- Postback Result
- 在模板中使用url元素标记:
构造PoC
使用Struts2老版本的PoC无法正常弹出计算器,会在获取 #context 时得到 null 值,导致 ['com.opensymphony.xwork2.ActionContext.container'] 求值时的 source 为空,抛出异常。
通过跟踪OGNL底层代码发现,在比较新的版本的OGNL包中, OgnlContext 移除了 CONTEXT_CONTEXT_KEY 、 CLASS_RESOLVER_CONTEXT_KEY 和 MEMBER_ACCESS_CONTEXT_KEY ,使OGNL表达式无法继续使用 #context 、 #_classResolver 和 #_memberAccess 来获得相应对象。
获取不到 context 就无法进行后续Struts2的沙盒绕过。通过分析,发现在 #request 域下的 struts.valueStack 对象中存在 context 属性,因此对S2-045的Payload进行一下简单改造即可。
成功弹出计算器。
另外,由于Struts2.5中,几个excluded的map使用的是immutable collection,不允许修改,因此该PoC只适用于Struts2.3环境。 (2.5可以尝试使用 setXXX() 覆盖map值。)
再多说一嘴,Struts2的showcase项目没有通过大家知道的 struts.mapper.alwaysSelectFullNamespace 配置项控制 alwaysSelectFullNamespace 的值,而是通过 @Inject 进行了IoC。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
乔布斯离开了,马斯克来了
[日]竹内一正 / 干太阳 / 中信出版社 / 2015-11
在电动汽车的创新上,特斯拉抓住了一个群体的独特需求,外形很酷,不烧油,智能化控制。所有的颠覆式创新都不是敲锣打鼓来的,而是隐藏在一片噪声里,马斯克给我们带来的特斯拉虽然不尽完美,但他做产品的思维和执着于未来的勇气,值得学习。埃隆•马斯克创办公司也不是为了赚钱,而是为了拯救人类和地球,电动汽车、太阳能发电、宇宙火箭,不管是哪一项都足以令一个国家付出巨大的代价去研究开发,但埃隆•马斯克却一个人在做这些......一起来看看 《乔布斯离开了,马斯克来了》 这本书的介绍吧!