我在SO上读了很多关于会话固定/劫持风险的q / a,很多人建议将php.ini
指令更改为session.use_only_cookies
到ON
以及其他php.ini指令使服务器更安全......
如果我可以在基于PHP5 + Apache的localhost服务器上复制一个简单的攻击场景,我想看看我的眼睛。
在我的localhost session.use_only_cookies
上是OFF
所以根据上面的q / a,我的localhost基本上是不受保护的,这就是我需要做的测试。
我第一次阅读这篇关于如何进行会话固定攻击的简单文章:
为了复制文章中描述的场景,我创建了两个非常简单的PHP脚本(代码如下),但攻击不起作用,这就是我所做的:
(假装是马洛里)我对爱丽丝说:“你好去拜访http://localhost/login.php?PHPSESSID=mysessionid”
然后(假装是爱丽丝)我去了http://localhost/login.php?PHPSESSID=mysessionid
作为我的本地主机服务器的管理员,我看到会在服务器磁盘上创建会话(它被作为名为sess_ mysessionid
的文件暂停),所以我想:很酷,它正在运行!!!
然后(假装是Alice)我登录后输入“joe”作为凭证
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);
}
?>
任何线索/想法总是受到赞赏!
答案 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。
然后您的漏洞应该按预期工作。