对localhost进行简单的会话固定攻击以进行测试

时间:2011-05-10 15:59:13

标签: php apache session session-fixation

我在SO上读了很多关于会话固定/劫持风险的q / a,很多人建议将php.ini指令更改为session.use_only_cookiesON以及其他php.ini指令使服务器更安全......

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

在我的localhost session.use_only_cookies上是OFF所以根据上面的q / a,我的localhost基本上是不受保护的,这就是我需要做的测试。

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

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

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

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

  3. 作为我的本地主机服务器的管理员,我看到会在服务器磁盘上创建会话(它被作为名为sess_ mysessionid的文件暂停),所以我想:很酷,它正在运行!!!

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

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

  6. 中所述

    的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);
    }
    ?>
    

    任何线索/想法总是受到赞赏!

2 个答案:

答案 0 :(得分:6)

这是我一直用来测试会话固定攻击的方式。它需要了解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 ,这样做要困难得多。< / p>

答案 1 :(得分:1)

除了禁用session.use_only_cookies之外,您还需要确保当前没有有效的会话ID Cookie,因为PHP希望$_COOKIE超过$_GET。事实上,Alice在登录后拥有不同会话ID的原因可能是因为Alice已经拥有一个有效会话ID,然后使用该会话ID代替通过URL提供的会话ID。您也可以禁用Cookie并启用session.use_trans_sid以避免使用Cookie。

然后您的漏洞应该按预期工作。