本地靶场2-文件上传漏洞(三)-网络安全

文章目录

      • 12、pass12-白名单-%00截断
      • 13、pass13-白名单-0x00截断
      • 14、pass14-内容及其他-文件头检测
      • 15、pass15-内容及其他-getimagesize
      • 16、pass16-内容及其他-exif_imagetype
      • 17、pass17-内容及其他-二次渲染
      • 18-21
      • 后记

12、pass12-白名单-%00截断

  • 查看源码(部分)

    ...
    $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
    ...
    
  • 分析:

    • 之前代码通过获取文件扩展名,使用白名单过滤
    • 上传文件目标路径通过GET方式传参
  • 利用思路:GET传参,使用%00截断

  • 步骤:

    • 正常上传后缀为jpg|png|gif的php文件
    • bp拦截,传递如图所示参数:在这里插入图片描述
  • 原理:

    • 条件:

      • php版本<5.3.4
        • 实测5.3.29没成功,5.2.17成功
      • 参数:magic_quotes_gpc关闭
    • 在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。截断的产生核心,就是chr(0)字符 。这个字符即不为空(Null),也不是空字符(“”),更不是空格!当程序在输出含有chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致漏洞产生的原因。

  • 适用条件:上传路径可控

13、pass13-白名单-0x00截断

  • 查看源码(部分)

    ...
    $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
    ...
    
  • 分析:其他同pass12,不同的是这里save_path路径改为post方式获取。

  • 利用思路:POST传参,使用0x00截断

  • 步骤:

    • 正常上传后缀为jpg|png|gif的php文件

    • bp拦截

      • 本地靶场2-文件上传漏洞(三)-网络安全_第1张图片
        方式1-直接修改post传递的参数,但是记得%00进行url解码,图示:

      • 方式二-1.php后任意跟字符,修改Hex编码为00,图示:本地靶场2-文件上传漏洞(三)-网络安全_第2张图片

        本地靶场2-文件上传漏洞(三)-网络安全_第3张图片

  • 原理:

    • 条件
      • php版本<5.3.4
        • 实测5.3.29没成功,5.2.17成功
      • 参数:magic_quotes_gpc关闭
    • 同理同pass12,只不过这里参数通过POST方式接收。POST方式不自动解码url编码字符,说以要手动解码url字符%00或者通过Hex直接修改为16进制的00(即0x00)
  • 适用条件:上传路径可控

14、pass14-内容及其他-文件头检测

  • 查看源码(文件头检测部分)

    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;
    }
    
    
    • 分析改函数功能从文件后去前2个字节的内容,拼接转换为整数,根据数值判断是否为jpg|png|gif中的一种,否则为unknown
  • 利用思路:

    • 伪造文件头信息

      • JPEG (jpg),文件头:FFD8FF
      • PNG (png),文件头:89504E47
      • GIF (gif),文件头:47494638
    • 合成图片马

  • 步骤

    • 伪造文件头

      • 上传带有php一句话的php文件

      • 拦截修改文件头信息在这里插入图片描述

      • 通过菜刀连接

    • 合成图片马

      • copy 1.png /b + 1.php/a 2.png
        
      • 上传

      • 菜刀链接

  • 原理:每种文件头信息都有其唯一标志,通过伪造文件的头信息或者合成图片马,可以绕过通过文件头检测文件类型,进而通过菜刀链接

15、pass15-内容及其他-getimagesize

利用思路和原理同pass14,getimagesize函数的详细说明自行查阅相关文档

16、pass16-内容及其他-exif_imagetype

利用思路和原理同pass14,exif_imagetype函数的详细说明自行查阅相关文档

17、pass17-内容及其他-二次渲染

这里我们只考虑二次渲染的问题。

这里我们以gif图片为例,通过copy命令制作一个图片马,上传,对比上传前后,二次渲染会把后面加入的一句话木马去除。

显然,这样的图片马上传方式失败了。

  • 利用思路:不过二次渲染会保留一些文件内容不会改变,所以在制作图片马之前,我们先观察二次渲染前后图片不会改变的地方,将其代码写入其中即可绕过二次渲染。

  • 步骤:

    • 利用010Editor软件对比文件上传前后一致的代码部分:本地靶场2-文件上传漏洞(三)-网络安全_第4张图片

    • 替换后在上传对比:本地靶场2-文件上传漏洞(三)-网络安全_第5张图片

这就完成了绕过,根据图片格式大小等的不同,代码匹配有所差异。

  • 原理:二次渲染会保留部分代码与原文件相同,这里我们就可以插入一句话,通过菜刀连接,完成绕过。

18-21

下面几关给出参考连接,不在详述,如有问题,可以解答。

后记

  • 参考链接
    1. upload-labs(12-21)通关教程
    2. upload-labs通关详解以及相关知识点

QQ群:433529853

你可能感兴趣的:(网络安全,web安全,文件上传漏洞)