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

Lot*_*her 5 security hacking

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

http://mysite.com/admin/configuration.php
http://mysite.com/admin/login.php
Run Code Online (Sandbox Code Playgroud)

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

http://mysite.com/admin/configuration.php/login.php
Run Code Online (Sandbox Code Playgroud)

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

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

http://mysite.com/admin/configuration.php/login.php?cID=1&action=edit
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

我应该注意,这是在网站上使用称为 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

vst*_*stm 16

在包含在所有脚本中的 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);
}
Run Code Online (Sandbox Code Playgroud)

当你还没有登录该代码被执行只。它通常做的是检查,如果basename$PHP_SELF是login.php中。如果它是 login.php 则它继续呈现页面,否则您将被重定向。

如果您提出此要求:

http://mysite.com/admin/configuration.php/login.php
Run Code Online (Sandbox Code Playgroud)

然后 PHP_SELF 将是

/admin/configuration.php/login.php
Run Code Online (Sandbox Code Playgroud)

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

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