访问以下所有内容会将您转到login屏幕:
http://mysite.com/admin/configuration.php http://mysite.com/admin/login.php
但是,如果您访问(请注意URLstring的最后两部分都是.php):
http://mysite.com/admin/configuration.php/login.php
您可以看到configuration屏幕及其所有数据!
此外,如果你附加一些GETvariables,你甚至可以得到可编辑的字段:
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行左右)。 请注意,这只是一个紧急补丁,因为真正的解决scheme是永远不要使用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会话var可能已经被设置,所以这似乎不起作用。 只需取消设置,然后重试。
在/admin的所有脚本包含的includes / application_top中,您会发现这个小gem(我已经抛出了一些无趣的部分):
// 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); }
这段代码只有在你没有login的时候才会被执行。它的基本function是检查$PHP_SELF是否为login.php。 如果是login.php,那么它会继续渲染页面,否则你将被redirect。
如果你提出这个要求:
http://mysite.com/admin/configuration.php/login.php
然后PHP_SELF将会
/admin/configuration.php/login.php
而basename($PHP_SELF)当然是login.php因此渲染继续,不执行redirect。 但它是当然不是login.php获取呈现,但configuration.php 。 URL“/login.php”的其余部分被“忽略”,只是在$ _SERVER ['PATH_INFO']中提供给PHP。
编辑:我喜欢补充说,这个“错误”只影响oscommerce或任何其他软件,使用这样的解决scheme来“保护”pipe理login(我认为没有那么多的受此影响)。 这不是一个影响所有PHP软件的错误。
这只是configuration.php文件中的一个漏洞 – “假目录”与PHP文件作为path的一部分是一个有意图的function,你会经常看到的东西 – 斜杠后的东西是如何处理的到path中的php文件。 (mediawiki是一个很好的例子)
我已经试过这个窗口框,使用双重url如所示 – 它说没有find页面。 但是,服务器设置为不允许目录横向和OSCommerce设置为检查用户代理和防止蜘蛛会话,以及使用会话目录 – 可能这就是为什么它是安全的,不允许追加一个URL。 此外,服务器将/login.php作为第一个文件名的一部分,不允许driectory横向,不允许在文件名中的点 – 因此它完全拒绝该url。 因此,不pipe目录软件试图做什么,服务器都是安全的。