【文件上传绕过】——后端检测_内容检测图片马绕过

文章目录

    • 一、实验目的:
    • 二、工具:
    • 三、实验环境:
    • 四、漏洞说明:
    • 五、实验过程:
      • 1. 图片马制作:
        • 1.1 文件头检测+文件内容检测文件类型(没有进行后缀名白名单检测):
        • 1.1.1 webjianshangchuan靶场uploadgetimagesize上传:
        • 1.2 文件头检测(文件内容检测)+白名单(jpg png gif)文件后缀名检测:
          • 1.1.1 upload-labs闯关游戏(Pass-13):
          • 1.1.2 upload-labs闯关游戏(Pass-14):

一、实验目的:

1、通过本次实验掌握内容验证上传的原理。
2、通过upload-labs-master闯关游戏Pass-13Pass-14,掌握图片马绕过内容检测的技术。
3、学会图片马制作方法。

二、工具:

BurpSuite
火狐/谷歌浏览器
cmd命令行

三、实验环境:

靶 机: windows10虚拟机:192.168.100.150
       wenjianshangchuan靶场
      upload-labs-master闯关游戏
      phpstudy2018搭建网站

攻击机: 物理机

四、漏洞说明:

  一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。
  本实验就是将一句话木马插入到一个[合法]的图片文件当中,然后用webshell管理工具进行远程连接。

五、实验过程:

1. 图片马制作:

1.1 文件头检测+文件内容检测文件类型(没有进行后缀名白名单检测):

准备一张图片,这里为a.png,和一个一句话木马,通过以下命令合成一个图片马3.php
a.php内容:

 phpinfo(); ?>

命令:

copy a.png /b + a.php /a 3.php  
/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件
/a:指定以ascii格式复制、合并文件用于txt等文本类文件

命令帮助:
【文件上传绕过】——后端检测_内容检测图片马绕过_第1张图片


注:这条命令的意思是:通过copy命令,把a.png图片文件,以二进制文件形式添加到a.php文件中,以ASCII文本文件形式输出为3.php文件。
以文本文件形式打开生成的3.php文件,查看合成的图片马的效果:

1.1.1 webjianshangchuan靶场uploadgetimagesize上传:

【文件上传绕过】——后端检测_内容检测图片马绕过_第2张图片

【文件上传绕过】——后端检测_内容检测图片马绕过_第3张图片

【文件上传绕过】——后端检测_内容检测图片马绕过_第4张图片

复制图片链接后,发现可以正常进行解析:

【文件上传绕过】——后端检测_内容检测图片马绕过_第5张图片

1.2 文件头检测(文件内容检测)+白名单(jpg png gif)文件后缀名检测:

图片马有两个要求:
1、图片马肯定是图片格式的文件。
2、在图片马里面肯定有图片格式的文件头,或者整张图片的数据。一般我们添加整张图片的数据。

准备一张图片,这里为a.png,和一个一句话木马,通过以下命令合成一个图片马1.png

命令:

copy a.png /b + a.php /a 1.png
 /B  表示一个二进位文件。
 /A  表示一个 ASCII 文本文件。

【文件上传绕过】——后端检测_内容检测图片马绕过_第6张图片

1.1.1 upload-labs闯关游戏(Pass-13):

页面源码:

function getReailFileType($filename){
    $file = fopen($filename, "rb");  //以只读的模式打开$filename文件,模式为二进制方式。
    $bin = fread($file, 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_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

1. 上传我们合成的图片马1.png
【文件上传绕过】——后端检测_内容检测图片马绕过_第7张图片
2. 复制图片链接,进行访问,发现无法解析为php脚本文件,访问到的还是一张图片:
【文件上传绕过】——后端检测_内容检测图片马绕过_第8张图片
通过上面我们发现,如果服务器对我们上传的文件进行了内容检测+白名单检测时,我们再进行访问上传的图片马是无法解析为一句话木马的,只能访问到图片,这个时候我们只能结合解析漏洞 文件包含进行绕过。

了解解析漏洞点我(还没有进行发布)
了解文件包含点我(还没有进行发布)

1.1.2 upload-labs闯关游戏(Pass-14):

页面源码:

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_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

1. 上传我们合成的图片马1.png

【文件上传绕过】——后端检测_内容检测图片马绕过_第9张图片

2. 复制图片链接,进行访问,发现无法解析为php脚本文件,访问到的还是一张图片:
【文件上传绕过】——后端检测_内容检测图片马绕过_第10张图片

你可能感兴趣的:(渗透测试,php,网络安全,渗透测试,web,service)