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

        文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,导致用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这些文件可以是木马、病毒、恶意脚本或者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服务器,禁止执行上传目录中的文件。

使用随机数重命名文件

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

前端和后端验证

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值