【问题标题】:Simple session fixation attack on localhost for testing purpose用于测试目的的对本地主机的简单会话固定攻击
【发布时间】:2011-05-10 15:59:12
【问题描述】:

我在 SO 上阅读了许多关于会话固定/劫持风险的 q/a,许多人建议将 php.ini 指令(如 session.use_only_cookies 更改为 ON 和其他 php.ini 指令)以使服务器更安全。 ..

我想亲眼看看是否可以在基于 PHP5 + Apache 的 localhost 服务器上复制一个简单的攻击场景。

在我的本地主机上session.use_only_cookiesOFF 所以根据上面的q/a 我的本地主机基本上是不受保护的,这是我需要做的测试。

我第一次阅读这篇关于如何执行会话固定攻击的简单文章:

为了复制文章中描述的场景,我创建了两个非常简单的PHP脚本(代码如下),但是攻击不起作用,这是我做的:

  1. (假装是马洛里)我对爱丽丝说:“你好,去http://localhost/login.php?PHPSESSID=mysessionid

  2. 然后(假装爱丽丝)我去了http://localhost/login.php?PHPSESSID=mysessionid

  3. 作为 localhost 服务器的管理员,我看到在服务器磁盘上创建了会话(它被创建为名称为 sess_ mysessionid 的文件),所以我想:太棒了,它正在工作!!!

  4. 然后(假装是 Alice)我输入“joe”作为凭据登录

  5. Alice 登录,她被重定向到insession_ok.php,此时(根据上面的维基百科文章)Mallory 也应该能够看到insession_ok.php,因为他将会话固定到mysessionid但这不是真的,因为当 Alice 登录时,会在服务器 sess_vdshg238cnfb4vt7ahpnp1p522 上创建一个新会话,所以我现在不明白 Mallory 应该如何固定/劫持会话,如文章中所述???


login.php

<?php
session_start();

//if user credentials are ok, let's put him in session
if( @$_POST['usr'] === 'joe' )
   $_SESSION['in_session'] = TRUE;

//if user is already logged in, let's redirect him to the account page "insession_ok.php"
if( isset($_SESSION['in_session']) )
{
   $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/insession_ok.php';      
   header("Location: " . $webpage, TRUE, 302);
}    
?>
<form method="POST" action="login.php">
   <input name="usr" type="text">
   <input type="submit" value="Submit">   
</form>    
<script type="text/javascript">
   alert(document.cookie); //to view cookies
</script>

insession_ok.php

<?php
session_start();
if(@$_SESSION['in_session'] === TRUE)
   echo "in session ok";
else //user is not in session cause he did not login, let's redirect him to login page
{
   $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/login.php';      
   header("Location: " . $webpage, TRUE, 302);
}
?>

任何线索/想法都会受到赞赏!

【问题讨论】:

    标签: php apache session session-fixation


    【解决方案1】:

    这是我一直用来测试会话固定攻击的方法。它需要了解 HTTP 协议,但如果你足够了解会话固定,那么一点点 HTTP 就不会吓到你 :)

    我在这里看到的会话固定版本是公共计算机的概念,您可以在其中访问图书馆,导航到 www.myawesomesite.com 之类的站点,然后在不登录的情况下写下分配给您的会话 ID。

    然后您离开并等待有人登录 www.myawesomesite.com。一旦他们登录,手动将您计算机上的会话更改为在公共计算机上使用的 cookie。然后服务器认为您是经过身份验证的用户。

    为了在 localhost 上进行测试,我们可以使用两个不同的浏览器来查看效果,因为浏览器通常不共享 cookie。

    以下是执行此操作的步骤:

    • 打开 Chrome 并导航到 localhost。这将代表公共计算机。检查会话 ID 并将其写下来。你可以通过使用像 Fiddler 这样的程序来查看请求,或者使用像 Web Developer 这样的插件来查看 cookie。 cookie 值应类似于 PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76

    • 打开 Firefox 并导航到 localhost。这将代表攻击者的计算机。使用 Web Developer 插件,将 PHPSESSID cookie 更改为您从 Chrome 中记下的值。

    • 在 Chrome 中,以 Alice 的身份登录。这将代表受害者登录。

    • 返回 Firefox,单击“刷新”,或导航到仅经过身份验证的页面。如果您容易受到会话固定的影响,那么您应该在 Firefox 上以 Alice 的身份登录,绕过登录。

    解决这个问题很简单(我相信您已经看到了)。只要用户在您的代码中进行身份验证,只需调用session_regenerate_id()。这会使登录之前使用的任何会话 ID 无效,并且意味着 Oscar 现在必须尝试在您登录之后(但在您注销之前) 窃取您的会话 ID,这要困难得多。

    【讨论】:

      【解决方案2】:

      除了禁用session.use_only_cookies,您还需要确保当前没有有效的会话ID cookie,因为PHP 更喜欢$_COOKIE 而不是$_GET。事实上,Alice 在登录后拥有不同的会话 ID 的原因可能是因为 Alice 已经有一个有效的 cookie,该 cookie 具有随后使用的会话 ID,而不是通过 URL 提供的会话 ID。您还可以禁用 cookie 并启用 session.use_trans_sid 以完全避免 cookie。

      那么您的漏洞利用应该按预期工作。

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2014-02-06
        • 2011-10-24
        • 2010-11-10
        • 2012-12-03
        • 2013-09-07
        相关资源
        最近更新 更多