upload_labs_pass17_二次渲染

pass17-源码分析

在这里插入图片描述

打开pass17,貌似和前面的几关差不多(pass14,15,16都是图片马)。

看源码和提示:

提示:
在这里插入图片描述
即利用上传的图片生成了一张新的图片。

源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=UPLOAD_PATH.'/'.basename($filename);

    // 获得上传文件的扩展名
    $fileext= substr(strrchr($filename,"."),1);

    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "png") && ($filetype=="image/png")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);

            if($im == false){
                $msg = "该文件不是png格式的图片!";
                @unlink($target_path);
            }else{
                 //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".png";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagepng($im,$img_path);

                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            $msg = "上传出错!";
        }

    }else if(($fileext == "gif") && ($filetype=="image/gif")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if($im == false){
                $msg = "该文件不是gif格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".gif";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagegif($im,$img_path);

                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    }else{
        $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
    }
}

注意函数

basename()

给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。

看一些例子:

<?php
echo "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL;
echo "2) ".basename("/etc/sudoers.d").PHP_EOL;
echo "3) ".basename("/etc/passwd").PHP_EOL;
echo "4) ".basename("/etc/").PHP_EOL;
echo "5) ".basename(".").PHP_EOL;
echo "6) ".basename("/");
?>

输出:
在这里插入图片描述

看源码可以知道,如果图片 的类型是png,gif,png并且Content-type是允许上传的。(比如源码15行)

所以在看上面的源码的时候,只需要看一个if语句块就行了:

if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } 

在上面 的代码中,就是只针对于jpg类型的图片进行新的处理。PNG和GIF都是同理。

关注有一行:(使用上传的图片生成新的图片)

函数imagecreatefromjpeg()

php官网的介绍:

由文件或 URL 创建一个新图象。
imagecreatefromjpeg() 返回一图像标识符,代表了从给定的文件名取得的图像。

貌似也没有特别的东西。

pass17-图片上传

上传之前第14关-16关我一直用的图片马:shell.gif

上传之前,先把之前几关遗留的马删除。

在这里插入图片描述
不知道为什么我上传完是这个鬼样子。。。
可能是环境问题。

我将PHP版本改为7.3.4nts,清空上传文件之后再次上传文件。

在这里插入图片描述
又告诉我不是GIF格式的文件。。。

后来我又尝试了几次,有一次确实上传成功了,但是文件包含怎么都不行。奇了怪了。。。

其实是因为“二次渲染”导致上传 的图片中的一句话木马已经不见了。

那这一关该怎么做呢?

文件对比工具进行对比:

将二次渲染的图片和我原先上传的图片shell.gif进行对比(可以用010editor进行对比)

发现:
1.文件头的部分有一些区别。
2.一句话木马 的内容被删去了。

解决思路:把木马加载哪一个地方,木马才不会被删掉。

当然我自己有一个图片(不会因为“二次渲染”而导致木马被删掉),
上传文件:
在这里插入图片描述

再次连接webshell就成功。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,上传图片的代码片段主要包括对文件类型的判断和移动文件的操作。在引用\[1\]中,代码使用了`$_FILES\['upload_file'\]\['type'\]`来判断上传文件的类型,只接受`image/jpeg`、`image/png`和`image/gif`三种类型的图片。如果文件类型符合要求,则将文件移动到指定路径。如果移动成功,则设置`$is_upload`为`true`。如果移动失败,则设置`$msg`为"上传出错!"。如果文件类型不正确,则设置`$msg`为"文件类型不正确,请重新上传!"。如果文件夹不存在,则设置`$msg`为"文件夹不存在,请手工创建!"。 在引用\[2\]中,代码片段与引用\[1\]类似,但是在移动文件成功后,还对新生成的图片进行了二次渲染,并将其保存到指定路径。同时,原始的上传文件被删除。 在引用\[3\]中,代码片段与引用\[1\]类似,但是在判断文件类型时,使用了`FILES`函数来获取文件的MIME类型。其他部分与引用\[1\]相同。 根据提供的引用内容,无法确定具体的上传图片的功能和实现细节。如果您有关于upload_labs图片上传的具体问题,请提供更多的信息。 #### 引用[.reference_title] - *1* [文件上传漏洞(upload_labs1-12)](https://blog.csdn.net/qq_40448537/article/details/106941123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [upload_labs_pass17_二次渲染](https://blog.csdn.net/qq_51550750/article/details/124115320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [文件上传upload_labs 1-5](https://blog.csdn.net/qq_45564150/article/details/121548836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值