iwebsec-文件上传 06 文件截断上传

发布时间 2023-08-19 15:37:38作者: 别打扰我摸鱼

01、题目分析

image

02、文件上传

如果直接在页面输入框直接输入%00截断符,会生成a.php%00_1319128057.jpg这样的文件,很明显不符合我们的预期

image

然后采用burp抓个包,把包中的post表项中的%00进行url-decode编码,然后再在文件名上进行%00截断,即可实现文件截断上传

image

image

image

03、源码分析

<?php 
if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ // 检查是否存在上传文件
    $upfile=$_FILES["upfile"]; // 保存上传文件信息
    $name=$upfile["name"]; // 获取上传文件的原始文件名
    $type=substr($name, strrpos($name, '.')+1); // 获取上传文件的扩展名
    $size=$upfile["size"]; // 获取上传文件的大小
    $tmp_name=$upfile["tmp_name"]; // 获取上传文件的临时文件名

    $uptypes=array('jpg','jpeg','png','pjpeg','gif','bmp'); // 允许上传的文件类型列表
    $path = 'up/'.$_POST[path].'_'.rand().'.jpg'; // 上传文件保存的路径和文件名,其中 $_POST[path] 是表单字段传递的文件路径信息

    if(!in_array($type, $uptypes)) // 检查上传文件的扩展名是否在允许上传的类型列表中
    {
        echo "<font color='red'>只能上传图像文件!</font>"; // 输出错误提示,只能上传图像文件
        exit; // 终止脚本的执行
    }else{
        $error=$upfile["error"]; // 获取上传文件可能出现的错误代码

        move_uploaded_file($tmp_name,$path); // 将上传的临时文件移动到指定的路径和文件名
        $destination=$path; // 保存上传文件的最终路径和文件名

        echo "上传信息:<br/>"; 
        if($error==0){ // 如果上传过程中没有出现错误
            echo "文件上传成功啦!<br/>"; 
            echo " 文件路径:".$destination; // 输出上传文件的路径和文件名
        }
    }
}
?>