Upload-labs靶场Pass-20
审计源码
$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","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");$file_name = $_POST['save_name'];$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);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 . '文件夹不存在,请手工创建!';}
}
这段代码的功能是实现一个基本的文件上传功能,包括对文件类型的限制和上传路径的验证。以下是详细分析:
功能流程分析
-
初始化变量:
$is_upload
用于标记上传是否成功,初始值为false
。$msg
用于存储反馈信息,初始值为null
。
-
检测表单提交:
- 使用
if (isset($_POST['submit']))
检查表单是否提交(假设表单通过POST
提交,并包含submit
键)。
- 使用
-
上传路径检查:
file_exists(UPLOAD_PATH)
检查目标上传路径是否存在。- 如果不存在,设置
$msg
提示用户该目录未找到,需要手动创建。
-
文件类型过滤:
- 定义了一个
$deny_ext
数组,列出了禁止上传的文件扩展名,这些通常是可执行文件或可能含有恶意代码的文件类型(如.php
、.html
、.jsp
等)。 - 获取用户输入的文件名
$_POST['save_name']
并通过pathinfo()
提取其扩展名,保存在$file_ext
中。 - 使用
in_array()
检查该扩展名是否在禁止列表$deny_ext
中:- 如果扩展名在禁止列表中,则设置
$msg
为“禁止保存为该类型文件!”并终止上传流程。 - 如果文件类型允许,则继续执行上传操作。
- 如果扩展名在禁止列表中,则设置
- 定义了一个
-
文件上传和保存:
- 如果文件类型允许上传,则使用
move_uploaded_file()
将文件从临时路径 ($_FILES['upload_file']['tmp_name']
) 移动到目标目录 (UPLOAD_PATH . '/' . $file_name
)。 - 如果
move_uploaded_file()
成功,则设置$is_upload = true
,表示上传成功。 - 如果移动失败,设置
$msg
为“上传出错!”以提示上传失败。
- 如果文件类型允许上传,则使用
-
反馈信息:
- 无论是上传成功还是失败,代码会通过
$is_upload
和$msg
提供上传结果的反馈。
- 无论是上传成功还是失败,代码会通过
方法1:大写绕过黑名单
从源码分析可以看到后端没有进行大小写转换,黑名单也不够完整
所以直接大小写后缀来绕过
方法2:点后缀
阅读代码发现缺少了deldot函数 删除文件名最后一个点
方法3:::$DAATA
这一关黑名单,没有对:: D A T A 进行处理使用 : : DATA 进 行 处 理 使用:: DATA进行处理使用::DATA 进行处理,可以使用::$DATA绕过黑名单
php在window的时候如果文件名+“:: D A T A " 会把 : : DATA"会把:: DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持”::$DATA"之前的文件名
抓包,修改文件名在后面添加::$DATA
.上传时候保存的文件名不能用php,可以考虑大小写之类
方法4:空格
审计代码,没有发现去掉空格的函数
上传php文件,抓包
方法5:. .点空格点
方法6:%00截断
方法7:点杠绕过
move_uploaded_file会忽略末尾的/.