一、文件上传漏洞介绍

文件上传是由于程序员未对上传的文件做严格的校验和过滤,然后导致用户可以越过其本身的权限,来向服务器上传一个可以执行的动态脚本文件

常见的文件上传由:上传图片,上传附件,上传头像等

如果说过滤不严格,恶意用户利用文件上传漏洞,上传有害的可以执行脚本文件到服务器中(上传webshell)可以获取服务器的权限,或进一步危害服务器

二、文件上传漏洞的危害

通过一个非法上传的恶意文件,例如上传一个webshell,上传 webshell 后门 很方便地查看服务器信息,查看目录,执行系统命令

三、文件上传漏洞的原理

核心原因在于服务器对用户上传的文件处理不当,未能进行充分、有效的安全验证和限制

四、webshell写法

我们通过文件上传漏洞,上传一个webshell,来获取服务器的信息,查看目录,执行命令等操作,那webshell如何去写?

常见的就是一句话木马,例如: <script language="php">Eval($_POST['a']);</script>

我们来分析一下这个木马:它是利用早期PHP支持的特殊标签格式进行伪装,其核心是利用eval()函数执行通过POST请求传入的任意代码,从而实现远程控制服务器的目的

其中eval() 函数: 这是PHP中一个极其强大但也极其危险的函数。它的作用是将传入的字符串作为PHP代码来执行。攻击者通过控制这个字符串的内容,就可以在服务器上执行任意PHP代码

$_POST['a'] 超全局变量: 这是PHP用于接收HTTP POST请求中名为'a'的表单数据或参数的变量。这意味着攻击者可以通过向包含这段木马的网页发送一个HTTP POST请求,并在请求体中携带一个名为a的参数(例如a=echo 'hello world';a=system('whoami');),来控制eval()函数实际执行的代码内容

一句话木马的核心原理:利用服务器端语言执行动态传入的代码

操作步骤:

我们通过burp抓包后,通过修改文件的后缀名,例如.php,.phtml等,将一句话木马插入数据包中,点击sent,然后渲染一下,发现上传成功,在本地浏览器查看一下这个文件,发现文件是自己插入的文字或者php界面,那就是上传成功了

然后打开webshell管理工具,打开蚁剑,添加这个文件地址,例如ip/upload/1.php

然后我们尝试连接

如果连接成功,那么我们就可以通过蚁剑来获取对方文件目录,在上面执行命令操作

然而我们实际操作练习当中,会有不同的情况,那么webshell就会变得多样,有着不同的写法

第一种情况:后缀名限制与绕过

可以使用大小写绕过,例如Php

尝试特殊后缀:.phtml, .phar, .php3, .php4, .php5 等历史遗留后缀,如果服务器配置允许解析它们为PHP。

或者尝试双写和重复后缀:尝试 file.php.jpgfile.php.php,如果服务器仅检查最后一个后缀或存在逻辑漏洞

尝试其他脚本语言:如果服务器支持ASP、JSP等,编写相应语言的Webshell

第二种情况:内容类型 (MIME Type) 检查

服务器检查上传头部的文件类型:Content-Type或者 image/jpeg

Webshell 编写方法:伪造MIME类型在Burp Suite等工具中拦截上传请求,将 Content-Type 修改为允许的类型(如 image/jpeg),即使文件内容实际是PHP代码

编写图片马:将Webshell代码嵌入到真实的图片文件中

使用文件拼接方式,生成一个新文件,文件头部是图片数据,尾部是PHP代码。如果服务器只检查文件头部的魔数(Magic Bytes),可能被当作图片接受,但当访问该文件时,尾部的PHP代码会被执行

第三种情况:文件内容检测

服务器不仅检查后缀和MIME,还会扫描文件内容是否包含危险关键词(如 <?php, eval, system

1、我们可以进行代码混淆:使用 base64_decode 包裹执行代码

2、十六进制编码:直接拼接十六进制字符串

3、字符串拼接/反转/异或:将敏感函数名或关键词拆分成多个部分,在运行时拼接或运算还原

4、利用动态函数调用:如 $_GET['f']($_GET['c']);,通过参数传递函数名和命令

第四种情况:文件重命名

服务器在上传后自动重命名文件(如使用时间戳+随机数),用户无法控制最终文件名

条件竞争:如果上传后文件会短暂保留原始名,或者重命名操作不是原子的,可以编写脚本快速、连续地访问上传目录下的潜在文件名(如 shell.php, upload.php),在文件被重命名或删除前执行它

路径/文件名注入:尝试在文件名中包含目录遍历字符(如 ../)或特殊字符,试图控制文件保存的部分路径或影响重命名逻辑(较少成功)

利用文件包含:如果存在另一个文件包含漏洞(如LFI),并且知道上传文件的存储路径模式,可以尝试结合文件包含来执行被重命名的Webshell文件

第五种情况:文件大小限制

服务器限制了上传文件的最大尺寸

编写极其精简的Webshell,最经典的是一句话木马:<?php eval($_POST['cmd']);?>

或更短的:<?=`$_GET[1]`?>   通过 ?1=whoami 执行命令

我们需要注意环境适应性:方法是否成功高度依赖于目标服务器配置(PHP版本、模块、中间件、权限)

五、文件上传的防御思路

  • 防御的核心就是在服务器端实施严格、多层、互补的安全检查
  • 1、使用白名单限制允许上传的文件扩展名。 (比黑名单更可靠)
  • 2、在服务器端检查文件真实的类型(Magic Number / 文件头)。
  • 3、对文件内容进行检测或过滤(如检查图片是否包含恶意代码)。
  • 4、对上传的文件进行重命名(使用随机字符串)。
  • 5、对图片等文件进行二次渲染(最彻底但成本较高)。
  • 6、限制上传文件的大小
  • 7、及时更新服务器软件,修复已知的解析漏洞

六、修复方案

在网站中需要存在上传模块,需要做好权限认证,不能让匿名用户可访问。

文件上传目录设置为禁止脚本文件执行。这样设置即使被上传后门的动态脚本也不能解析,导致攻击者放弃这个攻击途径

设置上传白名单,白名单只允许图片上传,如除了jpg, png, gif 其他文件均不允许上传

上传的后缀名,一定要设置成图片格式如 jpg png gif

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐