首页 > 其他分享 >文件上传基础学习

文件上传基础学习

时间:2023-09-05 21:35:19浏览次数:32  
标签:文件 upload 学习 图像 攻击者 服务器 上传

文件上传基础学习

一、基础知识

1、上传功能存在漏洞

通常,Web应用程序允许用户上传文件,例如图像、文档或其他类型的文件,以便后续处理或共享。漏洞出现在服务器未正确验证或限制上传文件的类型、大小和位置时。

2、不正确的输入验证

文件上传漏洞通常是由于不正确的输入验证引起的。攻击者可以通过绕过应用程序的输入验证来上传任意文件,而不仅仅是允许的文件类型。

3、恶意文件上传

攻击者可能会上传包含恶意代码的文件,如Web外壳、木马程序或恶意脚本文件(例如PHP或JavaScript),这些文件可以在服务器上执行。

4、执行恶意操作

一旦攻击者成功上传了恶意文件,他们可以执行多种恶意操作,包括:

  • 远程执行代码:如果服务器上的文件上传目录具有执行权限,攻击者可以通过上传的恶意文件执行任意命令,从而控制服务器。
  • 文件覆盖:攻击者可以上传一个恶意文件,其文件名与现有文件相同,从而覆盖或替换现有文件,导致应用程序的不正常行为或数据损坏。
  • 信息泄露:攻击者可以上传包含敏感信息的文件,例如密码文件、配置文件或数据库备份文件,从而泄露敏感数据。
  1. 危害范围

    文件上传漏洞的危害范围取决于服务器的配置和应用程序的权限。如果服务器上的上传目录具有执行权限,攻击者可能能够完全接管服务器。如果应用程序有访问敏感数据的权限,攻击者可能能够窃取敏感信息。

5、防范措施

为了防止文件上传漏洞,开发人员和管理员可以采取以下措施:

  • 文件类型验证:应用程序应该仅允许上传受信任的文件类型,并拒绝所有其他文件类型。
  • 文件大小限制:应用程序应该限制上传文件的大小,以防止上传大型文件导致服务器资源耗尽。
  • 隔离上传文件:上传文件应该存储在服务器上的一个独立目录中,并且不应该允许执行上传的文件。
  • 文件重命名:上传的文件应该根据一定的规则进行重命名,以防止覆盖现有文件。
  • 安全权限配置:服务器上的文件上传目录应该仅允许应用程序和管理员访问,并限制任何不必要的执行权限。
6、文件上传的过程
  • 客户端:选择发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径

  • 服务器:接收的资源程序

二、文件上传的相关知识

1、可执行脚本的文件后缀名,可被网站目录解析,以下是常见后缀名
  • asp
  • asa
  • cdx
  • cer
  • php
  • aspx
  • ashx
  • jsp
  • php3
  • php.a
  • shtml
  • pthml
2、文件上传的常用工具
  • 菜刀:ASP语言编写的 Windows 远控管理软件,年代比较久,鼻祖级别的,曾经风靡一时,现已经逐渐被其他三个所取代

  • 冰蝎:基于 Java 编写,有跨平台特性,流量动态加密(AES128 + 随机密钥)

  • 哥斯拉:基于C#编写,流量加密能过大部分静态查杀和WAF(查杀和WAF也在更新,随时就可能不行了),自带的各种插件功能异常强大

  • 蚁剑:基于Java编写跨平台远控管理工具,模块化开发,代码简单易懂,可扩展性强

三、靶场实操

1、任意文件上传漏洞

任意文件漏洞又名文件直接上传漏洞,如果攻击者能直接长传恶意脚本到网站存放的目录,且这个目录可解析动态脚本语言,那么攻击者就能够直接获取网站权限,甚至进一步权限提升,控制服务器。采用dvwa的upload的靶场

2、绕过前端js检测上传(upload-1)

文件上传时,前端对文件的后缀名进行检验

2.1、在开发者工具中修改代码来上传文件

  • 先选择上传的一句话木马phpinfo.php

    <?php phpinfo();?>
    
  • 在按f12然后将检测的js代码删除,随后点击上传

  • 鼠标放图片上,单机右键,选择复制图像链接

  • 重新打开一个窗口,粘贴图像链接

2.2、如果采用edge浏览器的话,可以关闭js的权限

2.3、利用抓包工具burpsuite来在上传时修改文件的后缀名
  • 新建phpinfo.jpg图片文件,并且在文件中写入一句话木马

    <?php phpinfo(); ?>
    
  • 上传该文件,用bp拦截,修改后缀名,将jpg修改为php

  • 复制图像链接,也就是图像在靶场中的路径

3、绕过Content-Type(内容类型)检测(upload-2)

Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,

  • 查看源码

    if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
                $temp_file = $_FILES['upload_file']['tmp_name'];
                $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] 
    

    对于文件内容类型的检测,只有图片类型的才容许上传

    以下是一些常见的Content-Type

    Content-Type 描述
    text/plain 纯文本,没有特定的格式或编码。
    text/html HTML文档,用于网页内容。
    text/css Cascading Style Sheets(CSS),用于定义网页的样式和布局。
    application/json JSON(JavaScript Object Notation)数据,常用于数据交换。
    application/xml XML(eXtensible Markup Language)数据,通常用于数据交换和配置文件。
    application/pdf Adobe Portable Document Format(PDF)文件,用于可移植的文档表示。
    image/jpeg JPEG格式的图像。
    image/png PNG格式的图像,通常用于网页上的图像。
    image/gif GIF格式的图像,也用于网页上的图像。
    application/javascript JavaScript代码,通常用于网页上的客户端脚本。
    application/octet-stream 二进制数据,没有指定具体的类型。
    multipart/form-data 通常用于HTTP POST请求中的文件上传,用于在表单中上传文件。
    application/x-www-form-urlencoded 通常用于HTTP POST请求中的表单数据,数据被编码成URL格式。
    audio/mpeg MP3音频文件。
    video/mp4 MP4视频文件。
  • 提交phpinfo.php文件,并用bp修改Content-Type

  • 查看上传的phpinfo()

4、php拓展名
  • 查看源码,后台禁止上传以下后缀名的文件

  • 可以上传php5,phtml等的文件,将phpinfo.php修改为phpinfo.html,然后直接上传文件,复制图像链接

  • 在浏览器中打开上传的文件

标签:文件,upload,学习,图像,攻击者,服务器,上传
From: https://www.cnblogs.com/xiaoyi208/p/17680843.html

相关文章

  • 三、(续)vector学习
    1、容器特性1)顺序序列顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。2)动态数组支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。3)能够感知内存分配器的容器使用一......
  • C++学习笔记
    C++:C的编译器叫gcc,C++的编译器叫g++c++最容易发生的问题是内存泄漏问题,例如释放p所指的空间时,应该是free(p);p=NULL;很多人忘记将p归零,这样下次不小心调用了p就会出现内存泄漏问题,如果要把释放内存写成函数,示例如下(两层指针)voidfree_mem(int**pp){if(pp==NULL......
  • STL学习笔记
    迭代器迭代器(iterator)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。在<>一书中提供了23中设计模式的完整描述,其中iterator模式定义如下:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。迭代器案例#include<ios......
  • C++语言学习09
    STL标准模版库STL是StandardTemplateLibrary的缩写,中文名标准模版库,由惠普实验室提供(使用C++模板语言封装的常用的数据结构与算法)STL中有六大组件:算法:以函数模板形式实现的常用算法,例如:swap\max\min\find\sort容器:以类模板的形式实现的常用的数据结构,例如:vector\list\arra......
  • Markdown学习
    Markdown学习标题三级标题四级标题HelloWorld!HelloWorld!HelloWorld!HelloWorld! 引用选择狂神说JAVA,走向人生巅峰 分割线 图片 超链接点击跳转到狂神博客  列表13 ABC 表格名字性别生日张三男1997.1.1......
  • c++/c中关于头文件的探索
    //Fin.h#ifndefFIN_H#defineFIN_Hintadd(inta,intb);#endif//Fin.cpp#include"Fin.h"intadd(inta,intb){returna+b;}//Test1.cpp#include<iostream>#include"Fin.h"//包含Fin.h来调用函数intmain(){......
  • 《Java编程思想第四版》学习笔记23
    在Inning中,可以看到无论构建器还是event()方法都指出自己会“掷”出一个违例,但它们实际上没有那样做。这是合法的,因为它允许我们强迫用户捕获可能在覆盖过的event()版本里添加的任何违例。同样的道理也适用于abstract方法,就象在atBat()里展示的那样。“interfaceStorm”非......
  • linux日志文件的查询方式
    cdlog到指定log日志文件目录ls查看当前文件存在的目录catjujube.log可以查看较小的日志文件vijujube.log查看较大的日志文件(常用)/(查询的字符)可以定位到这个字符的位置N继续向下检索:$回到日志文件的最底层可以用于从底层开始查找使用:$后配合使......
  • 如何使用Java在华为云OBS上传大文件?
    在互联网时代,数据量的快速增长已成为了一种普遍的趋势。随着云计算技术的发展,云存储服务成为了存储和管理大量数据的一种重要手段。华为云对象存储服务(OBS)作为一种高可靠、高可用、高性能的云存储服务,得到了广泛的应用和认可。在使用华为云OBS上传大文件时,我们可以使用Java代码实现......
  • C++学习笔记
    字符串的比较字符串比较一般不用关系运算符比较,“hello”=="hello"底层是存储地址的比较逻辑运算符&&||!&&短路与运算,如果第一个条件为真就判断下一个条件,为假结果为假;如果第一个为假,就直接返回假,不判断第二个条件||短路或运算:碰到条件为真就停止运算,返回真值!非逻辑运算符:条件......