如何劫持会话?

信息安全 应用安全 Web应用程序 php 会话管理
2021-09-01 05:54:46

尽管问题的标题很明显,但这实际上是出于真正的目的。

我的网站使用这样的 PHP 代码:

    $select="select id from tableA where user_id='".$_SESSION['sess_user_id']."'";

我真的想像黑客一样思考并弄清楚如何改变这个值。我读过关于“关于”会话劫持的文章,但对如何做到这一点含糊其辞......

4个回答

基本上,当您劫持某人的会话时,您会获取他们的 sessionID 并假装它是您自己的。通常 sessionID 在 cookie 中传输,这意味着如果您可以访问其他方的 cookie,您只需将其放入您自己的 cookie 中,您就窃取了他们的会话。

这可以通过多种方式完成,例如通过嗅探无线网络并查看正在传输的 HTTP 数据包或通过XSS 攻击,您可以告诉受害者浏览器向您透露他们的 cookie 信息。

我想提一下,您在问题中描述的示例也可能容易受到 SQL 注入的影响。如果我将 cookie 的 sessionID 更改为

asdf' OR 1=1-- 

我很可能会被认证为有效用户。为了防止这种情况,您必须确保在将数据用于任何事情之前对来自客户端的脏数据进行适当的清理。

如果您对动手演示感兴趣,Twitter 就是一个很好的例子,说明它是多么容易完成。你需要:

  • 两台电脑
  • 带有 Firebug 的 Firefox(显然还有其他选项,但这些都很流行且易于获取)
  • Cookie 编辑器,例如高级 Cookie 管理器(同样,可通过 Firefox 轻松安装插件)

在装有 firefox 和 firebug 的计算机 A 上,在非 https 站点上登录您的 twitter 帐户。登录后,打开 Firebug 并查看“GET twitter.com”行。当您展开它时,请查看 Response Headers 部分并找到 Set-Cookie。在那里,您会找到一个名为 _twitter_sess 的 cookie。突出显示并复制该值(一直到分号)。

现在使用计算机 B 上的高级 cookie 管理器打开 Firefox,然后转到 twitter 登录页面。打开高级 Cookie 管理器并筛选 twitter.com。找到 twitter.com 域及其 cookie 列表后,您将看到一个名为 _twitter_sess 的 cookie。删除它。现在制作一个名为“_twitter_sess”的新cookie,路径“/”和“Value”来自另一台计算机的_twitter_sess 的值。保存饼干。

现在关闭 cookie 管理器并返回到 twitter 登录页面,刷新页面然后 bam,你就进去了。

现在只需设计一些巧妙的方法来获取其他人的会话(开放 wifi、xss),这是完成会话劫持的一种方式。

Karrax 的代码是 SQL 注入攻击(您的代码容易受到攻击 - 这需要修复)而不是会话劫持攻击。

$select="select id from tableA where user_id='"
    .mysql_real_escape_string($_SESSION['sess_user_id'], $db_handle)
    ."'";

在会话劫持中,Bob 窃取了您分配给 Alice 的会话 id 的值。这可能是由于对 HTML 流的 MITM 攻击、网络嗅探、允许他在您的站点上嵌入一些 javacript 的 CSS 错误或其他方法造成的。

重要的是不要忽视会话固定问题 - 即使您在 cookie 上设置 SSL 和 HTTP only 标志,并且设置 use_only_cookies 也不能解决 Bob 在访问您的站点之前攻击 Alice 的计算机并设置特定值的问题会话 ID。然后 Bob 可以在他的计算机上设置相同的值,并且他的请求与 Alice 绑定到同一个会话。因此,当您进行身份验证时,您应该生成一个新的会话 ID - 请参阅 session_regenerate_id()

会话劫持通常涉及从用户那里窃取 cookie。例如,Firesheep 是 Firefox 的一个插件,它通过不安全的 Wifi 窃取会话。HTTP 是一种无状态协议,所以我们能做的最好的验证人的方法就是使用 cookie。

您在问题中的 PHP 代码是一个可能容易受到 SQL 注入影响的代码示例。通常最好的做法是在将变量放入这样的查询之前对其进行清理。