• ctf-pikachu-fileupload


    File Upload(文件上传漏洞

    漏洞产生原因:用户上传文件时,在后台并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段来绕过安全措施从而上传一些恶意文件(如:一句话木马),从而通过该恶意文件的访问来控制整个web后台。

    文件上传漏洞测试流程

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

    1. client check

    1. 随意上传一个文件。

      最好是上传一个网页不允许的文件类型,这样可以看出是如何对上传文件进行限制的。这里上传了一个php文件。
      在这里插入图片描述
      网页弹窗提示文件不符合要求,因此文件上传的限制有可能是在前端。

    2. 因此我们打开网页控制台,并找到按钮的html代码。
      在这里插入图片描述
      然后发现上传按钮中存在一个函数checkFileExt,我们打开网页源代码,分析该函数的作用。
      在这里插入图片描述
      发现该函数就是限制上传文件的后缀名的一个函数,如果满足后缀名为jpg、png、gif的文件可以上传,不满足则弹窗。

    3. 修改网页前端代码,将该限制去除。
      在这里插入图片描述

    4. 上传一个一句话木马文件system.php

      文件内容:

       system($_GET['x']);?>
      
      • 1

    在这里插入图片描述
    文件上传成功,并且返回了该一句话木马文件的路径。

    1. 更改浏览器的url,给x传参,即可进行攻击。
      在这里插入图片描述
      在这里插入图片描述

    2. MIME type

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

    具体介绍:MIME详解

    MIME 类型通用结构:

    type/subtype
    
    • 1

    MIME 的组成结构非常简单,由类型与子类型两个字符串中间用 / 分隔而组成,不允许有空格。type 表示可以被分多个子类的独立类别,subtype 表示细分后的每个类型。

    例如:

    超文本标记语言文本 .html、.html:text/html
    普通文本 .txt: text/plain
    RTF 文本 .rtf: application/rtf
    GIF 图形 .gif: image/gif
    JPEG 图形 .jpeg、.jpg: image/jpeg
    au 声音文件 .au: audio/basic
    MIDI 音乐文件 mid、.midi: audio/midi、audio/x-midi
    RealAudio 音乐文件 .ra、.ram: audio/x-pn-realaudio
    MPEG 文件 .mpg、.mpeg: video/mpeg
    AVI 文件 .avi: video/x-msvideo
    GZIP 文件 .gz: application/x-gzip
    TAR 文件 .tar: application/x-tar

    $_FILES()函数介绍:通过使用PHP的全局数组$_FILES,你可以从客户计算机向远程服务器上传文件。

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

    例如:
    在这里插入图片描述

    该种情况的漏洞在于:后台使用了$_FILES数组获取type来进行文件类型的比对。而$_FILES数组获取type是从前端的content-type中获取的,因此我们可以抓包并修改该字段,从而绕过后端的检查。

    1. 上传一句话木马文件。
      在这里插入图片描述
      发现后端只接受jpg、jpeg、png类型的文件。

    2. 使用burpsuite进行抓包。
      在这里插入图片描述
      由于$_FILES数组获取type是从前端的content-type中获取的,因此我们可以抓包并修改该字段,从而绕过后端的检查。

      修改content-type为

       image/png
      
      • 1

      在这里插入图片描述
      这样一来就能上传成功了。
      在这里插入图片描述

    3. 修改url进行攻击即可。
      在这里插入图片描述
      在这里插入图片描述

    3. getimagesize

    getimagesize介绍:Getimagesize()是PHP用来判断目标文件是否为一个图片的函数,通过读取该16进制文件的前几个字符,看是否符合图片的要求(因为相同格式的图片的前几个字符都是一致的)。返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否为图片的话,会存在问题。

    如何绕过:伪造图片前几个字符

    图片木马的制作:

    方法1: 直接伪造头部GIF89A
    方法2: CMD:copy /b test.png + muma.php cccc.png (格式:copy /b 正常图片 + 木马 新生成的图片)
    方法3:使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令。

    1. 制造一个图片木马。

      打开cmd,使用命令:

       copy /b kb.png + system.php ccc.png
      
      • 1

      注意其中kb.png为正常图片,system.php为木马文件,ccc.png为新生成的图片木马。

      在这里插入图片描述

    2. 在网页中上传该图片木马。
      在这里插入图片描述

    3. 进行攻击。

      将木马图片上传成功后,我们可以利用文件包含漏洞进行利用。
      url为:

       http://127.0.0.1/pikachu-master/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2022/08/21/4420386302054d07c77924137639.png&submit=%E6%8F%90%E4%BA%A4?x=ipconfig
      
      • 1

      在这里插入图片描述
      漏洞利用成功,但是返回的是乱码,这里主要是为了讲解原理。

    总结

    防范措施:

    1. 不要在前端使用js实施上传限制策略
    2. 通过服务器端对上传文件进行限制:
      1. 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性等,不要仅仅检查后缀。
      2. 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则),这样即使攻击者传上来木马文件,也无法找到其路径进行利用
      3. 对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害
  • 相关阅读:
    OpenSSL生成PKCS#8私钥和公钥
    java毕业设计参考文献Springboot+mysql+freemark校园竞赛报名管理平台[包运行成功]
    python函数标准
    计算机网络【HTTP协议】
    设计模式——模板方法模式(Template Pattern)+ Spring相关源码
    基于Docker从零到一实操MySql的主从复制
    Kubernetes学习篇之数据加密
    golang中的正则表达式使用注意事项与技巧
    python (语音)信号拆分为数据块,计算短期能量和过零率
    攻防世界-web-wzsc_文件上传
  • 原文地址:https://blog.csdn.net/Dajian1040556534/article/details/126451918