文件上传漏洞攻击

文件上传漏洞

上传文件时,如果服务端没有对客户端上传的文件进行严格的验证和过滤,就很容易可以造成可以上传任意文件的情况,包括上传脚本文件(asp、aspx、php、jsp等)。

危害:非法用户可以通过上传恶意脚本文件来控制整个网站,或者服务器。这种恶意的脚本文件,又称为WebShell。从名称就可以看出来这是一种可以通过Web网页来控制Shell的脚本文件。

JS检测绕过攻击

当系统上传文件时,客户端浏览器使用JavaScript对上传的文件进行检测,文件没有到服务端,所以我们可以通过以下两种方式绕过JS检测:

  • 使用浏览器插件,删除检测文件后缀的JS代码,然后上传WebShell。
  • 先将需要上传的文件的后缀改为允许上传的,上传该文件,通过抓包拦截,再把后缀名改回可执行文件的后缀即可(即:直接通过接口上传文件)。

文件后缀绕过攻击

当系统执行文件上传操作时,服务端代码往往会设置一些后缀限制,即黑名单模式,以防止特定类型的文件(如.php文件)被上传至服务器。然而,攻击者可能采用以下几种策略来绕过这些后缀检测机制:

  • 利用后缀大小写不敏感的特性,尝试上传如hacker.PhP这样的文件(前提是服务端未将上传文件的后缀统一转换为小写)。
  • 通过后缀重写的方式,例如将文件命名为hacker.phphpp。如果服务端代码将黑名单中的后缀替换为空,则文件名会变成hacker.php,从而绕过检测(前提是服务端确实采用了这种替换逻辑)。
  • 利用服务器可能存在的其他可解析后缀,例如.php5.phtml。这些后缀在某些服务器配置中同样会被解析为PHP文件。攻击者可以通过查询服务器的配置文件(如httpd.conf)来了解哪些后缀是可解析的,并据此构造绕过检测的文件名。

文件Content-Type绕过攻击

当系统上传文件时,服务端代码对Content-Type进行了校验,因为Content-Type的值时通过客户端传递的,是可以任意修改的。所以我们可以通过如下方法进行Content-Type绕过:

  • 上传文件,抓包拦截,将Content-Type修改为image/jpeg(jpeg图片的Content-Type)

​ 在PHP中还存在一种相似的文件上传漏洞,PHP函数getimagesize()可以获取图片的宽、高等信息,如果上传的不是图片文件,那么getimagesize()就获取不到信息,则不允许上传。

​ 但是,我们可以将一个图片和一个WebShell合并为一个文件,这样getimagesize()就可以获取到图片信息。

# /b是二进制形式打开, /a是ascii方式打开
copy image.jpg/b + webshell.php webshell1.php

文件截断绕过攻击

%00截断是操作系统层面存在的一种安全漏洞,其根源在于C语言和汇编语言在定义字符串时,采用空字符(\0,即0x00)作为字符串的终止符。操作系统在解析字符串时,一旦遇到空字符,即会将其视为字符串的结束标识。

因此,攻击者有可能通过篡改数据包,在其中插入空字符,达到字符串截断的效果。这种截断技术常被用于绕过白名单限制,从而实施恶意行为。

例如,在上传时,拦截请求,将文件上传的文件名参数修改为:hacker.php%00.jpg

竞争条件攻击

一些网站虽然允许用户上传任意文件,但会对上传的文件内容进行安全检测,以识别并删除包含WebShell脚本的文件。然而,这种机制存在一个潜在的安全隐患:在文件上传成功与文件被删除之间,存在一个短暂的时间窗口。攻击者可以利用这一时间差来执行恶意操作。

以下是一个示例:攻击者构造了一个名为hacker.php的文件,其内容如下:

<?php fputs(fopen('./webshell.php', 'w'), '<?php @eval($_POST[a]) ?>'); ?>

当这个hacker.php文件被上传到服务器后,攻击者会立即访问该文件。由于服务器在检测并删除包含WebShell脚本的文件之前存在时间差,hacker.php中的代码会得以执行,从而在服务器上创建一个新的webshell.php文件。这个文件实际上是一个WebShell,允许攻击者通过HTTP请求执行任意PHP代码。因此,攻击者成功利用了这个时间差,在文件被删除之前完成了WebShell的上传。

posted @ 2024-04-26 08:32  测试小罡  阅读(4171)  评论(0编辑  收藏  举报