upload-labs靶场Pass-10
upload-labs靶场Pass-10
分析源码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");$file_name = trim($_FILES['upload_file']['name']);$file_name = deldot($file_name);//删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA$file_ext = trim($file_ext); //首尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.$file_name;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
分析源码
这段 PHP 代码的功能是处理文件上传,具体步骤如下:初始化变量:$is_upload 被设置为 false,用于标记文件是否成功上传。
$msg 被初始化为 null,用于存储任何错误消息。
检查表单提交:代码首先检查是否有表单提交(isset($_POST['submit']))。
检查上传目录:使用 file_exists(UPLOAD_PATH) 检查指定的上传目录是否存在。如果不存在,设置 $msg 为相应的错误信息。
定义禁止的文件扩展名:$deny_ext 数组包含了一系列不允许上传的文件扩展名(如 .php, .html, .jsp 等),以防止上传潜在的恶意文件。
处理上传文件:从 $_FILES['upload_file'] 中获取上传文件的名称,并进行处理:
使用 trim() 去除文件名两端的空格。
调用 deldot($file_name) 函数(假设该函数用于删除文件名末尾的点)。
使用 strrchr() 获取文件扩展名,并将其转换为小写。
使用 str_ireplace() 去除扩展名中的 ::$DATA 字符串(这通常是为了防止某些攻击)。
使用 trim() 去除扩展名两端的空格。
检查文件扩展名:使用 in_array() 检查文件扩展名是否在禁止的扩展名列表中。如果不在禁止列表中,继续处理上传。
移动上传文件:使用 move_uploaded_file() 将临时文件移动到指定的上传路径。如果成功,设置 $is_upload 为 true;如果失败,设置 $msg 为“上传出错!”。
处理不允许的文件类型:如果文件扩展名在禁止列表中,设置 $msg 为“此文件类型不允许上传!”。
处理上传目录不存在的情况:如果上传目录不存在,设置 $msg 为“UPLOAD_PATH 文件夹不存在,请手工创建!”。
总结
这段代码的主要功能是安全地处理文件上传,确保上传的文件不包含潜在的恶意代码(通过检查文件扩展名),并提供相应的错误消息以便用户了解上传过程中的问题。
原理
发现他对去除点和空格只进行了一遍,没有循环遍历检查
所以我们可以构造出. .
文件如1.php. .
即点,空格,点
这样,他在进行检查时候
使用 trim() 去除文件名两端的空格。1.php. .
调用 deldot($file_name) 函数(假设该函数用于删除文件名末尾的点) 。 1.php.
此处点后有个空格
使用 strrchr() 获取文件扩展名,并将其转换为小写。1.php.
空格还没有去除
使用 str_ireplace() 去除扩展名中的 ::$DATA 字符串(这通常是为了防止某些攻击)。1.php.
空格还没有去除
使用 trim() 去除扩展名两端的空格。1.php.
空格去除
然后上传到服务点为1.php.
文件,由于Windows特性,最后一个点会被去除,变成1.php,最终上传成功。
上传
上传文件
<?php phpinfo(); ?>