分析某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);
漏洞点
- 文件名拼接过程未充分过滤特殊字符
- 仅通过简单黑名单限制('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文件系统的多个特性:
- 流文件特性(冒号分隔)
- 通配符匹配特性(<, >, ")
- 自动处理规则(点号删除)
虽然这些技术在较新系统中可能受到限制,但在特定环境下仍可能有效。防御关键在于严格的文件名验证和处理流程。