- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 SO 上阅读了很多关于 session 固定/劫持风险的问答,许多人建议将 php.ini
指令(如 session.use_only_cookies
更改为 ON
和其他 php.ini 指令使服务器更安全......
我想亲眼看看我是否可以在基于 PHP5 + Apache 的本地主机服务器上复制一个简单的攻击场景。
在我的本地主机上 session.use_only_cookies
是 OFF
所以根据上面的 q/a 我的本地主机基本上是不 protected ,这是我需要做的测试。
我第一次阅读这篇关于如何执行 session 固定攻击的简单文章:
为了复制文章中描述的场景,我创建了两个非常简单的 PHP 脚本(代码如下),但攻击不起作用,这就是我所做的:
(假装是马洛里)我对爱丽丝说:“你好,去拜访 http://localhost/login.php?PHPSESSID=mysessionid ”
然后(假装是爱丽丝)我去了http://localhost/login.php?PHPSESSID=mysessionid
作为本地主机服务器的管理员,我看到在服务器磁盘上创建了 session (它被创建为一个名为 sess_ mysessionid
的文件),所以我想:太棒了,它正在运行! !!
然后(假装是 Alice)我登录输入“joe”作为凭据
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/
我正在努力实现以下目标, 假设我有字符串: ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ( z ) ( A ) ) ) ) ) 我想编写一个正则
给定: 1 2 3 4 5 6
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
大家好,我卡颂。 Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了。 本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一
身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母”X“。 与之匹配的正则表达式: ?
我们先来最简单的,网页的登录窗口; 不过开始之前,大家先下载jquery的插件 本人习惯用了vs2008来做网页了,先添加一个空白页 这是最简单的的做法。。。先在body里面插入 <
1、MySQL自带的压力测试工具 Mysqlslap mysqlslap是mysql自带的基准测试工具,该工具查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、简单、实用的数据库文档(字典)生成工具,该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等
Go语言语法类似于C语言,因此熟悉C语言及其派生语言( C++、 C#、Objective-C 等)的人都会迅速熟悉这门语言。 C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的
我正在使用快速将 mkv 转换为 mp4 ffmpeg 命令 ffmpeg -i test.mkv -vcodec copy -acodec copy new.mp4 但不适用于任何 mkv 文件,当
我想计算我的工作簿中的工作表数量,然后从总数中减去特定的工作表。我错过了什么?这给了我一个对象错误: wsCount = ThisWorkbook.Sheets.Count - ThisWorkboo
我有一个 perl 文件,用于查看文件夹中是否存在 ini。如果是,它会从中读取,如果不是,它会根据我为它制作的模板创建一个。 我在 ini 部分使用 Config::Simple。 我的问题是,如果
尝试让一个 ViewController 通过标准 Cocoa 通知与另一个 ViewController 进行通信。 编写了一个简单的测试用例。在我最初的 VC 中,我将以下内容添加到 viewDi
我正在绘制高程剖面图,显示沿路径的高程增益/损失,类似于下面的: Sample Elevation Profile with hand-placed labels http://img38.image
嗨,所以我需要做的是最终让 regStart 和 regPage 根据点击事件交替可见性,我不太担心编写 JavaScript 函数,但我根本无法让我的 regPage 首先隐藏。这是我的代码。请简单
我有一个非常简单的程序来测量一个函数花费了多少时间。 #include #include #include struct Foo { void addSample(uint64_t s)
我需要为 JavaScript 制作简单的 C# BitConverter。我做了一个简单的BitConverter class BitConverter{ constructor(){} GetBy
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是 Simple.Data 的新手。但我很难找到如何进行“分组依据”。 我想要的是非常基本的。 表格看起来像: +________+ | cards | +________+ | id |
我现在正在开发一个 JS UDF,它看起来遵循编码。 通常情况下,由于循环计数为 2,Alert Msg 会出现两次。我想要的是即使循环计数为 3,Alert Msg 也只会出现一次。任何想法都
我是一名优秀的程序员,十分优秀!