6

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

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

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

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

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

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

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

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

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

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


登录.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);
}
?>

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

4

2 回答 2

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,这要困难得多。

于 2011-05-11T15:59:32.227 回答
1

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

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

于 2011-05-11T16:29:00.143 回答