Mar*_*aio 6 php apache session session-fixation
我在读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脚本(代码如下),但攻击不起作用,这就是我所做的:
(假装是Mallory)我对Alice说:"你好去访问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>
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)
任何线索/想法总是受到赞赏!
这是我一直用来测试会话固定攻击的方式.它需要了解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 ,这样做要困难得多.