【文件上传绕过】——后端检测_文件头检测漏洞

本文详细介绍了如何通过添加文件头来绕过Webshell检测,通过C32Asm工具操作1.php文件并演示在uploadwenjiantou和uploadgetimagesize靶场的应用,揭示了文件头在信息安全中的重要性。
摘要由CSDN通过智能技术生成

一、实验目的:

1、通过本次实验掌握文件头检测的原理。
2、通过fileupload_test靶场,掌握文件头检测绕过技术。

二、工具:

C32Asm(以16进制的方式打开文件)
火狐/谷歌浏览器

三、实验环境:

靶 机: windows10虚拟机:192.168.100.150
      fileupload_test靶场
      phpstudy2018搭建网站

攻击机: 物理机
点击下载fileupload_test靶场 提取码:poz7

–来自百度网盘超级会员V5的分享

四、环境准备:

下载上面的靶场后,解压到网站主目录:

五、什么是文件头:

  我们都知道,文件的扩展名是用来识别文件类型的。通过给他指定扩展名,我们可以告诉自己,也告诉操作系统我们想用什么方式打开这个文件。比如我么会把.jpg的文件默认用图片显示软件打开,.zip 文件会默认用解压软件打开等等。
  然而,扩展名完全是可以随便改改的。我们可以给文件设置一个任意的扩展名,当然也可以不设置扩展名。这样一来我们就不能了解到这个文件究竟是做什么的,究竟是个什么样的文件。我们或许也会疑惑,为什么一个软件,比如视频播放器,就能用正确的方式打开.mp4 .rmvb .wmv 等等的视频?
  事实上,所有的文件都是以二进制的形式进行存储的,本质上没有差别。之所以使用的方法不同,只是因为我们理解他的方式不同。在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。
  文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息。如用uestudio工具以十六进制方式查看zip格式的文件,其文件内容头部有50 4B 03 04这样的十六进制信息。同理jpg文件状况有FF D8 FF E0 xx xx 4A 46这样的十六进制信息,其实这此十六进制都是表示一些特殊字条。
  Linux下我们可以用file命令直接查看文件的实际格式,但是他本质上也是利用文件头标志来进行文件类型判断的。下面就简要介绍下手动判断文件真实类型的方法。

六、常见的文件头:

注意:下面的文件头的格式是16进制的格式:

GIF:47 49 46 38 39 61
png:89 50 4E 47 0D 0A 1A 0A
JPG:FF D8 FF E0 00 10 4A 46 49 46

在进行文件头绕过时,我们可以把上面的文件头添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的。

七、实验过程:

1. 给webshell添加文件头:

下面我们使用1.php文件做实验,文件是一个phpinfo文件,我们把文件头添加到这个1.php中:

注:因为文件头是16进制的文件格式,我们需要使用C32Asm这个工具以16进制的格式打开这个文件。
点击下载C32Asm_16进制文件编辑器 提取码:b6zr

下面我们点击打开C32Asm这个工具,并使用这个工具打开上面的1.php文件:
在这里插入图片描述
打开效果如下:
在这里插入图片描述

下面我们给1.php文件添加文件头的效果:
GIF:

png:

2. uploadwenjiantou实验靶场

实验源码:

<?php
header("Content-type: text/html; charset=utf-8");

function getReailFileType($filename){
    $file = fopen($filename, "rb");  //打开上传的这个文件
    $bin = fread($file, 2); //只读这个文件的前2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name']; 
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = "upload/".$_FILES['upload_file']['name'];
        echo "$img_path";
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
?>

1、通过上面方式添加文件头后,我们把1.php上传到靶场里面,发现可以上传成功:



2、复制图片链接后,访问可以解析文件:

3. uploadgetimagesize实验靶场

实验源码:

<?php
header("Content-type: text/html; charset=utf-8");
function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

$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/".$_FILES['upload_file']['name'];
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
?>

1、通过上面方式添加文件头后,我们把1.php上传到靶场里面,发现可以上传成功:

2、复制图片链接后,访问可以解析文件:

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传漏洞是一种常见的Web安全漏洞,攻击者通过绕过文件检测机制,上传恶意文件到服务器上,从而执行任意代码或者获取敏感信息。文件绕过是指攻击者通过修改文件的内容或者文件名来欺骗服务器的文件类型检测机制,使得服务器无法正确判断文件的真实类型。 为了绕过文件检测机制,攻击者可以采取以下几种方法: 1. 修改文件内容:攻击者可以在文件的开添加一些特殊字符或者修改文件的二进制内容,使得文件部的标识符不再符合服务器的文件类型检测规则。 2. 修改文件扩展名:攻击者可以将恶意文件的扩展名修改为服务器允许上传的合法文件类型的扩展名,从而欺骗服务器认为该文件是合法的。 3. 使用双重扩展名:攻击者可以将恶意文件的扩展名修改为两个或多个扩展名的组合,例如将`.php`文件修改为`.jpg.php`,这样服务器可能只会检测到第一个扩展名,从而误判文件类型。 4. 使用特殊编码:攻击者可以使用特殊编码对文件进行编码,使得文件部的标识符被隐藏或者混淆,从而绕过文件类型检测。 为了防止文件上传漏洞文件绕过,开发者可以采取以下几种措施: 1. 文件类型检测:在服务器端对上传的文件进行类型检测,可以通过检查文件的魔术数字、文件扩展名、MIME类型等方式来判断文件的真实类型。 2. 文件名过滤:对上传的文件名进行过滤,只允许合法的文件名字符,避免使用特殊字符或者路径分隔符。 3. 文件内容检测:对上传的文件内容进行检测,可以通过解析文件内容或者使用杀毒软件等方式来检测文件是否包含恶意代码。 4. 文件权限设置:限制上传文件的存储路径的访问权限,避免攻击者通过上传恶意文件获取服务器的敏感信息或者执行任意代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值