如果判断上传的文件 是源文件,而不是修改后缀的文件

Posted 10后程序员劝退师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果判断上传的文件 是源文件,而不是修改后缀的文件相关的知识,希望对你有一定的参考价值。

封装一个公共函数,运用在 上传文件时使用

export const checkFileRealType = (file:any) => 
  return new Promise((resolve, reject) => 
    const reader = new FileReader()
    reader.onload = () => 
      const buffer = new Uint8Array(reader.result as any)
      // console.log(buffer)
      const PNG_MAGIC_NUMBER = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]
      const JPG_JPEG_MAGIC_NUMBER = [0xFF, 0xD8, 0xFF]
      const GIF_MAGIC_NUMBER = [0x47, 0x49, 0x46, 0x38]
      const GLB_MAGIC_NUMBER = [0x67, 0x6C, 0x54, 0x46]
      const MP4_MAGIC_NUMBER = [0x66, 0x74, 0x79, 0x70]
      const WMV_MAGIC_NUMBER = [0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C]
      const AIV_MAGIC_NUMBER = [0x52, 0x49, 0x46, 0x46]

      if ( 
        PNG_MAGIC_NUMBER.every( (header, index) =>  header === buffer[index] ) || 
        JPG_JPEG_MAGIC_NUMBER.every( (header, index) =>  header === buffer[index] ) || 
        GIF_MAGIC_NUMBER.every( (header, index) =>  header === buffer[index] ) ||
        GLB_MAGIC_NUMBER.every( (header, index) =>  header === buffer[index] ) ||
        MP4_MAGIC_NUMBER.every( (header, index) =>  header === buffer[index+4] ) ||
        WMV_MAGIC_NUMBER.every( (header, index) =>  header === buffer[index] ) ||
        AIV_MAGIC_NUMBER.every( (header, index) =>  header === buffer[index] )
      )
        resolve(\'\')
       else 
        ElMessage.error(\'非法文件上传!\')
        return false
      
    
    reader.onerror = () => 
      ElMessage.error(\'非法文件上传!\')
      return false
    
    reader.readAsArrayBuffer(file.slice(0, 8))
  )

以element-ui的 upload组件为例

在问案件上传回调中

beforeAvatarUpload:UploadProps[\'beforeUpload\'] = async(rawFile)=>

    await checkFileRealType(rawFile)

更多文件二进制编码 参考 官方地址  (二进制文件对比表)

 https://en.wikipedia.org/wiki/List_of_file_signatures  

pikachu--文件上传

文件上传

很多网站注册的时候需要上传头像、上传附件等等。

当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。

 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而来控制整个web后台。

文件上传漏洞测试流程:

  1. 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)
  2. 尝试上传不同类型的“恶意文件”,比如xx.php文件,分析结果
  3. 查看html源码,看是否通过js在前端做了上传限制,可以绕过
  4. 尝试使用不同方式进行绕过:黑名单绕过/MIME类型绕过/目录0x00截断绕过等
  5. 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试

 

$_FILES()函数

通过使用PHP的全局数组$_FILES,可以从客户计算机向远程服务器上传文件

第一个参数是表单的input name,第二个下标可以是”name”,”type”,”size”,”tmp_name”,”error”

$_FILES[“file”][“name”]

名称、类型、大小、存储在服务器的文件临时副本名称、由文件上传导致的错误代码

文件上传漏洞防范措施:

1.不要在前端使用js实施上传限制策略

2.通过服务端对上传文件进行限制

   1>进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性

   2>对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)

   3>对服务器端上传文件的目录进行权限控制(比如:只读),限制执行权限带来的危害

 

 回到pikachu     

客户端check板块

 我们上传一句话木马 a.php文件  显示

技术图片

 

 技术图片

 

 

我们打开web控制台  修改代码

技术图片

 

 改为onchange=””   对这个不做限定

技术图片

 

 文件上传成功

技术图片

 

 我们接着访问这个文件  利用一句话木马里的参数进行相应的操作

技术图片

 

 得到想要的信息

技术图片

 

 

MIME type (服务端check)

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义文件名,以及一些媒体文件打开方式。

 每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

常见的MIME类型(通用型):

超文本标记语言文本 .html text/html

xml文档 .xml text/xml

XHTML文档 .xhtml application/xhtml+xml

普通文本 .txt text/plain

RTF文本 .rtf application/rtf

PDF文档 .pdf application/pdf

Microsoft Word文件 .word application/msword

PNG图像 .png image/png

GIF图形 .gif image/gif

JPEG图形 .jpeg,.jpg image/jpeg

 

 回到pikachu平台

我们抓包  改包

首先上传一个图片   接着上传一句话木马 a.php

按照图片的格式改到一句话木马文件的浏览器头那里

技术图片

 

 技术图片

 

 

发送到repeater   修改类型

 技术图片

 

 成功  

getimagesize()

getimagesize()返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题

但是我们可以绕过,因为图片头可以被伪造

 

我们可以制作一个恶意代码的图片

图片木马的制作:

方法一:直接伪造头部GIF89A

方法二:CMD:copy  /b  正常图片.png  +  恶意代码.php  合成新的图片.png

方法三:使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令

 

回到pikachu

我们使用第二种方法  合出来一个带有恶意代码的图片

技术图片  技术图片

 

 技术图片

 

 技术图片

 

 

上传gyx.png   成功上传  我们获取到一个路径

但实际上合并起来的图片里的恶意代码是不被执行的,需要结合文件下载漏洞修改?

Filename  改成我们获取的路径下面,在尝试加几个../,就可以执行我们的恶意代码了

 

具体的操作可以参考一个下面的视频操作

https://www.bilibili.com/video/av63517752?p=44

 

以上是关于如果判断上传的文件 是源文件,而不是修改后缀的文件的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 判断文件名后缀是不是为 csv xls xlsx

java上传视频除了检查后缀,怎么判断文件格式,前8位来判断.flv格式有的00000018有的464C5601可靠么?求解

上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?

linux 没有后缀的文件怎么打开

js 上传文件后缀名的判断 var flag=false;应用

pikachu--文件上传