分析某CMS上传GetShell原理-Window
字数 1424 2025-08-29 08:32:24

SEMCMS上传漏洞分析与利用(Windows环境)

0x00 漏洞概述

本教学文档详细分析SEMCMS PHP 3.9版本在Windows环境下存在的文件上传漏洞,利用Windows特殊文件处理特性实现GetShell。该漏洞主要利用Windows的NTFS文件系统特性绕过CMS的上传限制。

0x01 环境搭建

下载与安装

  • 官网下载地址:http://www.sem-cms.com/TradeCmsdown/php/SEMCMS_PHP_3.9.zip
  • Windows安装说明:
    • 后台地址:域名/rhDOEr_Admin/
    • 默认账号:Admin/1

测试环境

  • 操作系统:Windows
  • 上传接口:/N8D3ch_Admin/SEMCMS_Upload.php

0x02 漏洞分析

上传流程关键代码

move_uploaded_file($_FILES["file"]["tmp_name"],$Imageurl.$newname);

漏洞点

  1. 文件名拼接过程未充分过滤特殊字符
  2. 仅通过简单黑名单限制('php', 'phtml')
  3. 在Windows环境下可利用NTFS特性绕过

0x03 Windows特性利用

特性1:冒号截断

  • 格式:filename:stream
  • 示例:上传test.php:.jpg会生成:
    • 一个空的test.php文件
    • 一个隐藏的test.php:.jpg流文件

特性2:特殊字符匹配

  • <:匹配0个或多个字符(类似*)
  • >:匹配1个字符
  • ":匹配点号(.)

特性3:自动去除点

  • 文件名末尾的点会被自动删除
  • 示例:test.php.test.php

特性4:流类型

  • ::$data:默认流类型
  • 示例:test.php::$datatest.php

0x04 漏洞利用方法

方法1:冒号截断+字符匹配

  1. 首先上传ttt.jpg.php:.jpg生成空文件ttt.jpg.php
  2. 然后上传ttt.jpg<<(至少两个<)覆盖原文件
    • 拼接后文件名:ttt.jpg<<.jpg
    • 实际匹配:ttt.jpg.php

方法2:点号匹配

  1. 构造后缀为jpg\"php
    • 匹配规则:"匹配点号
    • 实际生成:jpg.php

方法3:流类型利用

  1. 直接上传shell.php::$data
    • 系统会忽略::$data部分
    • 实际保存为shell.php

0x05 详细利用步骤

步骤1:初始上传

  1. 访问上传接口
  2. 修改上传文件名参数为ttt.jpg.php:.jpg
  3. 上传后生成:
    • 可见的空文件ttt.jpg.php
    • 隐藏的流文件ttt.jpg.php:.jpg

步骤2:覆盖写入

  1. 修改文件名参数为ttt.jpg<<
  2. 确保后缀为.jpg(或其他允许的后缀)
  3. 上传后<<会匹配到已存在的ttt.jpg.php文件
  4. 内容被成功写入

验证

  1. 访问http://target/ttt.jpg.php
  2. 确认内容已成功写入

0x06 防御建议

  1. 使用严格的白名单机制而非黑名单
  2. 过滤所有特殊字符(:, <, >, ", $等)
  3. 重命名上传文件(如使用MD5值)
  4. 在Linux服务器部署(不受此特性影响)
  5. 文件内容检查(而非仅检查扩展名)

0x07 总结

该漏洞利用Windows NTFS文件系统的多个特性:

  1. 流文件特性(冒号分隔)
  2. 通配符匹配特性(<, >, ")
  3. 自动处理规则(点号删除)

虽然这些技术在较新系统中可能受到限制,但在特定环境下仍可能有效。防御关键在于严格的文件名验证和处理流程。

SEMCMS上传漏洞分析与利用(Windows环境) 0x00 漏洞概述 本教学文档详细分析SEMCMS PHP 3.9版本在Windows环境下存在的文件上传漏洞,利用Windows特殊文件处理特性实现GetShell。该漏洞主要利用Windows的NTFS文件系统特性绕过CMS的上传限制。 0x01 环境搭建 下载与安装 官网下载地址:http://www.sem-cms.com/TradeCmsdown/php/SEMCMS_ PHP_ 3.9.zip Windows安装说明: 后台地址: 域名/rhDOEr_Admin/ 默认账号:Admin/1 测试环境 操作系统:Windows 上传接口: /N8D3ch_Admin/SEMCMS_Upload.php 0x02 漏洞分析 上传流程关键代码 漏洞点 文件名拼接过程未充分过滤特殊字符 仅通过简单黑名单限制('php', 'phtml') 在Windows环境下可利用NTFS特性绕过 0x03 Windows特性利用 特性1:冒号截断 格式: filename:stream 示例:上传 test.php:.jpg 会生成: 一个空的 test.php 文件 一个隐藏的 test.php:.jpg 流文件 特性2:特殊字符匹配 < :匹配0个或多个字符(类似* ) > :匹配1个字符 " :匹配点号(.) 特性3:自动去除点 文件名末尾的点会被自动删除 示例: test.php. → test.php 特性4:流类型 ::$data :默认流类型 示例: test.php::$data → test.php 0x04 漏洞利用方法 方法1:冒号截断+字符匹配 首先上传 ttt.jpg.php:.jpg 生成空文件 ttt.jpg.php 然后上传 ttt.jpg<< (至少两个 <)覆盖原文件 拼接后文件名: ttt.jpg<<.jpg 实际匹配: ttt.jpg.php 方法2:点号匹配 构造后缀为 jpg\"php 匹配规则: " 匹配点号 实际生成: jpg.php 方法3:流类型利用 直接上传 shell.php::$data 系统会忽略 ::$data 部分 实际保存为 shell.php 0x05 详细利用步骤 步骤1:初始上传 访问上传接口 修改上传文件名参数为 ttt.jpg.php:.jpg 上传后生成: 可见的空文件 ttt.jpg.php 隐藏的流文件 ttt.jpg.php:.jpg 步骤2:覆盖写入 修改文件名参数为 ttt.jpg<< 确保后缀为 .jpg (或其他允许的后缀) 上传后 << 会匹配到已存在的 ttt.jpg.php 文件 内容被成功写入 验证 访问 http://target/ttt.jpg.php 确认内容已成功写入 0x06 防御建议 使用严格的白名单机制而非黑名单 过滤所有特殊字符(:, <, >, ", $等) 重命名上传文件(如使用MD5值) 在Linux服务器部署(不受此特性影响) 文件内容检查(而非仅检查扩展名) 0x07 总结 该漏洞利用Windows NTFS文件系统的多个特性: 流文件特性(冒号分隔) 通配符匹配特性( <, >, ") 自动处理规则(点号删除) 虽然这些技术在较新系统中可能受到限制,但在特定环境下仍可能有效。防御关键在于严格的文件名验证和处理流程。