![被黑了?附加文件名如何允许访问网站数据...参见示例](https://linux22.com/image/558184/%E8%A2%AB%E9%BB%91%E4%BA%86%EF%BC%9F%E9%99%84%E5%8A%A0%E6%96%87%E4%BB%B6%E5%90%8D%E5%A6%82%E4%BD%95%E5%85%81%E8%AE%B8%E8%AE%BF%E9%97%AE%E7%BD%91%E7%AB%99%E6%95%B0%E6%8D%AE...%E5%8F%82%E8%A7%81%E7%A4%BA%E4%BE%8B.png)
访问以下所有内容都会将您带到登录屏幕:
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_SELF
login.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。因此是安全的,因为无论目录软件尝试做什么,服务器都是安全的。