当前位置: 首页 > news >正文

WebWall-09.Unsafe file uploads(不安全的文件上传)

概述

文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像,附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断,比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式重命名后存储在指定的目录,如果说后台对上传的文件没有进行任何的安全判断或者判断的条件不够严谨,则攻击者可能会上传一些恶意的文件,从而导致服务器权限被获取。

文件上传漏洞测试流程

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

实验测试

chient check

在这里插入图片描述

如果上传其他文件,会提示我们只允许上传图片

但是我们打开F12看到,这里的JS调用了一个checkFileExt的方法

在这里插入图片描述

这个方法在后面也找得到,大致的意思就是判断文件的扩展名是不是为jpg、png、gif。我们知道这种前端的限制只能起到辅助作用,起不到实质性的作用,我们只需要把之前那个input标签的onchange的属性删除,让上传的时候触发不了这个方法,就可以达到我们上传的目的
补充:新版本的浏览器屏蔽了一下非法的操作,我们可以使用其他的老浏览器实现这个功能
在这里插入图片描述

然后我们上传我们的php一句话脚本

上传的脚本内容

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */
phpinfo();
?>

在这里插入图片描述

访问路径,测试一下我们的脚本是否能执行

http://127.0.0.1/pikachu/vul/unsafeupload/uploads/phpinfo.php

在这里插入图片描述

MIME

MIME意为多目Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。

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

常见的MIME类型

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

普通文本 .txt text/plain

RTF文本 .rtf application/rtf

GIF图形 .gif image/gif

JPEG图形 .ipeg,.jpg image/jpeg

在这里插入图片描述

php里有一个$_files函数来获取请求头里面的Content-Type

因此,我们只需要用抓包修改请求头里Content-Type的值

$_FILES数组内容如下: 
$_FILES['myFile']['name'] 客户端文件的原名称。 
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。 
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。 
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。

修改为

Content-Type: image/png

就可以绕过验证
在这里插入图片描述

getimagesize

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

我们可以伪造图片头

[root@template ~]# ll
1.png   phpinfo.php 2.png 

先查看一下他们的图片头

用linux的xxd命令

[root@template ~]# xxd 1.png | head -n 1
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
[root@template ~]# xxd 2.png | head -n 1 
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR

发现png图片的头部十六进制都一样

那我们可以用windows的cmd命令把一张图片和一个php文件合起来变成一个文件

安排一手

D:>copy /b 1.png + phpinfo.php xxx.png
1.png
phpinfo.php
已复制         1 个文件。

选择两个文件,合成一个新的文件叫xxx.png , 表面上看还是这个图片

发现前面还是正常的图片,但是在最后跟上了我们的一句话木马

还需要了解的是

PHP的文件包含

include在发现错误的时候会继续执行后面的代码

当遇到我们的png的时候,会一直往下读取,执行到我们的一句话的时候就会正确执行

在这里插入图片描述

测试后把这半条代码删除就可以正常上传

成功上传了我们的xxx.png,我们来访问一下,发现可以正常访问,但是,他是一个png

那么我们要这么才能让他执行里面的php代码呢

就要用到我们之前的文件包含漏洞

那就要让本地文件包含漏洞找到我们的png图片

http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2022/08/26/9160096307a32e090b992237754.png&submit=%E6%8F%90%E4%BA%A4

这里使用windows达不到实验效果,需要使用liunx部署,需要猜测哪个目录能访问我们图片所在的路径,经测试我们可以用这个路径访问到我们的phpinfo

防范文件上传漏洞的方法

  1. 不要再前端进行限制
  2. 再服务端验证文件类型、后缀名、大小,文件完整,文件类型
  3. 验证文件的上传方式
  4. 对文件进行一定复杂的重命名
  5. 不要暴露文件上传后的路径

相关文章:

  • Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境
  • HTML5 day_01(8.5)
  • 跑路了,去东北国企干软件测试一个月的感触
  • datawhale8月组队学习《pandas数据处理与分析》(中)(变形、连接、缺失数据)
  • recording:34. 在排序数组中查找元素的第一个和最后一个位置
  • 【论文阅读】Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping
  • Java8 特性(二):Optional 相关操作
  • y119.第七章 服务网格与治理-Istio从入门到精通 -- Istio流量治理快速入门(五)
  • 以字符串的形式返回文件名扩展名
  • 机械硬盘数据拷贝
  • 计算机毕业设计java毕设项目之ssm中医药配方小程序
  • 【C++】内存管理 + 初识模板
  • 猿创征文|我的技术成长之路,一名Python学者在CSDN的蜕变
  • java基于ssm的高校人事员工工资管理系统
  • QML初学者教程
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Druid 在有赞的实践
  • express + mock 让前后台并行开发
  • Fundebug计费标准解释:事件数是如何定义的?
  • go语言学习初探(一)
  • js正则,这点儿就够用了
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Sublime Text 2/3 绑定Eclipse快捷键
  • SwizzleMethod 黑魔法
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue.js框架原理浅析
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 第十八天-企业应用架构模式-基本模式
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端知识点整理(待续)
  • 试着探索高并发下的系统架构面貌
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​一些不规范的GTID使用场景
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (python)数据结构---字典
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (一)基于IDEA的JAVA基础12
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)ABI是什么
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .net 4.0发布后不能正常显示图片问题
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Framework .NET Core与 .NET 的区别
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET Remoting学习笔记(三)信道
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @Import注解详解
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [C puzzle book] types
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [EFI]ASUS EX-B365M-V5 Gold G5400 CPU电脑 Hackintosh 黑苹果引导文件