Php 用于测试的本地主机上的简单会话固定攻击

Php 用于测试的本地主机上的简单会话固定攻击,php,apache,session,session-fixation,Php,Apache,Session,Session Fixation,我读了很多关于会话固定/劫持风险的q/a,很多人建议更改php.ini指令,比如session。只使用cookies到on和其他php.ini指令,使服务器更安全 我想亲眼看看是否可以在基于PHP5+Apache的localhost服务器上复制一个简单的攻击场景 在我的本地主机会话上。仅使用\u cookies是关闭的,因此根据上面的q/a,我的本地主机基本上不受保护,这就是我需要做的测试 我第一次阅读了这篇关于如何执行会话固定攻击的简单文章: 为了复制本文中描述的场景,我创建了两

我读了很多关于会话固定/劫持风险的q/a,很多人建议更改
php.ini
指令,比如
session。只使用cookies
on
和其他php.ini指令,使服务器更安全

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

在我的本地主机
会话上。仅使用\u cookies
关闭的
,因此根据上面的q/a,我的本地主机基本上不受保护,这就是我需要做的测试

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

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

  • (假装是马洛里)我对爱丽丝说:“你好,去拜访吧”

  • 然后(假装成爱丽丝)我去了学校

  • 作为本地主机服务器的管理员,我看到正在服务器磁盘上创建会话(它是一个名为
    sess\umysessionid
    的文件),所以我想:很酷,它正在工作

  • 然后(假装成爱丽丝)我登录,输入“乔”作为凭证

  • Alice登录后被重定向到
    insession\u ok.php
    ,此时(根据上面的wikipedia文章),Mallory也应该能够看到
    insession\u ok.php
    ,因为他将会话固定到
    mysessionid
    ,但事实并非如此,因为当Alice登录到一个新会话时,它是在服务器上创建的,所以我不明白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>
    
    <?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);
    }
    ?>
    
    
    警报(document.cookie)//查看cookies
    

    insession\u ok.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>
    
    <?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);
    }
    ?>
    

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

    我在这里看到的会话固定的版本是一个公共计算机的概念,在这里,你可以去图书馆,导航到像www.myawesomesite.com这样的网站,不登录,你就可以写下分配给你的会话id

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

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

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

    • 打开Chrome并导航到
      localhost
      。这将代表公共计算机。检查会话ID并将其记录下来。您可以使用Fiddler之类的程序查看请求,也可以使用WebDeveloper之类的插件查看cookie。cookie值应该类似于
      PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76

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

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

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

    解决方法很简单(我相信您已经看到)。只要用户在您的代码中进行身份验证,就可以调用
    session\u regenerate\u id()
    。这将使登录前使用的任何会话id无效,并意味着Oscar现在必须在您登录后(但在您注销前)尝试窃取您的会话id,这要困难得多。

    除了禁用,您还需要确保当前没有有效的会话ID cookie,因为PHP更喜欢
    $\u cookie
    而不是
    $\u GET
    。事实上,Alice在登录后拥有不同会话ID的原因可能是因为Alice已经拥有一个有效的cookie,其中包含一个会话ID,然后使用该cookie来代替通过URL提供的会话ID。您还可以禁用cookie并启用以避免cookie

    那么您的漏洞应该可以正常工作