WEB安全

利用/绕过PHP escapeshellarg / escapeshellcmd函数

介绍

TL; DR:如何利用/绕过/使用PHP escapeshellarg / escapeshellcmd函数。

我创建了这个简单的备忘单,因为GitList 0.6 Unauthenticated RCE,因此您可以轻松理解它是如何工作的。

注意:这是一个简单的清单,其中包含易于理解的示例,因此它不包含有关escapeshell *函数的所有/全面的详细信息。

该文档也可在GitHub上获得

目录

  • 介绍
  • 什么escapeshellargescapeshellcmd真的吗?
  • 已知绕过/利用
  • 参数注射
    • TAKE
    • 查找
    • 带escapeshellarg的Escapeshellcmd
    • WGET
    • 命令使用.bat执行
    • 发送邮件
    • 卷曲
    • MYSQL
    • UNZIP
    • 去掉非ASCII字符
  • 历史利用
  • GitList RCE漏洞利用

什么escapeshellarg和escapeshellcmd真的吗?

功能 描述
escapeshellcmd 确保用户只执行一个命令
用户可以指定不限数量的参数
用户不能执行不同的命令
escapeshellarg 确保用户只传递一个参数给命令
用户不能指定更多的参数一个
用户不能执行不同的命令

例。Let't使用用于打印的组成员的每个用户名。

但攻击者可以使用;||内部$username

在Linux上这意味着第二个命令将在第一个命令后执行:

为了防止这一点,我们正在使用escapeshellcmd

现在攻击者无法运行第二个命令。

为什么?因为PHP内部运行这个命令:

myuser\;id 被视为单个字符串。

但是在这种方法中,攻击者可以指定更多参数groups

例如,他可以一次检查多个用户:

假设我们希望允许每个脚本执行仅检查一个用户:

为什么?因为现在$username被视为单个参数:

已知绕过/利用

当你想利用这些功能时,你有两个选择:

参数注射

从上一章可以看到,使用escapeshellcmd / escapeshellarg时不可能执行第二个命令。

但是我们仍然可以将参数传递给第一个命令。

这意味着我们也可以将新选项传递给命令。

利用漏洞的能力取决于目标可执行文件。

您可以在下面找到一些已知可执行文件的列表,其中包含一些可能被滥用的特定选项。

TAKE

压缩some_file/tmp/sth

创建空/tmp/exploit文件。

查找

查找some_file里面/tmp的目录。

打印/etc/passwd内容。

带escapeshellarg的Escapeshellcmd

在这个配置中,我们可以传递第二个参数给函数。

/tmpdir中列出文件并忽略sth

/tmpdir中列出文件并忽略sth。使用长列表格式。

WGET

下载example.php

.php文件保存到特定目录:

命令使用.bat执行

打印里面的文件列表somedir

同时执行whoami命令。

请参阅:如何将参数传递给Windows上的新进程

发送邮件

发送mail.txt。将信封发件人地址设置为from@sth.com

打印/etc/passwd内容。

卷曲

下载http://example.com内容。

发送/etc/passwd内容到http://example.com

您可以使用以下方式获取文件

MYSQL

执行sql语句:

运行id命令。

UNZIP

将所有*.tmp文件解压缩archive.zip/tmp目录中。

将所有*.tmp文件解压缩archive.zip/var/www/html目录中。

如果未设置LANG环境变量,则去除非ASCII字符

历史的利用

1. Windows上的PHP <= 4.3.6 - CVE-2004-0542

运行dir命令。

2. PHP 4 <= 4.4.8和PHP 5 <= 5.2.5 - CVE-2008-2051

Shell需要使用GBK,EUC-KR,SJIS等可变宽度字符集的语言环境。

要么

3. 在5.5.26之前的PHP <5.4.42,5.5.x,在Windows的5.6.10之前的5.6.x - CVE-2015-4642

传递额外的第三个参数(--param3)

4. 7.0.2之前的PHP 7.x - CVE-2016-1904

如果将1024mb字符串传递给escapeshellarg或,则基于堆的缓冲区溢出escapeshellcmd

5. 在Windows上,PHP 5.4.x <5.4.43 / 5.5.x <5.5.27 / 5.6.x <5.6.11

启用EnableDelayedExpansion后,展开一些环境变量。

然后!STH!类似于%STH%

escapeshellarg不消毒!字符。

EnableDelayedExpansion可以在HKLM或HKCU下的注册表中设置:

例:

6. PHP <5.6.18

中定义的功能ext/standard/exec.c,其与串(工作escapeshellcmdeschapeshellargshell_exec),所有忽略PHP字符串的长度,并用NULL终止工作代替。

GitList RCE漏洞利用

文件:src / Git / Repository.php

简化:

当我们检查git grep文档时

所以基本上--open-files-in-pager就像是-exec在工作find.

当我们把它放到控制台时:

最终的利用 - 下载

参考:https://security.szurek.pl/exploit-bypass-php-escapeshellarg-escapeshellcmd.html

本文由安全周翻译。转载请注明出处

(0)

热评文章

发表评论