文件上传功能可被攻击者用作一系列高严重性攻击的强大载体。本文最后将会展示如何绕过常见的防御机制来上传web shell,使你能够完全控制一个易受攻击的web服务器。
1. 简介
文件上传漏洞是指web服务器允许用户在没有充分验证文件名、类型、内容或大小等信息的情况下将文件上传到其文件系统。如果不能正确执行这些限制,可能意味着即使是基本的图像上传功能也可以用来上传任意和潜在危险的文件。这甚至可以包括启用远程代码执行的服务器端脚本文件。
主要危害有:
- 文件覆盖
- WebShell后门
- DDOS攻击:可通过上传zip炸弹或并发持续上传文件让目标服务器宕机
- 敏感信息泄露
2. 产生根因
- 多数网站很少对用户上传的文件进行限制。
- 开发人员实现他们认为稳健的验证,这些验证要么存在固有缺陷,要么很容易被绕过。
举例:危险文件类型的黑名单不足防止用户上传恶意脚本,常用的方法是将php等潜在危险的文件扩展名列入黑名单。将其列入黑名单的做法本身就有缺陷,因为很难明确地阻止所有可能用于执行代码的文件扩展。这种黑名单有时可以通过使用鲜为人知的、仍然可以执行的替代文件扩展名(如.php5、.shtml等)来绕过。
2.1. 背景知识:Web服务器如何处理对静态文件的请求?
服务器解析请求中的路径以标识文件扩展名。然后,它使用它来确定所请求的文件的类型,通常是通过将其与扩展名和MIME类型之间的预配置映射列表进行比较。接下来会发生什么取决于文件类型和服务器的配置。
-
如果此文件类型是不可执行的,例如图像或静态HTML页面,则服务器可能只是在HTTP响应中将文件的内容发送给客户端。
-
如果文件类型是可执行的,例如PHP文件,并且服务器被配置为执行这种类型的文件,则在运行脚本之前,它将根据HTTP请求中的头和参数分配变量。所得到的输出然后可以在HTTP响应中被发送到客户端。
-
如果文件类型是可执行的,但服务器未配置为执行此类型的文件,则通常会以错误响应。但是,在某些情况下,文件的内容仍然可以作为纯文本提供给客户端。这种错误配置偶尔会被用来泄露源代码和其他敏感信息。
3. 防御方法
允许用户上传文件是很常见的功能,只要你采取正确的预防措施,就可以消减险。一般来说,保护网站免受这些漏洞攻击的最有效方法是实施以下所有做法:
- 文件后缀名白名单校验:根据允许的扩展名白名单而不是禁止的扩展名黑名单检查文件扩展名。猜测你可能想要允许哪些扩展比猜测攻击者可能试图上传哪些扩展要容易得多。
- 确保文件名不包含任何可能被解释为目录或遍历序列(
../
)的子字符串 - 重命名上传的文件以避免可能导致覆盖现有文件的冲突
- 在完全验证文件之前,不要将文件上载到服务器的永久文件系统
- 文件名校验过滤,避免文件路径遍历
- 文件路径校验前先进行标准化处理
- 文件上传权限控制要合理
- 文件存储前的大小校验
- 文件上传后及时销毁
- 文件存储权限最小化、存储目录划分合理
4. 利用不受限制的文件上传来部署web shell
Web Shell是一种恶意脚本,其目的是获得服务器的执行操作权限。Web Shell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。Web Shell常常以asp、php、jsp或cgi等网页文件形式存在,也可以将其称做为一种网页后门。黑客通常利用常见的漏洞,如SQL注入、远程文件包含 (RFI)、FTP,甚至使用社会工程学等手段来获取Web Shell。
从安全角度来看,最糟糕的情况是网站允许你上传服务器端脚本,如PHP、Java或Python文件,并配置为将其作为代码执行。这使得在服务器上创建自己的web shell变得微不足道。
如果你能够成功上传一个web shell,你就可以有效地完全控制服务器。这意味着你可以读取和写入任意文件,泄露敏感数据,甚至可以使用服务器来转移针对内部基础设施和网络外其他服务器的攻击。例如,以下PHP一行代码可用于从服务器的文件系统读取任意文件:
<?php echo file_get_contents('/path/to/target/file'); ?>
一旦上传,发送对此恶意文件的请求将在响应中返回目标文件的内容。
一个更通用的web shell可能看起来像这样:
<?php echo system($_GET['command']); ?>
此脚本使你通过查询参数传递任意系统命令,如下所示:
GET /example/exploit.php?command=id HTTP/1.1
5. 参考
[1] https://portswigger.net/web-security/file-upload
推荐阅读:
「 典型安全漏洞系列 」07.OS命令注入详解
「 典型安全漏洞系列 」06.路径遍历(Path Traversal)详解
「 典型安全漏洞系列 」05.XML外部实体注入XXE详解
「 典型安全漏洞系列 」04.服务器端请求伪造SSRF详解
「 典型安全漏洞系列 」03.跨站请求伪造CSRF详解
「 典型安全漏洞系列 」02.SQL注入详解
「 典型安全漏洞系列 」01.跨站脚本攻击XSS详解