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),文件会被拒绝。
但如果黑名单检查不严谨,文件可能会被成功上传。