【upload-labs】pass-19~pass20完结篇

本文详细分析了PHP文件上传中的00截断与Windows特性绕过漏洞。通过修改文件名,利用数组和Windows的文件保存特性,成功绕过了后缀名过滤,实现了恶意文件的上传。测试过程中,通过Burp Suite抓包并修改请求,验证了理论上的漏洞利用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【upload-labs】pass-19~pass20完结篇


【pass-19】00截断

1、源码分析
2、测试流程

先尝试上传一个一句话木马muma.php

image-20210323190203524

用burp抓包:

image-20210323192236233

在raw中将加号的2b替换为null的00

image-20210323190511268

变换后结果:

image-20210323190537449

image-20210323190615389

如图所示,上传成功!

然后直接菜刀连接即可。

小结

00截断的原理前面提到过,不明白的小伙伴可以取看看传送门

我觉得是否可以利用00截断的本质,还是要看最后文件的保存路径用户是否可控。


【pass-20】特殊+windows特性绕过

1、源码分析
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {

        $is_upload = false;
        $msg = null;
        if(!empty($_FILES['upload_file'])){
            //mime check
            $allow_type = array('image/jpeg','image/png','image/gif');  //创建一个白名单校验MIME
            if(!in_array($_FILES['upload_file']['type'],$allow_type)){
                $msg = "禁止上传该类型文件!";
            }else{
                //check filename
                $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
                if (!is_array($file)) {  //判断save_name是否是一个数组   ???
                    $file = explode('.', strtolower($file)); //explode() 函数把字符串打散为数组,以点为分割
                }

                $ext = end($file);  //end返回最后一个元素的值
                $allow_suffix = array('jpg','png','gif');  //创建一个白名单用于过滤后缀
                if (!in_array($ext, $allow_suffix)) {       
                    $msg = "禁止上传该后缀文件!";
                }else{
                    $file_name = reset($file) . '.' . $file[count($file) - 1];  //reset()返回第一个元素的值
                    $temp_file = $_FILES['upload_file']['tmp_name'];
                    $img_path = UPLOAD_PATH . '/' .$file_name;
                    if (move_uploaded_file($temp_file, $img_path)) {
                        $msg = "文件上传成功!";
                        $is_upload = true;
                    } else {
                        $msg = "文件上传失败!";
                    }
                }
            }
        }else{
            $msg = "请选择要上传的文件!";
        }
        
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

前面MIME的校验很好绕过,关键是这句$file_name = reset($file) . '.' . $file[count($file) - 1];,文件名的组成是打散后的第一个元素+点+最后一个数组元素,我们可控的就是元素值,而且元素值是以点区分的。

就比如shell.php.jpg,那文件名的组合应该为shell.jpg,apache无法解析,在后缀名上做文章好像行不通,换成shell.php.xxx白名单过不了,咋办呢

再往前看,if (!is_array($file))这句话有点奇怪,为什么要判断文件名是不是数组呢?如果上传的文件名本来就是数组,那这句话就能绕过,而且数组内容我们可以自己定制。

2、测试流程

上传一个muma.php,用burp抓包:

image-20210323222133579

image-20210323222121718

更改后:

image-20210323222517327

image-20210323223315645

这里直接将文件名改为数组,从而绕过了数组打散,而save_name[2]中的jpg也可以绕过后缀白名单的过滤,文件名形成的后缀是索引为数组长度减一的元素save_name[1],而save_name[1]我们没有设置,所以直接为空。

最后文件名拼接应该为shell.php. ,此时由因为windows的特性,会在保存文件时自动去除后缀末尾的点。

所以shell.php被成功保存。

我们来测试一下猜想:

放包:

image-20210323223353446

如图所示,上传成功!

最后用菜刀连接即可。

小结

本关的突破点主要在if (!is_array($file))$file_name = reset($file) . '.' . $file[count($file) - 1];这两句话,比较特殊的是构造一个数组文件名绕过,并且结合Windows的特性。

### 关于 upload-labs Pass-12 的解决方案 #### 背景介绍 upload-labs 是一个用于学习和测试文件上传漏洞的靶场,其中包含了多个级别的挑战。Pass-12 特别关注通过特定条件下的文件上传绕过验证机制来实现攻击[^2]。 #### 漏洞分析 在 Pass-12 中,服务器端设置了较为严格的文件名过滤规则以及 MIME 类型检测。然而,在实际环境中可能存在某些配置不当之处可以被利用: - **MIME Type 绕过**: 即使服务端进行了 MIME 类型校验,但如果仅依赖客户端提供的 Content-Type 头部,则可以通过修改请求头中的内容类型来进行绕过尝试。 - **文件扩展名检查不足**: 如果只简单地基于黑名单模式阻止已知危险类型的文件(如 .php),那么攻击者仍有可能找到未被列入黑名单的安全扩展名并执行恶意脚本。 为了成功完成此关卡的任务,需要理解如何构造特殊格式的数据包以规避上述防护措施[^4]。 #### 实现方法 以下是针对该级别的一种可能解法思路: ```bash curl -X POST \ http://localhost/upload-labs-master/Pass-12/index.php \ -F "file=@test.jpg;type=image/jpeg" \ -H 'Content-Type: multipart/form-data' ``` 这段命令展示了如何使用 `cURL` 工具发送带有自定义 MIME 类型 (`image/jpeg`) 和文件名 (`.jpg` 扩展) 的 HTTP 请求给目标 URL 。这里的关键在于即使上传的是 PHP 文件,也可以伪装成图片或其他无害文件形式提交上去[^3]。 需要注意的是,具体实施时还需考虑更多细节因素,例如服务器的具体版本、中间件特性等都会影响最终效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值