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