目录
本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗透实战,本文讲解upload-labs靶场第6关文件大小写绕过渗透实战。
一、大小写绕过原理
一些Web应用服务在检查上传成功的文件扩展名时,对于文件后缀扩展名的英文大小写并不敏感,也就是说比较扩展名是否在黑白名单时,并不区分英文的大小写。例如,应用设定只允许上传.jpg和.png格式文件,若其过滤机制未区分大小写,攻击者上传jPg、JpG 等变体扩展名文件,应用会误判为合法的.jpg文件,从而实现绕过 。
文件上传大小写绕过原理基于操作系统文件扩展名名对Web 应用过滤机制的特性差异,攻击者利用该原理,将包含恶意代码的文件(如 PHP 后门pass6.Php ),通过修改扩展名大小写尝试上传。若服务器配置对文件名大小写不敏感且只能识别执行特殊大小写形式的文件(如.php后缀),那么.php的大小写变体就可以绕过服务器过滤从而上传成功,从而导致脚本可能成功执行,甚至达成非法控制服务器等目的。
对比维度 | 详细内容 |
---|---|
操作系统特性 | Windows 系统:文件名和扩展名大小写不敏感 ,比如test.php 与 TesT.php 被视作相同文件。 Unix/Linux 系统:文件名和扩展名大小写敏感,test.php 与 TesT.php是不同文件 |
Web缺陷 | 部分 Web 应用在检查上传文件扩展名时,采用大小写不敏感的比较方式。 例如设置不允许允许上传 |
攻击方式 | 攻击者将包含恶意代码的文件扩展名修改为特殊大小写形式,如将shell.php 改为 ShElL.pHp,尝试上传。若服务器配置允许执行此类特殊大小写扩展名的文件,恶意代码可能成功执行。 |
风险影响 | 攻击者可绕过文件上传限制,上传恶意脚本,如 PHP 后门,从而非法控制服务器,窃取敏感信息或对系统进行破坏。 |
防范措施 | 严格过滤:Web 应用在检查文件扩展名时,进行严格的大小写敏感检查。 白名单验证:使用白名单验证文件类型,而非单纯依赖扩展名。 文件类型检测:结合文件内容的实际类型进行检测,而非仅依赖扩展名判断。 |
二、strtolower函数
strtolower() 是 PHP 中用于 将字符串转换为小写 的内置函数,常用于统一字符串格式、避免大小写敏感问题(如文件扩展名校验、字符串比较等)。主要应用场景是快速将 ASCII 字母转为小写,适合文件名、关键字比较等场景。
string strtolower ( string $string )
- 参数:$string:要转换的原始字符串(可以是任意编码,但仅对 ASCII 字母有效)。
- 返回值:返回转换后的全小写字符串。
三、源码分析
打开靶场的Pass05关卡,首先点击清空上传文件,然后点击查看源码,如下所示。
接下来分析源码,并对源码进行详细注释,很明显这一关卡为黑名单过滤,相对于第四关和第五关,将“.htacess和.ini”后缀均过滤了,故而无法用第四关和第五关的方法进行渗透。具体如下所示。
<?php
// 初始化变量,用于判断文件是否上传成功,初始值为 false 表示未成功上传
$is_upload = false;
// 初始化消息变量,用于存储上传过程中可能出现的提示信息,初始值为 null
$msg = null;
// 检查是否通过 POST 方法提交了名为 submit 的表单元素
if (isset($_POST['submit'])) {
// 检查上传目录是否存在
if (file_exists(UPLOAD_PATH)) {
// 定义一个数组,包含不允许上传的文件扩展名,涵盖了多种常见的脚本文件和特殊配置文件
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
// 获取上传文件的原始文件名,并去除首尾空格
$file_name = trim($_FILES['upload_file']['name']);
// 调用自定义函数 deldot,删除文件名末尾的点
$file_name = deldot($file_name);
// 获取文件扩展名,从文件名中最后一个点开始截取
$file_ext = strrchr($file_name, '.');
// 将文件扩展名转换为小写,以实现大小写不敏感的检查
$file_ext = strtolower($file_ext);
// 去除文件扩展名中可能存在的 ::$DATA 字符串,这是 Windows 系统下的一种特殊文件属性标识
$file_ext = str_ireplace('::$DATA', '', $file_ext);
// 去除文件扩展名首尾的空格
$file_ext = trim($file_ext);
// 检查文件扩展名是否不在禁止上传的扩展名列表中
if (!in_array($file_ext, $deny_ext)) {
// 获取上传文件在服务器临时存储的路径
$temp_file = $_FILES['upload_file']['tmp_name'];
// 拼接上传文件的最终保存路径,将上传目录和文件名组合
$img_path = UPLOAD_PATH.'/'.$file_name;
// 尝试将临时文件移动到指定的上传路径
if (move_uploaded_file($temp_file, $img_path)) {
// 如果文件移动成功,将上传成功标志设置为 true
$is_upload = true;
} else {
// 如果文件移动失败,设置提示消息为上传出错
$msg = '上传出错!';
}
} else {
// 如果文件扩展名在禁止上传的列表中,设置提示消息为文件类型不允许上传
$msg = '此文件类型不允许上传!';
}
} else {
// 如果上传目录不存在,设置提示消息为上传目录不存在,并建议手工创建
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
?>
由于上述源码中没有使用strtolower()函数,可以使用大小写绕过黑名单把.php 格式改为.php的大小写变体(如 .phP),将变体上传成功到Windows服务器的目录后,Windows服务器就会自动将 .phP解析为.php,因为要知道Windows系统下,对于文件名中的大小写不敏感。
例如:test.php和TeSt.PHP是一样的。Linux系统下,对于文件名中的大小写敏感。接下来我们在Windows下搭建的upload-labs靶场来进行实验,完成第6关upload-labs关卡的渗透实战。
二、渗透实战
1、构建脚本
新建一个test6.phP文件,该语句可以查看php相关信息,具体代码内容如下所示:
<?php
phpinfo();
?>
2、上传脚本
打开靶场第6关,bp开启拦截,上传test6.php文件
3、bp拦截报文
找到刚刚上传的POST报文,上传的文件为test6.php,如下所示。
4、bp改包
将报文发送到Repeater,在test6.php修改为test6.phP
修改前如下所示,如下红框的部分就是需要修改的内容,需要将php后缀改为phP后缀。
修改后如下所示,点击发送。
5、获取脚本URL地址
点击GO发送后,在Response中查找如下内容,根据下图红框中文字,可以发现上传成功并给出了上传后文件存储的路径。通过下图右侧红框内容”wid=250px”可知上传成功
根据上图,可知上传成功后的路径和文件名为upload/202111221150124291.phP
很明显图片被上传到upload目录中,且test6.php被重命名为202111221150124291.phP
(1)当前第六关url
http://127.0.0.1/upload-labs/Pass-06/index.php
(2)获取图片上传后的文件路径和文件名
upload-labs/upload/202111221150124291.phP
(3)那么相对路径对比后,图片上传后的访问路径就是
http://127.0.0.1/upload-labs/upload/202111221150124291.phP
6、访问脚本
访问脚本如下所示“php信息成功显示”,证明文件上传成功。
http://127.0.0.1/upload-labs/upload/202111221150124291.phP