BurpSuite XSS Lab(HTML属性中经过实体编码的反射xss)
字数 1449 2025-08-20 18:18:11

HTML属性中经过实体编码的反射XSS攻击教学文档

1. 实验概述

本实验演示了一种特殊的反射型跨站脚本(XSS)攻击场景,其中:

  • 攻击发生在搜索功能中
  • 输入中的尖括号(<>)被HTML实体编码
  • 注入点位于HTML元素的属性上

2. 实验环境分析

2.1 输入处理机制

  • 用户输入被放置在<input>标签的value属性中
  • 程序对特殊字符进行了HTML实体编码转换:
    • < 被编码为 &lt;
    • > 被编码为 &gt;
  • 但双引号(")未被编码

2.2 初始测试

使用基本XSS payload测试:


结果:

  • 尖括号被编码,无法形成新标签
  • 整个payload被作为value属性的值

3. 攻击原理

3.1 HTML实体编码绕过

由于尖括号被编码但双引号未被编码,可以:

  1. 闭合现有的value属性
  2. 注入新的HTML属性

3.2 有效payload构造

" onmouseover="alert(1)

解释:

  • 第一个"闭合原有的value属性
  • onmouseover添加新的事件处理器
  • 第二个"开启新的属性值

4. 攻击步骤详解

4.1 寻找注入点

  1. 在搜索框中输入测试字符串
  2. 观察响应中该字符串被放置的位置
  3. 确认是在<input>标签的value属性中

4.2 测试字符过滤

  1. 测试尖括号是否被编码
  2. 测试引号是否被编码
  3. 测试其他特殊字符的处理

4.3 构造有效payload

基于测试结果,构造能:

  1. 闭合现有属性
  2. 注入可执行代码
  3. 不依赖被过滤的字符

4.4 事件处理器选择

可用的on事件属性:

  • onmouseover - 鼠标悬停时触发
  • onclick - 点击时触发
  • onfocus - 获得焦点时触发
  • onload - 加载时触发

在本实验中,onmouseover被证实有效。

5. 防御措施

5.1 编码策略

  • 对所有不可信数据应用HTML实体编码
  • 特别关注输出上下文的编码需求:
    • HTML正文
    • HTML属性
    • JavaScript
    • URL

5.2 编程语言中的编码函数

  • PHP: htmlspecialchars()htmlentities()
  • Java: StringEscapeUtils.escapeHtml()
  • Python: cgi.escape()html.escape()
  • .NET: HttpUtility.HtmlEncode()

5.3 安全配置

使用htmlspecialchars()时的推荐参数:

htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');
  • ENT_QUOTES: 编码单双引号
  • ENT_HTML5: 使用HTML5标准的实体编码
  • 指定字符集防止编码问题

6. 深入理解

6.1 HTML实体编码

将特殊字符转换为对应的HTML实体:

  • <&lt;
  • >&gt;
  • "&quot;
  • '&#39;
  • &&amp;

6.2 上下文感知编码

不同上下文需要不同的编码:

  1. HTML正文:编码<, >, &
  2. HTML属性:还需编码引号
  3. JavaScript字符串:需额外处理

6.3 为什么本实验中的攻击有效

  1. 只编码了尖括号,未编码引号
  2. 允许在属性中注入新的事件处理器
  3. 浏览器优先解析HTML标记,然后处理属性

7. 实验总结

本实验展示了:

  1. 不完整的编码策略导致的XSS漏洞
  2. 属性注入型XSS的攻击方法
  3. 上下文相关编码的重要性
  4. 即使过滤了尖括号,XSS仍可能发生

关键教训:安全防御必须考虑实际的输出上下文,进行适当的编码。

HTML属性中经过实体编码的反射XSS攻击教学文档 1. 实验概述 本实验演示了一种特殊的反射型跨站脚本(XSS)攻击场景,其中: 攻击发生在搜索功能中 输入中的尖括号( <>)被HTML实体编码 注入点位于HTML元素的属性上 2. 实验环境分析 2.1 输入处理机制 用户输入被放置在 <input> 标签的 value 属性中 程序对特殊字符进行了HTML实体编码转换: < 被编码为 &lt; > 被编码为 &gt; 但双引号( " )未被编码 2.2 初始测试 使用基本XSS payload测试: 结果: 尖括号被编码,无法形成新标签 整个payload被作为 value 属性的值 3. 攻击原理 3.1 HTML实体编码绕过 由于尖括号被编码但双引号未被编码,可以: 闭合现有的 value 属性 注入新的HTML属性 3.2 有效payload构造 解释: 第一个 " 闭合原有的 value 属性 onmouseover 添加新的事件处理器 第二个 " 开启新的属性值 4. 攻击步骤详解 4.1 寻找注入点 在搜索框中输入测试字符串 观察响应中该字符串被放置的位置 确认是在 <input> 标签的 value 属性中 4.2 测试字符过滤 测试尖括号是否被编码 测试引号是否被编码 测试其他特殊字符的处理 4.3 构造有效payload 基于测试结果,构造能: 闭合现有属性 注入可执行代码 不依赖被过滤的字符 4.4 事件处理器选择 可用的 on 事件属性: onmouseover - 鼠标悬停时触发 onclick - 点击时触发 onfocus - 获得焦点时触发 onload - 加载时触发 在本实验中, onmouseover 被证实有效。 5. 防御措施 5.1 编码策略 对所有不可信数据应用HTML实体编码 特别关注输出上下文的编码需求: HTML正文 HTML属性 JavaScript URL 5.2 编程语言中的编码函数 PHP: htmlspecialchars() 或 htmlentities() Java: StringEscapeUtils.escapeHtml() Python: cgi.escape() 或 html.escape() .NET: HttpUtility.HtmlEncode() 5.3 安全配置 使用 htmlspecialchars() 时的推荐参数: ENT_QUOTES : 编码单双引号 ENT_HTML5 : 使用HTML5标准的实体编码 指定字符集防止编码问题 6. 深入理解 6.1 HTML实体编码 将特殊字符转换为对应的HTML实体: < → &lt; > → &gt; " → &quot; ' → &#39; & → &amp; 6.2 上下文感知编码 不同上下文需要不同的编码: HTML正文:编码 < , > , & HTML属性:还需编码引号 JavaScript字符串:需额外处理 6.3 为什么本实验中的攻击有效 只编码了尖括号,未编码引号 允许在属性中注入新的事件处理器 浏览器优先解析HTML标记,然后处理属性 7. 实验总结 本实验展示了: 不完整的编码策略导致的XSS漏洞 属性注入型XSS的攻击方法 上下文相关编码的重要性 即使过滤了尖括号,XSS仍可能发生 关键教训:安全防御必须考虑实际的输出上下文,进行适当的编码。