WTCMS一处文件上传getshell
字数 1195 2025-08-29 08:31:53

WTCMS文件上传漏洞分析与利用教学文档

0x00 漏洞概述

WTCMS(下载地址: https://github.com/taosir/wtcms)存在一处后台文件上传漏洞,由于对上传文件过滤不严,攻击者可以通过修改上传请求包来上传PHP木马文件,从而获取服务器控制权限(getshell)。

0x01 漏洞利用步骤

1. 登录后台

首先需要获取后台管理员权限或通过其他方式登录到系统后台。

2. 进入注册邮件模板功能

在后台中找到"注册邮件模板"功能模块,该模块通常包含文件上传功能。

3. 使用编辑器上传文件

  1. 使用内置的UEditor编辑器上传一张图片(或其他看似正常的文件)
  2. 在文件上传过程中拦截HTTP请求(使用Burp Suite等工具)

4. 修改上传请求包

拦截到上传请求后,需要修改以下关键部分:

  • 修改文件名(如将test.jpg改为shell.php
  • 修改文件内容为PHP恶意代码(如<?php phpinfo();?>或webshell代码)

5. 访问上传的PHP文件

上传成功后,直接访问上传的PHP文件路径,验证是否执行了PHP代码。

0x02 漏洞代码分析

漏洞文件位置

/wtcms-master/application/Asset/Controller/UeditorController.class.php

关键代码流程

  1. 入口判断

    • 代码检查action参数是否为以下值之一:
      • uploadimage
      • uploadscrawl
      • uploadvideo
      • uploadfile
    • 如果是,则进入_ueditor_upload函数
  2. _ueditor_upload函数

    • 获取上传文件信息
    • 调用upload函数进行实际上传操作
  3. upload函数

    • 进行常规检查(文件存在性、上传目录等)
    • 通过pathinfo获取文件扩展名($file['ext']
    • 调用check函数进行上传检测
  4. 关键检查点

    • checkExt()函数检查文件扩展名
    • config['exts']值为null,导致检查通过
    • config['saveExt']为空,使用原始扩展名保存文件

0x03 漏洞原理总结

该漏洞的核心问题在于:

  1. 文件扩展名检查失效(config['exts']未定义)
  2. 保存文件时直接使用用户提供的扩展名
  3. 没有对文件内容进行二次验证

0x04 防御建议

  1. 严格定义允许上传的文件扩展名(白名单机制)
  2. 对上传文件内容进行验证(如图片需验证是否为真实图片)
  3. 上传文件重命名(不使用用户提供的文件名)
  4. 设置上传目录不可执行
  5. 更新到最新版本或应用官方补丁

0x05 补充说明

该漏洞利用需要后台权限,属于后台getshell漏洞。在实际渗透测试中,可能需要结合其他漏洞(如弱口令、SQL注入等)先获取后台访问权限。

WTCMS文件上传漏洞分析与利用教学文档 0x00 漏洞概述 WTCMS(下载地址: https://github.com/taosir/wtcms)存在一处后台文件上传漏洞,由于对上传文件过滤不严,攻击者可以通过修改上传请求包来上传PHP木马文件,从而获取服务器控制权限(getshell)。 0x01 漏洞利用步骤 1. 登录后台 首先需要获取后台管理员权限或通过其他方式登录到系统后台。 2. 进入注册邮件模板功能 在后台中找到"注册邮件模板"功能模块,该模块通常包含文件上传功能。 3. 使用编辑器上传文件 使用内置的UEditor编辑器上传一张图片(或其他看似正常的文件) 在文件上传过程中拦截HTTP请求(使用Burp Suite等工具) 4. 修改上传请求包 拦截到上传请求后,需要修改以下关键部分: 修改文件名(如将 test.jpg 改为 shell.php ) 修改文件内容为PHP恶意代码(如 <?php phpinfo();?> 或webshell代码) 5. 访问上传的PHP文件 上传成功后,直接访问上传的PHP文件路径,验证是否执行了PHP代码。 0x02 漏洞代码分析 漏洞文件位置 /wtcms-master/application/Asset/Controller/UeditorController.class.php 关键代码流程 入口判断 : 代码检查 action 参数是否为以下值之一: uploadimage uploadscrawl uploadvideo uploadfile 如果是,则进入 _ueditor_upload 函数 _ ueditor_ upload函数 : 获取上传文件信息 调用 upload 函数进行实际上传操作 upload函数 : 进行常规检查(文件存在性、上传目录等) 通过 pathinfo 获取文件扩展名( $file['ext'] ) 调用 check 函数进行上传检测 关键检查点 : checkExt() 函数检查文件扩展名 config['exts'] 值为 null ,导致检查通过 config['saveExt'] 为空,使用原始扩展名保存文件 0x03 漏洞原理总结 该漏洞的核心问题在于: 文件扩展名检查失效( config['exts'] 未定义) 保存文件时直接使用用户提供的扩展名 没有对文件内容进行二次验证 0x04 防御建议 严格定义允许上传的文件扩展名(白名单机制) 对上传文件内容进行验证(如图片需验证是否为真实图片) 上传文件重命名(不使用用户提供的文件名) 设置上传目录不可执行 更新到最新版本或应用官方补丁 0x05 补充说明 该漏洞利用需要后台权限,属于后台getshell漏洞。在实际渗透测试中,可能需要结合其他漏洞(如弱口令、SQL注入等)先获取后台访问权限。