被黑了?附加文件名如何允许访问网站数据...参见示例

被黑了?附加文件名如何允许访问网站数据...参见示例

访问以下所有内容都会将您带到登录屏幕:

http://mysite.com/admin/configuration.php
http://mysite.com/admin/login.php

但是如果你访问(请注意,url 字符串的最后两部分都是 .php):

http://mysite.com/admin/configuration.php/login.php

您可以看到配置屏幕及其所有数据!

此外,如果你附加一些 GET 变量,你甚至可以获得可编辑的字段:

http://mysite.com/admin/configuration.php/login.php?cID=1&action=edit

这里发生了什么?

我应该指出,这是在网站上使用一款名为 oscommerce 的极其糟糕的购物车。代码处理起来简直是一场噩梦,但目前我只能忍受它了。


编辑

根据以下 vstm 的出色且准确的评论进行修复:

这会刚好在检查之前进行$current_page != FILENAME_LOGIN(/admin/includes/application_top.php 中 141-143 行左右)。请注意,这只是一个紧急补丁,因为真正的解决方案是永远不要使用 oscommerce,因为它就像妓女的腰带一样不安全。

//$current_page = basename($PHP_SELF); //this is the default
$current_page = basename($_SERVER['SCRIPT_NAME']); //change that default to this

if ( ($current_page == FILENAME_LOGIN) && !tep_session_is_registered('redirect_origin') ) {
      $current_page = FILENAME_DEFAULT;
      $HTTP_GET_VARS = array();
    }

如果有人尝试这样做,请不要忘记会话redirect_origin变量可能已经设置,因此这似乎不起作用。只需取消设置并重试。

答案1

在包含所有脚本的 includes/application_top 中,/admin你会发现这个小宝石(我已将一些不感兴趣的部分删除):

// redirect to login page if administrator is not yet logged in
if (!tep_session_is_registered('admin')) {
    $redirect = false;

    $current_page = basename($PHP_SELF);

    if ($current_page != FILENAME_LOGIN) {
        // session stuf blabla
        $redirect = true;
    }

    if ($redirect == true) {
        tep_redirect(tep_href_link(FILENAME_LOGIN));
    }

    unset($redirect);
}

此代码仅在您未登录时执行。它基本上会检查是否basename$PHP_SELFlogin.php。如果是 login.php,则继续呈现页面,否则您将被重定向。

如果您提出此请求:

http://mysite.com/admin/configuration.php/login.php

然后 PHP_SELF 将会

/admin/configuration.php/login.php

当然basename($PHP_SELF)login.php这样,渲染继续,不执行重定向。但当然不会login.php渲染,而是configuration.php。URL“/login.php”的其余部分将被“忽略”,并仅提供给 $_SERVER['PATH_INFO'] 中的 PHP。

编辑:我想补充一点,这个“漏洞”只会影响 oscommerce 或任何其他使用类似解决方案来“保护”管理登录的软件(我认为受此影响的软件并不多)。它并不是影响所有 PHP 软件的漏洞。

答案2

这只是configuration.php文件中的一个漏洞 - 将 php 文件作为路径一部分的“假目录”是一个有意为之的功能,而且你会经常看到 - 斜线后的内容如何处理取决于路径中的 php 文件。(mediawiki 就是一个很好的例子)

答案3

我曾在 Windows 机器上尝试过此操作,使用指示的双重 URL - 它说未找到页面。但服务器设置为不允许目录遍历,而 OSCommerce 设置为检查用户代理并阻止蜘蛛会话以及使用会话目录 - 可能这就是它安全且不允许附加 URL 的原因。此外,服务器将 /login.php 视为第一个文件名的一部分,不允许目录遍历,也不允许在文件名中使用点 - 因此它完全拒绝 URL。因此是安全的,因为无论目录软件尝试做什么,服务器都是安全的。

相关内容