【发布时间】:2011-05-10 15:59:12
【问题描述】:
我在 SO 上阅读了许多关于会话固定/劫持风险的 q/a,许多人建议将 php.ini 指令(如 session.use_only_cookies 更改为 ON 和其他 php.ini 指令)以使服务器更安全。 ..
我想亲眼看看是否可以在基于 PHP5 + Apache 的 localhost 服务器上复制一个简单的攻击场景。
在我的本地主机上session.use_only_cookies 是OFF 所以根据上面的q/a 我的本地主机基本上是不受保护的,这是我需要做的测试。
我第一次阅读这篇关于如何执行会话固定攻击的简单文章:
为了复制文章中描述的场景,我创建了两个非常简单的PHP脚本(代码如下),但是攻击不起作用,这是我做的:
(假装是马洛里)我对爱丽丝说:“你好,去http://localhost/login.php?PHPSESSID=mysessionid”
然后(假装爱丽丝)我去了http://localhost/login.php?PHPSESSID=mysessionid
-
作为 localhost 服务器的管理员,我看到在服务器磁盘上创建了会话(它被创建为名称为
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);
}
?>
任何线索/想法都会受到赞赏!
【问题讨论】:
标签: php apache session session-fixation