gpt4 book ai didi

php - 用于测试目的的对本地主机的简单 session 固定攻击

转载 作者:可可西里 更新时间:2023-11-01 13:20:09 24 4
gpt4 key购买 nike

我在 SO 上阅读了很多关于 session 固定/劫持风险的问答,许多人建议将 php.ini 指令(如 session.use_only_cookies 更改为 ON 和其他 php.ini 指令使服务器更安全......

我想亲眼看看我是否可以在基于 PHP5 + Apache 的本地主机服务器上复制一个简单的攻击场景。

在我的本地主机上 session.use_only_cookiesOFF 所以根据上面的 q/a 我的本地主机基本上是不 protected ,这是我需要做的测试。

我第一次阅读这篇关于如何执行 session 固定攻击的简单文章:

为了复制文章中描述的场景,我创建了两个非常简单的 PHP 脚本(代码如下),但攻击不起作用,这就是我所做的:

  1. (假装是马洛里)我对爱丽丝说:“你好,去拜访 http://localhost/login.php?PHPSESSID=mysessionid

  2. 然后(假装是爱丽丝)我去了http://localhost/login.php?PHPSESSID=mysessionid

  3. 作为本地主机服务器的管理员,我看到在服务器磁盘上创建了 session (它被创建为一个名为 sess_ mysessionid 的文件),所以我想:太棒了,它正在运行! !!

  4. 然后(假装是 Alice)我登录输入“joe”作为凭据

  5. Alice 登录,她被重定向到 insession_ok.php,此时(根据上面的维基百科文章)Mallory 应该能够看到 insession_ok.php 也是因为他将 session 固定到 mysessionid但这不是真的,因为当 Alice 登录时,在服务器 sess_vdshg238cnfb4vt7ahpnp1p522 上创建了一个新 session ,所以我目前不明白 Mallory 应该如何固定/劫持 session ,如文章中所述???


登录.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);
}
?>

任何线索/想法总是值得赞赏!

最佳答案

这是我一直用来测试 session 固定攻击的方式。它需要了解 HTTP 协议(protocol),但如果您足够了解 session 固定,一点点 HTTP 应该不会吓到您:)

我在这里看到的 session 固定版本是公共(public)计算机的概念,您可以在其中去图书馆,导航到 www.myawesomesite.com 之类的网站,无需登录,您可以记下分配给您的 session ID。

然后您离开并等待有人登录 www.myawesomesite.com。一旦他们登录,请手动将您计算机上的 session 更改为在公共(public)计算机上使用的 cookie。然后服务器认为您是经过身份验证的用户。

为了在localhost上进行测试,我们可以使用两个不同的浏览器来查看效果,因为浏览器通常不共享cookie。

步骤如下:

  • 打开 Chrome 并导航到 localhost。这将代表公共(public)计算机。检查 session ID 并将其记下。您可以使用像 Fiddler 这样的程序来查看请求,或者使用像 Web Developer 这样的插件来查看 cookie。 cookie 值应类似于 PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76

  • 打开 Firefox 并导航到 localhost。这将代表攻击者的计算机。使用 Web Developer 插件,将 PHPSESSID cookie 更改为您从 Chrome 记下的值。

  • 在 Chrome 中,以 Alice 身份登录。这将代表受害者登录。

  • 返回 Firefox,单击“刷新”,或导航至仅经过身份验证的页面。如果您容易受到 session 固定的影响,那么您应该在 Firefox 上以 Alice 身份登录,绕过登录。

解决这个问题的方法很简单(我相信您已经看到了)。一旦用户在您的代码中进行身份验证,只需调用 session_regenerate_id() 即可。这会使登录前使用的任何 session ID 无效,这意味着 Oscar 现在必须在您登录后(但在您注销之前) 尝试窃取您的 session ID,这要困难得多。

关于php - 用于测试目的的对本地主机的简单 session 固定攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com