upload-labs16关
源码:
function isImage($filename){//需要开启php_exif模块$image_type = exif_imagetype($filename);switch ($image_type) {case IMAGETYPE_GIF:return "gif";break;case IMAGETYPE_JPEG:return "jpg";break;case IMAGETYPE_PNG:return "png";break; default:return false;break;}
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$res = isImage($temp_file);if(!$res){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}
准备好图片以及代码,使用通过cmd终端,使用copy ceshi.jpg/b+test.php/a test.jpg生成图片木马以及打开php_exif
查看是否包含成功要加file
然后使用中国蚁剑
upload-labs20关
$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 . '文件夹不存在,请手工创建!';}
}
分析:
黑名单机制:
代码定义了一个黑名单数组 $deny_ext,包含常见的危险文件扩展名(如 .php、.jsp、.asp 等)。
使用 pathinfo() 函数获取文件扩展名,并检查是否在黑名单中。
文件保存逻辑:
如果文件扩展名不在黑名单中,文件会被保存到服务器。
文件保存路径为 UPLOAD_PATH . '/' . $file_name,文件名由用户控制。
潜在漏洞:
黑名单可能不完整,攻击者可以使用未列入黑名单的扩展名(如 .php7、.phar 等)。
文件名由用户控制,攻击者可能通过特殊文件名绕过检查。
方法:
1、使用未列入黑名单的扩展名
黑名单中可能遗漏了一些危险扩展名,例如 .php7、.phar、.phtml 等。
攻击者可以将恶意文件保存为这些扩展名。
2、使用双扩展名
攻击者可以在文件名中使用双扩展名(如 shell.jpg.php),利用黑名单检查的漏洞。
如果黑名单检查仅验证最后一个扩展名(.php),文件会被拒绝。
但如果黑名单检查不严谨,文件可能会被成功上传。