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

Mar*_*aio 6 php apache session session-fixation

我在读SO许多Q/A有关的会话固定/劫持,许多人建议改变风险php.ini就像指令session.use_only_cookiesON和别人的php.ini指令,以使服务器更安全...

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

在我的localhost session.use_only_cookiesOFF如此根据上面的q/a我的localhost基本上是不受保护的,这是我需要做的测试.

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

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

  1. (假装是Mallory)我对Alice说:"你好去访问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>
Run Code Online (Sandbox Code Playgroud)

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);
}
?>
Run Code Online (Sandbox Code Playgroud)

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

riw*_*alk 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 ,这样做要困难得多.