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

文章目录

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

1. Unsafe upfileupload

漏洞描述

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

漏洞原理

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

漏洞危害

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

1.1 客户端检查(client check)

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

发现只能上传图片

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

修改上传文件的后缀名。

上传成功

使用中国蚁剑进行连接

虚拟终端

1.1.1 源代码分析

clientcheck.php

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

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字段进行检测,判断其是否为指定的文件格式。

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

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

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

修改Content-Type值为:image/jpeg

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

使用中国蚁剑进行连接

1.2.1 源代码分析

servercheck.php

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

uploadfunction.php

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

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

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

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

1.3 getimagesize()

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

文件幻数

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


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

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

上传成功

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

复制代码
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

蚁剑连接成功

1.3.1 源代码分析

getimagesize.php

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

uploadfunction.php

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

1.4 文件上传漏洞防御

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

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

相关推荐
蝸牛ちゃん6 分钟前
《计算机信息系统安全保护等级划分准则》(GB17859-1999):中国信息安全等级保护的基石
安全·信息安全·系统安全·gb17859-1999·信息安全等级·安全等级划分
Bruce_Liuxiaowei32 分钟前
绕过文件上传漏洞并利用文件包含漏洞获取系统信息的技术分析
运维·网络安全·php·apache
峥嵘life3 小时前
Android14 通过AMS 实例获取前台Activity 信息
android·安全
清咖啡7 小时前
安全生产基础知识(一)
安全·学习方法
Xasxxs9 小时前
【网络安全】SQL注入——无列名注入
sql·安全·web安全
ZLlllllll012 小时前
Vulhub靶场组件漏洞(XStream,fastjson,Jackson)
安全·web安全·fastjson·xstream·vulhub
掉头发的王富贵12 小时前
涉及第三方Api加密通信,我连夜设计了一套让领导满意的方案
后端·安全·api
白帽小野1 天前
CEH、OSCP、CISP、CISSP 四大网络安全认证攻略
安全·认证
烷烯1 天前
安全基础DAY1-安全概述
linux·服务器·安全·常见网路攻击
Johny_Zhao1 天前
Rsync + Sersync 实时数据同步方案
linux·网络安全·信息安全·云计算·rsync·系统运维·sersync