Php 用于测试的本地主机上的简单会话固定攻击
我读了很多关于会话固定/劫持风险的q/a,很多人建议更改Php 用于测试的本地主机上的简单会话固定攻击,php,apache,session,session-fixation,Php,Apache,Session,Session Fixation,我读了很多关于会话固定/劫持风险的q/a,很多人建议更改php.ini指令,比如session。只使用cookies到on和其他php.ini指令,使服务器更安全 我想亲眼看看是否可以在基于PHP5+Apache的localhost服务器上复制一个简单的攻击场景 在我的本地主机会话上。仅使用\u cookies是关闭的,因此根据上面的q/a,我的本地主机基本上不受保护,这就是我需要做的测试 我第一次阅读了这篇关于如何执行会话固定攻击的简单文章: 为了复制本文中描述的场景,我创建了两
php.ini
指令,比如session。只使用cookies
到on
和其他php.ini指令,使服务器更安全
会话上。仅使用\u cookies
是关闭的
,因此根据上面的q/a,我的本地主机基本上不受保护,这就是我需要做的测试
我第一次阅读了这篇关于如何执行会话固定攻击的简单文章:
sess\umysessionid
的文件),所以我想:很酷,它正在工作insession\u ok.php
,此时(根据上面的wikipedia文章),Mallory也应该能够看到insession\u ok.php
,因为他将会话固定到mysessionid
,,但事实并非如此,因为当Alice登录到一个新会话时,它是在服务器上创建的,所以我不明白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>
<?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);
}
?>
警报(document.cookie)//查看cookies
insession\u ok.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>
<?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);
}
?>
这是我一直用来测试会话固定攻击的方法。它需要了解HTTP协议,但如果您能够很好地了解会话固定,那么一点点HTTP不会吓到您:)
我在这里看到的会话固定的版本是一个公共计算机的概念,在这里,你可以去图书馆,导航到像www.myawesomesite.com这样的网站,不登录,你就可以写下分配给你的会话id
然后您离开,等待有人登录www.myawesomesite.com。他们登录后,立即手动将计算机上的会话更改为公用计算机上使用的cookie。然后,服务器认为您是经过身份验证的用户
为了在localhost上测试这一点,我们可以使用两种不同的浏览器来查看效果,因为浏览器通常不共享cookie
以下是执行此操作的步骤:
- 打开Chrome并导航到
localhost
。这将代表公共计算机。检查会话ID并将其记录下来。您可以使用Fiddler之类的程序查看请求,也可以使用WebDeveloper之类的插件查看cookie。cookie值应该类似于PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76
- 打开Firefox并导航到
localhost
。这将代表攻击者的计算机。使用WebDeveloper插件,将PHPSESSID cookie更改为从Chrome中写下的值
- 在Chrome中,以Alice身份登录。这将代表受害者登录
- 返回Firefox,单击“刷新”,或导航到仅经过身份验证的页面。如果您容易受到会话固定的影响,那么您应该在Firefox上以Alice身份登录,绕过登录
解决方法很简单(我相信您已经看到)。只要用户在您的代码中进行身份验证,就可以调用session\u regenerate\u id()
。这将使登录前使用的任何会话id无效,并意味着Oscar现在必须在您登录后(但在您注销前)尝试窃取您的会话id,这要困难得多。除了禁用,您还需要确保当前没有有效的会话ID cookie,因为PHP更喜欢$\u cookie
而不是$\u GET
。事实上,Alice在登录后拥有不同会话ID的原因可能是因为Alice已经拥有一个有效的cookie,其中包含一个会话ID,然后使用该cookie来代替通过URL提供的会话ID。您还可以禁用cookie并启用以避免cookie
那么您的漏洞应该可以正常工作