Struts2远程代码执行(S2-057)漏洞分析

栏目: Struts · 发布时间: 8年前

内容简介:在github上进行Tag对比。分析patch,定位

在github上进行Tag对比。

Struts2远程代码执行(S2-057)漏洞分析

分析patch,定位 问题点

Struts2远程代码执行(S2-057)漏洞分析

环境搭建

根据漏洞作者的博客描述,直接使用Struts2-2.3.34的showcase项目,修改struts-actionchaining.xml。

Struts2远程代码执行(S2-057)漏洞分析

使用${1+1}验证漏洞存在。

Struts2远程代码执行(S2-057)漏洞分析

漏洞分析

DefaultActionMapper 调用 parseNameAndNamespace() 解析 namespacename 。当 alwaysSelectFullNamespacetrue 时, namespace 的值可以通过URL控制。

Struts2远程代码执行(S2-057)漏洞分析

Action执行结束时,调用 ServletActionRedirectResult.execute() 进行重定向Result的解析,通过 ActionMapper.getUriFromActionMapping() 重组 namespacename 后,由 setLocation() 将带 namespacelocation 放入父类 StrutsResultSupport 中。

Struts2远程代码执行(S2-057)漏洞分析

StrutsResultSupport 拿到 location 后,通过 TextParseUtil.translateVariables() 调用 OgnlTextParser.evaluate() 解析执行URL中的OGNL表达式,导致代码执行。

Struts2远程代码执行(S2-057)漏洞分析

利用条件

最小条件:

  1. alwaysSelectFullNamespace 值为 true
  2. Struts2配置文件中, action 元素未设置 namespace 属性,或使用了通配符

漏洞场景:

  • 在Struts2配置文件中,对未正确配置的action元素提供如下三类返回元素:
    1. Redirect Action
    2. Action Chaining
    3. Postback Result

Struts2远程代码执行(S2-057)漏洞分析

  • 在模板中使用url元素标记:

Struts2远程代码执行(S2-057)漏洞分析 Struts2远程代码执行(S2-057)漏洞分析

构造PoC

使用Struts2老版本的PoC无法正常弹出计算器,会在获取 #context 时得到 null 值,导致 ['com.opensymphony.xwork2.ActionContext.container'] 求值时的 source 为空,抛出异常。

通过跟踪OGNL底层代码发现,在比较新的版本的OGNL包中, OgnlContext 移除了 CONTEXT_CONTEXT_KEYCLASS_RESOLVER_CONTEXT_KEYMEMBER_ACCESS_CONTEXT_KEY ,使OGNL表达式无法继续使用 #context#_classResolver#_memberAccess 来获得相应对象。

Struts2远程代码执行(S2-057)漏洞分析 Struts2远程代码执行(S2-057)漏洞分析

获取不到 context 就无法进行后续Struts2的沙盒绕过。通过分析,发现在 #request 域下的 struts.valueStack 对象中存在 context 属性,因此对S2-045的Payload进行一下简单改造即可。

Struts2远程代码执行(S2-057)漏洞分析

成功弹出计算器。

Struts2远程代码执行(S2-057)漏洞分析

另外,由于Struts2.5中,几个excluded的map使用的是immutable collection,不允许修改,因此该PoC只适用于Struts2.3环境。 (2.5可以尝试使用 setXXX() 覆盖map值。)

再多说一嘴,Struts2的showcase项目没有通过大家知道的 struts.mapper.alwaysSelectFullNamespace 配置项控制 alwaysSelectFullNamespace 的值,而是通过 @Inject 进行了IoC。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程原本

编程原本

Alexander Stepanov、Paul McJones / 裘宗燕 / 机械工业出版社华章公司 / 2012-1-10 / 59.00元

本书提供了有关编程的一种与众不同的理解。其主旨是,实际的编程也应像其他科学和工程领域一样基于坚实的数学基础。本书展示了在实际编程语言(如C++)中实现的算法如何在最一般的数学背景中操作。例如,如何定义快速求幂算法,使之能使用任何可交换运算。使用抽象算法将能得到更高效、可靠、安全和经济的软件。 这不是一本很容易读的书,它也不是能提升你的编程技能的秘诀和技巧汇编。本书的价值是更根本性的,其终极目......一起来看看 《编程原本》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换