【网络安全】文件上传基础及过滤方式

        文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,导致用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这些文件可以是木马、病毒、恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做得不够安全,则会导致严重的后果。

一、基础概念 
1.WebShell

首先我们来了解WebShell:

WebShell 是一种通过网页界面与服务器进行交互的脚本工具,它允许用户在没有直接访问服务器的情况下,远程执行命令和操作服务器。WebShell 通常由一段恶意代码组成,这段代码被植入到网站的后端代码中,使得攻击者可以通过特定的URL访问并执行命令。

WebShell 的功能可以非常强大,包括但不限于:

  • 文件管理:上传、下载、删除、修改服务器上的文件。
  • 执行系统命令:执行服务器上的任意命令。
  • 数据库管理:访问、修改数据库中的数据。
  • 会话管理:管理用户的会话信息。

简单来说,WebShell就是以php,jsp等网页文件形式存在的一种命令执行环境,我们也可以称其为一种网页木马后门。攻击者可以通过这些网页后门文件获得网站服务器操作权限,控制网站服务器上传下载文件、查看数据库、执行命令等。

2.木马

我们再来了解木马的概念:

木马全称“特洛伊木马”,指寄宿在计算机里的一种非授权的远程控制程序,它可以在计算机管理员未发觉的情况下,开放系统权限,泄露用户信息给攻击者,是黑客常用的工具之一。

3.后门

一台计算机上有65535个端口,每个端口是计算机与外界连接所开启的“门”,每个门都有计算机提供的一些服务,攻击者利用这些服务,获取服务器的权限,给自己进入计算机留下一个后门

4.WebShell的分类

1)根据文件大小分类:

  • 一句话木马:代码简短,通常只有一行代码,使用方便
  • 小马:只包含文件上传功能、体积小(上传小马的作用通常是为了更加隐蔽的进行后续大马上传的工作)
  • 大马:体积大,包含多种功能,代码通常会进行加密隐藏

2)根据脚本类型分类

分为jsp、asp、aspx、php等,PHP较为常用

5.WebShell攻击流程
  1. 利用web漏洞获取web权限
  2. 上传小马
  3. 上传大马
  4. 远程利用webshell执行命令
6.常见的webshell
<?php @eval($_POST['cmd']);?>
<%eval request("cmd")%>

上面两个分别为PHP和ASP的一句话木马:

<?php:这是PHP代码的开始标志。

@:这个符号是PHP中的抑制错误控制符。当它放在任何表达式的前面时,会抑制因该表达式产生的错误信息。在这个例子中,它被用来抑制eval函数可能产生的错误信息。

eval($_POST['cmd']);:这是一个PHP函数调用,其中:

eval:是一个PHP函数,它可以计算并执行字符串作为PHP代码。

$_POST['cmd']:这部分是从HTTP POST请求中获取名为cmd的数据。攻击者可以通过向这个WebShell发送POST请求,并在请求中包含cmd参数来执行任意代码。

?>:这是PHP代码的结束标志。

当这段代码被上传到服务器,并且服务器配置允许执行PHP代码时,攻击者可以通过发送一个包含cmd参数的POST请求来执行任意PHP代码

<%:这是 ASP 脚本块的开始标记。

eval:这是 ASP 中的一个内置函数,用于执行 VBScript 代码。在这里,它被用来执行从客户端发送的命令。

request("cmd"):这是 ASP 中的 Request 对象的一个方法调用,用于获取从客户端发送的名为 "cmd" 的查询字符串参数或表单数据。如果客户端发送了一个名为 "cmd" 的参数,其值将被传递给 eval 函数。

%>:这是 ASP 脚本块的结束标记。

当这段代码被放置在服务器上的一个 ASP 文件中时,攻击者可以通过发送一个包含 "cmd" 参数的 HTTP 请求来执行任意命令

7.扩展——PHP中的一些易混点

在PHP中,$_GET$_POST$_REQUEST 是用于获取客户端发送的数据的超全局数组。它们之间的主要区别在于数据提交的方式和使用场景:

  1. $_GET:

    • 用于从查询字符串(query string)获取URL参数,即通过HTTP GET请求传递的数据。
    • 数据通过URL传递,因此在浏览器地址栏可见。
    • 通常用于传递非敏感数据,如搜索查询或页面导航参数。
  2. $_POST:

    • 用于从HTTP POST请求中获取数据,数据在请求体中,不显示在URL中。
    • 通常用于提交表单数据,尤其是当数据量较大或包含敏感信息时。
    • 相比GET请求,POST请求更安全,因为数据不会显示在浏览器地址栏或服务器日志中。
  3. $_REQUEST:

    • 是一个复合数组,它包含了$_GET$_POST 和 $_COOKIE 的数据。
    • 当你想要同时访问GET和POST请求中的数据时可以使用$_REQUEST
    • 由于$_REQUEST包含了所有类型的请求数据,使用时需要小心,以避免潜在的安全风险,比如CSRF(跨站请求伪造)攻击。

安全注意事项:

  • GET请求中的数据由于显示在URL中,可能会被日志文件记录,因此不适合传递敏感信息。
  • POST请求的数据不会显示在URL中,适合传输敏感信息,如密码或个人数据。
  • $_REQUEST虽然方便,但因为它会从多个来源获取数据,如果没有适当的验证和清理,可能会增加安全风险。

二、WebShell基本原理
  1. 可执行脚本:HTTP数据包($_GET,$_POST,$_COOKIES)
  2. 数据传递
  3. 执行传递的数据
  • 直接执行(eval、system)
  • 文件包含执行(include)
  • 动态函数执行
  • 回调函数

三、文件上传基础
  1. 表单上传:通常使用HTML表单(带有enctype="multipart/form-data"属性)来上传文件。
  2. 文件域<input type="file">允许用户选择要上传的文件。
  3. 后端接收:服务器端脚本(如PHP的$_FILES超全局数组)接收上传的文件。
  4. 文件存储:服务器端脚本处理文件,包括保存到服务器的特定目录。
  5. 文件类型:根据文件的MIME类型或扩展名来识别文件类型。
  6. 文件大小:限制上传文件的大小,防止服务器资源耗尽。
  7. 文件命名:为上传的文件生成新的文件名,避免文件名冲突和覆盖。

四、过滤方式

文件类型过滤

使用白名单方法,只允许特定类型的文件上传(如图片、文档等)。

检查文件扩展名是否在允许的列表中。

MIME类型检查

检查文件的MIME类型是否与白名单中的MIME类型匹配。

文件大小限制

限制上传文件的大小不超过特定的字节数。

文件内容检查

对上传的文件进行内容扫描,检查是否包含恶意代码或宏。

使用文件哈希校验

计算并比对文件的哈希值,确保文件未被篡改。

限制上传路径

确保文件只能被上传到特定的目录,并且这些目录不允许执行脚本。

文件扩展名验证

检查文件扩展名是否合法,并且与文件的实际类型相符。

使用防病毒软件扫描

使用防病毒软件对上传的文件进行扫描,检测潜在的恶意软件。

实施访问控制

限制特定用户或角色的上传权限。

服务器配置

配置Web服务器,禁止执行上传目录中的文件。

使用随机数重命名文件

避免使用原始文件名,使用随机数或唯一标识符重命名文件。

前端和后端验证

前端验证提供用户体验,后端验证确保安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenSSL学习笔记及在项目中的使用

OpenSSL官方命令手册&#xff1a;OpenSSL commands - OpenSSL Documentation 参考教程&#xff1a; 操作&#xff1a;OpenSSL的基本使用教程(一&#xff09;_openssl.exe使用教程-CSDN博客 操作&#xff1a;Linux和Shell回炉复习系列文章总目录 - 骏马金龙 - 博客园 (cnblog…

SAP主生产计划流程

流程概述 生产计划,在系统中体现为计划独立需求该数据元素,是SAP系统组织生产计划/运行MPS主生产计划(是平衡供需的支点)或MRP物料需求计划的源头数据,本流程描述了生产单位在ERP系统中生产计划管理流程。企业的主生产计划员通常以正式销售订单或备货订单为主要依据编制最…

【MR】现代机器人学-时间最优时间缩放

MR章节目录 第2章 配置空间 第3章 刚体运动 第4章 正向运动学 第5章 速度运动学与静力学 第6章 逆向运动学 第7章 闭链运动学 第8章 开链动力学 第9章 轨迹生成 9.1 定义 9.2 点到点轨迹 9.3 多项式通过点轨迹 9.4 时间最优时间缩放 第10章 运动规划 第11章 机器人控制 第12章 …

20 Python常用内置函数——eval()

内置函数 eval() 函数用来计算字符串的值&#xff0c;在有些场合也可以用来实现类型转换的功能。除此之外&#xff0c;eval() 也可以对字节串进行求值&#xff0c;还可以执行内置函数 compile() 编译生成的代码对象。 print(eval(b35)) print([eval(8), type(eval(8))]) # 把…

Keras入门:一维线性回归问题

目录 一、一维变量线性回归 1. 数据生成 2. 建立训练模型 3. 作图 4. 完整代码 一、一维变量线性回归 1. 数据生成 import keras import numpy as np import matplotlib.pyplot as plt #matplotlib inline xnp.linspace(0, 100, 30) #0~100之间&#xff0c;生成30个数 y…

.NET Core 中的字符串压缩方法

字符串压缩的概念 字符串压缩通常指的是通过算法减少字符串表示所需的数据量&#xff0c;同时保持字符串的原始信息或能够无损地恢复原始字符串。这种压缩可以是针对文本数据的特定算法&#xff0c;也可以是更通用的数据压缩算法。 .NET Core 中的字符串压缩方法 使用数据压…

linux 回到根目录

linux下如何回到根目录&#xff1f; cd / 以根目录开头 (切换到系统根目录) cd ~ 回到自己的home目录(切换到用户主目录) /home/用户名 cd .. 返回上级目录 cd - 回看功能 pwd 查看当前目录

构建现代数据湖

现代数据湖是一半数据仓库和一半数据湖&#xff0c;对所有事情都使用对象存储。使用对象存储来构建数据仓库是通过 Open Table Formats OTF&#xff09; 实现的&#xff0c;例如 Apache Iceberg、Apache Hudi 和 Delta Lake&#xff0c;这些规范一旦实现&#xff0c;就可以无缝…

PHP基础语法-Part1

脚本格式 PHP脚本以<?php开头&#xff0c;以?>结尾&#xff1b; PHP语句以分号结尾&#xff08;;&#xff09; PHP是解释型语言&#xff1b; 输入和输出 获取用户的输入&#xff1a; $input readline("input:"); echo $input; echo "input:";…

vllm部署记录

1. pip安装 pip install vllm 下载模型在huggingface.co 注意在modelscope上的这个opt-125m好像不行了,我git不下来报错 启动服务 vllm serve opt-125m --model opt-125m --port 8888 第一个opt-125m是名字,可以在vllm支持的模型中查到,第二个是模型存放文件夹及其路径…

Github 2024-07-26开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目2TypeScript项目2C++项目2HTML项目1Python项目1C#项目1Lua项目1JavaScript项目1Vue项目1C项目1免费编程学习平台:freeCodeCamp.org 创…

为什么很多人在一定年龄后的肥胖无法避免

人体在营养均衡状态的时候&#xff0c;是不容易长胖的&#xff0c;且身体也远比一般人更健康些&#xff0c;但想要一直维持身体的这种健康均衡的状态&#xff0c;不仅生活上要很有规律&#xff0c;饮食上也要营养均衡才行。但以如今社会的快节奏生活而言&#xff0c;基本没有人…

计算机毕业设计-程序论文-基于 Java 的高校教资报名系统的设计与实现

本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写&#xff0c;禁止任何人抄袭以及各类盈利性传播&#xff0c; 相关的代码部署论文ppt代码讲解答辩指导文件都有可私要 项目源码&#xff0c;请关注❥点赞收藏并私信博主&#x…

软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点

场景 软考-软件设计师-计算机网络与信息安全模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 OSI/RM七层模型 注意各层的主要功能,特别是表示层负责数据的加密、压…

Java修炼(线程池) 2024.7.26 16:38

目录 引入什么是线程池&#xff1f;工作原理线程池的类型线程池的优势使用线程池的基本步骤示例代码真实应用场景 引入 线程池是并发编程中的一个重要概念&#xff0c;广泛应用于 Java 和其他编程语言中。下面我将全面地复习线程池的概念、工作原理、类型、优势以及在 Java 中…

AI 正在取代工作岗位、ChatBot 进入厌倦期、向量数据库崛起,人工智能现状报告有这些重要发现!...

作者 | Echo Tang&GPT 出品丨AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 百度的无人驾驶“萝卜快跑”已经在武汉大面积推广&#xff0c;在部分城市进行小量的试运行&#xff0c;以低廉的价格直接卷翻滴滴、出租车司机&#xff0c;让人们热议“五年、十…

git报错403,git项目拉取不下来

解决办法&#xff0c;清除以下配置 https://blog.csdn.net/weixin_55047679/article/details/131763419 清除后再次拉取代码时&#xff0c;重新输入云效平台https用户账号及密码

Linux 使用技巧及示例

1. 快速切换目录 技巧: 使用别名来快速切换到常用的目录。示例:# 添加到 ~/.bashrc 文件 echo alias myproject"cd /home/user/Projects/my_project" >> ~/.bashrc source ~/.bashrc # 重新加载配置文件使其生效2. 管道和重定向 技巧: 使用管道 (|) 和重定向…

7月23日JavaSE学习笔记

异常&#xff1a; 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类&#xff08;可抛出的&#xff09; Throwable继承树 Error&#xff1a;错误/事故&#xff0c;Java程序无法处理&#xff0c;如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…

Spring 微服务提示:使用环境变量抽象数据库主机名

安全地管理任何微服务的数据库连接字符串都至关重要;通常&#xff0c;我们使用环境变量来保护用户名和密码&#xff0c;并且从不考虑屏蔽或隐藏数据库主机名。在读取器和写入器数据库实例中&#xff0c;某些组织会强制要求在应用程序启动期间不要泄露主机名并通过环境变量传递主…