XSS笔记
字数 1183 2025-08-12 11:33:49

XSS攻击原理与防御全面指南

一、编码基础

1. URL编码

  • 作用:处理URL中的特殊字符(如&),避免歧义
  • 格式%后跟ASCII码的十六进制表示(如空格为%20
  • 解析流程
    • 浏览器自动进行一次URL编码
    • 服务器自动进行一次URL解码

2. HTML编码

HTML实体编码

  • 作用:防止特殊字符(如<>)被解析为HTML标签
  • 格式
    • 命名实体:&lt;&gt;&NewLine;
    • 数字实体:&#xHH;(十六进制)或&#DDD;(十进制)

HTML字符编码

  • 特点
    • 十进制/十六进制可混用
    • 数字前可加多个0(混淆作用)
    • 例:&#x0000006A;&#x6A;都表示字母j

3. JS Unicode编码

  • 格式\u00后跟十六进制数字(如\u0061表示a
  • 限制:不能编码控制字符(引号、括号、反引号等)

二、前端解析流程

  1. DOM构建阶段

    • 浏览器构建DOM树节点
    • 对节点内容解析前进行HTML解码
  2. JS执行阶段

    • DOM树构建完成后JS解释器开始工作
    • 进行JS Unicode解码

关键点:必须清楚区分服务器解析、浏览器解析和JS解析的时机

三、XSS类型与原理

1. 反射型(非持久型)

  • 特点
    • 需要页面回显
    • 网页源代码中可见payload
  • 攻击流程
    客户端 → [GET/POST恶意JS] → 服务器 → [返回未过滤代码] → 浏览器解析执行
    

2. 存储型(持久型)

  • 特点
    • 与数据库交互
    • 网页源代码中可见payload
  • 攻击流程
    客户端 → [提交恶意JS] → 服务器 → [存储到DB] → [查询返回] → 浏览器解析执行
    

3. DOM型

  • 特点
    • 网页源代码中无payload
    • 浏览器兼容性影响大
  • 攻击流程
    客户端 → [插入恶意JS] → JS解释器解析执行
    

四、常用Payload

1. 基础Payload

<script>alert`1`</script>

<audio src='#' onerror=alert`1`>
<svg onload="alert`1`"></svg>
<iframe onload="alert`1`"></iframe>

2. 高级技巧

  • HTML注释<!-- --!>也是有效注释

  • 伪协议

    <a href="javascript:alert`1`">click</a>
    

    可变形为:

    <a href="java&ampNewLine;script&colon;alert`1`">click</a>
    
  • 空白字符绕过

    // 以下写法等效
    onerror = alert`1`
    onerror
    =
    alert`1`
    
  • 字符串重组

    • 取反或异或运算重组字符串(应对严格过滤)

五、特殊注意事项

  1. 编码限制

    • HTML字符编码生成的引号无法闭合属性值
    • 浏览器仅对属性值进行HTML编码
  2. 标签限制

    • 以下标签内不能直接嵌入JS,需先闭合:
      <title>, <style>, <script>, <textarea>, 
      <noscript>, <xmp>, <iframe>
      
  3. 防御误区

    • htmlspecialchars()默认不转义单引号,需设置第二参数
    • HttpOnly不能防止所有XSS攻击(BurpSuite仍可操作)

六、防御措施

1. 输入处理

  • 编码转换
    htmlspecialchars($str, ENT_QUOTES); // 转义单双引号
    

2. Cookie安全

setcookie(name, value, expire, path, domain, secure, httponly);
// 设置httponly=true防止JS访问

3. 内容安全策略(CSP)

<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; script-src 'unsafe-inline'">

七、高级技巧

  1. DOM型XSS常见触发点

    element.innerHTML = userInput;
    document.write(userInput);
    
  2. 编码混合使用

    <!-- 混合URL编码和HTML编码 -->
    <a href="javascri&amp;#x70;t:alert%281%29">click</a>
    
  3. 非常规事件处理器

    <details ontoggle="alert`1`"></details>
    <select onfocus="alert`1`"></select>
    

八、推荐资源

  1. 《XSS Cheat Sheet》 - 全面收集各种Payload
  2. 浏览器编码解码原理

九、总结要点

  1. XSS通常需要配合CSRF才能发挥最大危害
  2. 浏览器兼容性对XSS效果影响显著
  3. 防御需结合输入过滤、输出编码和CSP策略
  4. 关注新兴Web技术(如Web Components)可能引入的新攻击面
XSS攻击原理与防御全面指南 一、编码基础 1. URL编码 作用 :处理URL中的特殊字符(如 & ),避免歧义 格式 : % 后跟ASCII码的十六进制表示(如空格为 %20 ) 解析流程 : 浏览器自动进行一次URL编码 服务器自动进行一次URL解码 2. HTML编码 HTML实体编码 作用 :防止特殊字符(如 <> )被解析为HTML标签 格式 : 命名实体: &lt; 、 &gt; 、 &NewLine; 数字实体: &#xHH; (十六进制)或 &#DDD; (十进制) HTML字符编码 特点 : 十进制/十六进制可混用 数字前可加多个 0 (混淆作用) 例: &#x0000006A; 和 &#x6A; 都表示字母 j 3. JS Unicode编码 格式 : \u00 后跟十六进制数字(如 \u0061 表示 a ) 限制 :不能编码控制字符(引号、括号、反引号等) 二、前端解析流程 DOM构建阶段 : 浏览器构建DOM树节点 对节点内容解析前进行HTML解码 JS执行阶段 : DOM树构建完成后JS解释器开始工作 进行JS Unicode解码 关键点 :必须清楚区分服务器解析、浏览器解析和JS解析的时机 三、XSS类型与原理 1. 反射型(非持久型) 特点 : 需要页面回显 网页源代码中可见payload 攻击流程 : 2. 存储型(持久型) 特点 : 与数据库交互 网页源代码中可见payload 攻击流程 : 3. DOM型 特点 : 网页源代码中无payload 浏览器兼容性影响大 攻击流程 : 四、常用Payload 1. 基础Payload 2. 高级技巧 HTML注释 : <!-- --!> 也是有效注释 伪协议 : 可变形为: 空白字符绕过 : 字符串重组 : 取反或异或运算重组字符串(应对严格过滤) 五、特殊注意事项 编码限制 : HTML字符编码生成的引号无法闭合属性值 浏览器仅对属性值进行HTML编码 标签限制 : 以下标签内不能直接嵌入JS,需先闭合: 防御误区 : htmlspecialchars() 默认不转义单引号,需设置第二参数 HttpOnly不能防止所有XSS攻击(BurpSuite仍可操作) 六、防御措施 1. 输入处理 编码转换 : 2. Cookie安全 3. 内容安全策略(CSP) 七、高级技巧 DOM型XSS常见触发点 : 编码混合使用 : 非常规事件处理器 : 八、推荐资源 《XSS Cheat Sheet》 - 全面收集各种Payload 浏览器编码解码原理 九、总结要点 XSS通常需要配合CSRF才能发挥最大危害 浏览器兼容性对XSS效果影响显著 防御需结合输入过滤、输出编码和CSP策略 关注新兴Web技术(如Web Components)可能引入的新攻击面