什么是文件上传漏洞

  • 文件上传漏洞是web系统中常见的一种功能,通过文件上传能实现上传图片、视频,以及其他类型的文件,但是随着web中包含的功能越来越多,潜在的网络安全风险也就越大。
  • 如果恶意用户上传了可执行的文件或者脚本,就会导致网站被其控制甚至会使其服务器沦陷,以至于引发恶意的网络安全事件。

文件上传漏洞原理

  • 文件上传漏洞是指用户通过界面上的上传功能上传了一个可执行的脚本文件,而WEB端的系统并未对其进行检测或者检测的逻辑做的不够好。
  • 通常来说文件上传功能是没有问题的,主要是服务器如何对上传的文件如何进行处理。
  • 若WEB未对用户上传的文件进行有效的审查,若存在恶意用户对其上传一句话木马,从而实现控制WEB网站的目的。

什么是webshell

  • Webshell是一种网页后门,通常用asp、jsp或者php编写。
  • WebShell的常见的功能有执行系统命令、窃取用户数据、删除web页面、修改主页等。黑客在入侵了一个网站后,常常在将这些asp或php木马后门文件放置在网站服务器的web目录中,与正常的网页文件混在一起。

Webshell的分类

分类 体量 特点
大马 体积大,包含很多功能 通常会包含调用系统的关键函数,所以通常会加密代码用来隐藏。
小马 体积小,通常只包含文件上传功能 同上
一句话木马 代码极短(只有一行) 使用方便,可以单独作为一个文件,也可以插入其他正常文件中;变形多,难以查杀。

文件上传实战思路

  • 文件上传和文件执行是两个东西
  • 漏洞分类:解析漏洞、cms漏洞、其他漏洞(编辑器漏洞、cve漏洞、安全修复)
  • 思路:如果有一个网站,要从文件上传的方向开始
  • 第一步:先看中间件,看是否存在解析漏洞/CMS/编辑器漏洞/CVE/
  • 如果有,如何找:
  • 字典扫描:扫描会员中心,文件上传的位置
  • 找到后,如何利用:
  • 验证/绕过

文件上传绕过分类

JS类防护

基本概念

  • JS防护就是将上传的文件进行一个格式的验证,但是JS类的防护是用户可以控制的,所有前端的所有验证都是不安全的。

实例upload-labs-Pass01

  • 通过禁用界面JS处理,可以禁用JS防护
  • 在火狐安装插件javascript switcher,可以一键禁用JS处理
    image.png
  • 在upload下就可以看到我们上传的文件
    image.png

黑名单

  • 黑名单就是服务端明确不让上传的格式后缀,例如:rar、php、zip等。

特殊解析后缀

基本概念

  • 特殊解析后缀绕过是由于黑名单过滤规则不严谨,在某些特定的情况下的后缀也能够被当作php文件进行解析,例如PHP2、php3、php4、phtml、pht等情况。
  • 可以使用phtml、php3、php4、php5,当然前提是apache服务器,同时在配置文件夹中需要有将AddType application/x-httpd-php .php .phtml .phps .php1 .php4 .pht 这样的一段话前面的注释删除,重启phpstudy让其生效。

实例upload-labs-Pass03

  • 禁止.asp.aspx.php.jsp类型进行上传
  • 将php文件后缀改为phtml进行绕过,实现文件上传
    image.png

.htaccess解析

基本概念

  • .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置
  • 通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

实例upload-labs-Pass04

  • 通过源码得知第三关使用的phtml被限制了,并且设定了更多的特殊解析后缀,所以使用特殊解析后缀已经无法绕过了
    image.png
  • 这里就可以使用到 .htaccess进行绕过测试。
  • 创建一个 .htaccess文件,使用notepad++编辑
    image.png
  • 然后将.htaccess文件上传,再将php文件改为.jpg文件上传
    image.png
    image.png
  • 可以看到已经成功上传文件了
    image.png

大小写绕过

基本概念

  • 后缀大小写是通过服务端未将后缀进行统一的格式转换,导致可以上传PHP的文件,同时由于Windows系统对后缀大小写并不敏感,所以当在写PHP的改成Php就会被当作PHP进行解析。

实例upload-labs-Pass05

  • 通过源码可知,其未对大小写进行限制,我们可以对php后缀进行大小写变形
    image.png
  • 上传文件
    image.png

点绕过

基本概念

  • 点绕过其实就是利用了Windows对文件和文件名的限制,当将点放在结尾的时候,就会触发操作系统的命名规范问题,所以在生成文件的时候,添加在结尾的点就会被去除。

实例upload-labs-Pass07

  • 通过源码发现,本关并未对结尾点进行检测。
  • 那么这里就可以通过在后缀加上点进行绕过,触发操作系统的命名规范,就会将结尾的点去除
    image.png
  • burp抓包在结尾加个点就可以绕过
    image.png
  • 可以看见成功上传了
    image.png

实例upload-labs-Pass09

  • 通过源码发现,加一个点会被过滤
  • 但是只是过滤一次,所有可以加两个点
    image.png
  • 只需要与Pass07相同的方法,结尾加两个点即可

空格绕过

基本概念

  • 其实空格绕过和点绕过是一样的,都是利用操作系统的特性来进行解析绕过。

实例upload-labs-Pass06

  • 通过源码发现,没有对结尾空格进行限制,所有我们可以在结尾加空格进行绕过
    image.png
  • 成功绕过
    image.png

::$DATA绕过

基本概念

  • 在window的时候如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

实例upload-labs-Pass08

  • 通过源码可知,没有为::$DATA的检测
    image.png
  • 在文件结尾加::$DATA就可以绕过
    image.png
    image.png

双后缀名绕过

基本概念

  • 服务端可能存在将后缀替换为空的情况,但是这就存在一种可能就是在编辑过滤的时候只过滤了一次,所以就出现了可以通过双写就绕过的可能。

实例upload-labs-Pass10

  • 通过源码可以知道,上传指定的文件后缀,会被替换成空,但是只替换一次
    image.png
  • 那么就可以通过双后缀的方式绕过
  • 由于过滤是从左往右,例如pphphp会被过滤成php
    image.png
    image.png

白名单

  • 白名单就是服务端明确可以上传的格式后缀,例如:jpg、png、jpeg等。

MIME绕过

基本概念

  • 服务端MIME类型检测是通过检查http中包含的Content-Type字段中的值来判断上传文件是否合法的。
  • 利用Burp抓包,将报文中的Content-Type改成允许的类型
    1
    2
    3
    Content-Type: image/gif(gif图像)
    Content-Type: image/jpg(jpg图像)
    Content-Type: image/png(png图像)

实例upload-labs-Pass02

  • 通过源码可知,采用了content-type进行后端验证
    image.png
  • 我们可以通过burp抓包对其content-type进行修改
    image.png
    image.png

%00截断

基本概念

  • %00不是代表空格,而是null,一个空字符,当程序执行到%00后,那么后面的数据就会停止,意思就是误当作结束符,把后面的数据直接忽略了,这就会导致漏洞产生。
  • 在文件上传后,利用%00截断,在文件扩展名验证的时候,就会取文件的扩展名进行验证,但是在最后保存在本地的时候,%00就会截断文件名,只保存%00之前的内容。
  • %00只能用于php版本低于5.3的。这里我们需要把phpstudy切换一下版本,把magic_quotes_gpc关闭,以phpstudy为例。其他选项菜单—php扩展及设置—参数开关设置—把magic_quotes_gpc关闭。

内容及其他

文件头检测

基本概念

  • 图片的格式在防护中通常是不会使用后缀进行判断的依据,文件头是文件开头的一段二进制码,不同类型的图片也就会有不同的二进制头。
    1
    2
    3
    JPEG (jpg),文件头:FF D8 FF E1  
    PNG (png),文件头:89 50 4E 47
    GIF (gif),文件头:47 49 46 38
    image.png

实例upload-labs-Pass13

  • 制作木马图
  • 在创建一个图片,和php文件,使用指令copy 1.png/b + p13.php/a 2.png进行合并
    image.png
    image.png
  • 上传合并后的图片,这个图片当中就包含了php语句
    image.png
    image.png

二次渲染

基本概念

  • 二次渲染就是在我们上传的图片后,网站会对图片进行二次处理,比如对图片的尺寸、格式、以及网站对图片进行定义的一些要求等进行处理,并且服务器会对里面的内容进行二次替换更新,在处理完后,会生成一个合规的图片在网站上显示出来。

实例upload-labs-Pass16

  • 通过源码可知,会重新渲染图片,就是说我们上传的图片不会被保存,而是只有图片信息被提取
  • 准备一个gif图片(最好是,因为比较容易),制作成图片马
    image.png
  • 上传图片马
    image.png
  • 将上传的图片马与后台保存的进行对比
  • 使用Beyond Compare 4工具对比
    image.png
  • 发现图片文件前面大部分二次渲染的时候被过滤了,所以我们可以将php语句放在前部分,这样就不会被过滤了,然后保存
    image.png
  • 然后再将该文件进行上传
    image.png
  • 然后再次对比我们会发现,插入的php语句没有被过滤
    image.png

条件竞争

基本概念

  • 条件竞争就是在源代码中是存在校验的,但是校验是在文件上传后,才开始校验,也就是文件先上传至服务器中,然后服务器会对该文件进行校验,当符合的时候则会对文件进行重命名,当文件不符合要求的时候就对将文件进行删除。
  • 而我们则需要在服务器对文件删除前进行访问,由于文件在访问过程中,服务器是无法删除的,所以就可以利用这个节点实现条件竞争。

突破getimagesize函数

基本概念

  • getimagesize函数是用于获取图像大小及相关信息,成功返回一个数组,失败则返回false产生一条e_warning级的错误信息。
  • 通过对图片及代码进行合成图片马,这个时候getimagesize函数既可以获取图片信息,文件后缀php也能够被解析成脚本文件,从而绕过getimagesize函数的限制。

实例upload-labs-Pass14

  • 本关存有getimagesize函数,这个函数的意思是:会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的。
  • 使用办法和第十三关是一样的,前提都是需要存在相关的漏洞。

突破exit_imagetype()函数

基本概念

  • 服务器exit_imagetype()函数检测上传图片类型是否为白名单图片格式来验证上传文件合法性。可以通过制作图片马绕过,再配合文件包含漏洞解析文件来获取服务器配置信息。