upload-Labs靶场“11-15”关通关教程-一、第十一关 %00截断GET上传

时间:2024-03-09 09:59:47

1、源码分析

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

添加注释解读:

$is_upload = false;
$msg = null;
# 检查是否有名为 submit 的表单提交
if(isset($_POST['submit'])){
	# 包含允许上传的文件扩展名的数组即为白名单
    $ext_arr = array('jpg','png','gif');
    # 获取上传文件的扩展名
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    # 检查上传文件的扩展名是否在允许的扩展名数组中
    if(in_array($file_ext,$ext_arr)){
    	# 获取临时文件的路径
        $temp_file = $_FILES['upload_file']['tmp_name'];
        # 构建目标文件路径 $img_path,使用 rand(10, 99) 生成两位随机数和当前日期时间
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
        # 使用 move_uploaded_file($temp_file, $img_path) 将上传的文件移动到目标路径
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是
$_GET['save_path']服务器接受客户端的值,这个值可被客户端修改。

2、%00截断GET上传

这里我们便将上传参数更改:
在这里插入图片描述
在这里插入图片描述
更改掉之后就会将1.jpg覆盖给1.php通过%00进行截断,即为1.php%001.jpg变为1.php:
在这里插入图片描述
然后访问执行即可。