Pikachu靶场——文件上传漏洞(Unsafe upfileupload)

文章目录

  • 1. Unsafe upfileupload
    • 1.1 客户端检查(client check)
      • 1.1.1 源代码分析
    • 1.2 服务端检查(MIME type)
      • 1.2.1 源代码分析
    • 1.3 getimagesize()
      • 1.3.1 源代码分析
    • 1.4 文件上传漏洞防御

1. Unsafe upfileupload

漏洞描述

文件上传是Web应用必备功能之一,如头像上传,附件分享等。如果服务器配置不当或者没有进行足够的过滤,Web用户就可以上传任意文件,包括恶意脚本文件,exe程序等等,这就造成了任意文件上传漏洞。

漏洞原理

大部分的网站和应用系统都有上传功能,而程序员在开发文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。

漏洞危害

可能会导致用户信息泄露,被钓鱼,甚至使攻击者可以直接上传WebShell到服务器,进而得到自己想要的信息和权限。最终达到对数据库执行、服务器文件管理、服务器命令执行等恶意操作,甚至完全控制服务器系统。

1.1 客户端检查(client check)

上传一个一句话木马的php文件

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第1张图片

发现只能上传图片

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第2张图片

修改文件的后缀名为.png,然后进行抓包。

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第3张图片

修改上传文件的后缀名。

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第4张图片

上传成功

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第5张图片

使用中国蚁剑进行连接

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第6张图片

虚拟终端

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第7张图片

1.1.1 源代码分析

clientcheck.php

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第8张图片

说明:这里过滤方式是白名单过滤,但是放在了前端进行校验。前端的一切过滤都可以被绕过。

1.2 服务端检查(MIME type)

MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

MIME 在传输数据时使用两个主要的元素:类型和子类型。前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类,常见的MIME类型,比如:

超文本标记语言文本.html texthtml

普通文本.txt text/plain

RTF文本.rtf application/rtf

GIF图形.gif image/gif

JPEG图形.ipeg.jpg image/jpeg

说明:服务端会对上传的数据中的content-type字段进行检测,判断其是否为指定的文件格式。

随便上传一个文件,回显出限制上传的文件格式。

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第9张图片

这里只能上传jpg,jpeg,png格式的文件,典型的白名单。

这里我们上传一个wuhu.php文件,然后点击开始上传的时候抓包。

修改Content-Type值为:image/jpeg

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第10张图片

然后文件就上传成功了,页面显示出了文件的上传路径。

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第11张图片

使用中国蚁剑进行连接

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第12张图片

1.2.1 源代码分析

servercheck.php

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第13张图片

说明:$mime是一个包含合法MIME类型的数组,也就是MIME类型白名单。然后将这个白名单作为参数传入了upload_sick()函数进行服务器端的检测。

uploadfunction.php

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第14张图片

upload_sick()函数的定义如下,该函数不安全之处在于两点:

  1. 仅检查了MIME类型,可以通过抓包修改进行绕过。

  2. 保存文件的时候没有重命名文件,这样即使网页不回显文件保存路径,也有很大概率可以被攻击者猜测到。

如果上传文件的路径被攻击者获得了,那么就可以连接shell了。

1.3 getimagesize()

使用getimagesize() 进行文件内容检测,只检测文件头部

文件幻数

getimagesize()函数判断一个文件是否是图片的时候,采用的是文件幻术。

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第15张图片

所有的GIF文件都是47 49 46 开头的。

这里我们上传一个以png结尾的一句话木马,然后使用bp抓取数据包,在文件内容里面的头部添加GIF89a

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第16张图片

上传成功

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第17张图片

虽然上传成功了,但是现在蚁剑还是连接不上,需要结合文件包含漏洞去实现。

http://192.168.188.183/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2023/09/09/76459764fc0cb7785d8730212793.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第18张图片

蚁剑连接成功

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第19张图片

1.3.1 源代码分析

getimagesize.php

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第20张图片

说明:指定了两个白名单,$_type是文件后缀名的白名单,$_mime是MIME type的白名单,然后将两个白名单和一些其他参数一起传入到uploadfunction.php文件中的upload()函数。

uploadfunction.php

Pikachu靶场——文件上传漏洞(Unsafe upfileupload)_第21张图片

说明:在upload()函数中使用了getimagesize()方法来判断是否是图片,使用文件幻数也可以进行绕过。

1.4 文件上传漏洞防御

  • 采用白名单的方式验证文件的后缀名。
  • 限制上传文件的大小,限制上传文件的类型。
  • 验证文件的上传方式。
  • 对文件进行一定复杂的重命名。
  • 进行二次渲染,过滤图片木马
  • 不要暴露文件上传后的路径。

可参考我写的另一篇文章里面对改漏洞有详细说明:任意文件上传。

你可能感兴趣的:(Pikachu,网络安全,系统安全,安全,pikachu,靶场,文件上传漏洞,web安全)