当前位置: 首页 > news >正文

浏览器解码顺序xss

浏览器解析和执行内容时遵循特定的解码顺序,这对XSS(跨站脚本攻击)的防御至关重要。攻击者常利用解码顺序的差异绕过过滤。以下是浏览器处理不同上下文的典型解码顺序:


1. HTML 解析优先

浏览器首先将响应作为HTML文档解析,按顺序处理:

  • 字符实体解码
    &lt;< , &gt;>, &amp;& 等被还原。

    <!-- 输入: -->
    &lt;img src=x onerror=alert(1)&gt;
    <!-- 解码后: -->
    <img src=x onerror=alert(1)>
    
  • 标签/属性解析
    浏览器识别标签(<div><script>)和属性(hrefonclick)。


2. JavaScript 执行(在特定上下文中)

当解析到 <script> 标签或事件处理器(如 onload)时,浏览器进入JS解析模式:

  • JS字符串解码
    Unicode转义(\u0061a)、十六进制(\x61a)被还原。

    // 输入:
    \u0061lert(1);
    // 解码后执行:
    alert(1);
    
  • 注意:HTML实体在JS中不会被二次解码

    <script>// 以下代码不会执行,因为 &lt; 在JS中是字符串var x = "&lt;img src=x onerror=alert(1)&gt;"; 
    </script>
    

3. 特殊属性/协议的处理

某些属性触发额外解析层:

  • href/src 等URL属性
    若协议为 javascript:,会进行URL解码

    <!-- 输入: -->
    <a href="javascript:%61lert(1)">Click</a>
    <!-- 解码后: -->
    <a href="javascript:alert(1)">Click</a>
    
  • CSS 中的解析
    style 属性或 <style> 标签内支持 \XX 十六进制解码:

    <div style="background:url(javascript:alert(1))"></div>
    

关键顺序总结

graph LR
A[原始响应] --> B[HTML 实体解码] 
B --> C[HTML 标签/属性解析]
C --> D{是否在 JS/CSS/URL 上下文?}
D -- JS --> E[JS 转义字符解码]
D -- URL --> F[URL 解码]
D -- CSS --> G[CSS 转义解码]
E --> H[执行 JS]
F --> H
G --> H

XSS 攻击的关键点

  1. 上下文混淆

    • 过滤器可能只转义 HTML 实体(如 <&lt;),但若payload在 <script> 中,需转义JS语法(如 "\x22)。
    • 例:
      <script>var user = "{{ user_input }}";  // 需防御JS字符串而非HTML
      </script>
      
  2. 编码嵌套绕过
    多层编码可能绕过简单过滤器:

    <!-- 输入: -->
    <a href="javascript:&amp;#x61;lert(1)"></a>
    <!-- 解码步骤: -->
    <!-- 1. HTML解码:&#x61; → &#x61; (&amp;已被解码为&) -->
    <!-- 2. URL解码:javascript:%61lert(1) → javascript:alert(1) -->
    

防御建议

  • 根据输出上下文转义
    • HTML 正文:<&lt;
    • HTML 属性:"&quot;
    • JS 字符串:动态内容用 \xHH 转义
    • URL:严格校验协议(禁止 javascript:
  • 使用安全框架自动处理(如React的JSX、DOMPurify)。
  • 避免将用户输入放在高危位置(如 <script>hrefeval())。
http://www.lryc.cn/news/596580.html

相关文章:

  • Matlab学习笔记:界面使用
  • 基础算法思想(递归篇)
  • Linux Bridge Cost
  • Java常用API(1)
  • csp基础知识——递推
  • 激光雷达-自动驾驶的“三维感知中枢“
  • postgresql导入导出数据;pg_restore: error: did not find magic string in file header
  • 学习pwn需要的基本汇编语言知识
  • 快速了解pandas库
  • Unity之C# 脚本与Unity Visual Scripting 交互
  • 嵌入式开发学习(第三阶段 Linux系统开发)
  • Model Control Protocol 使用MCP进行各种任务适配,调用工具和资源进行客户端开发
  • 基于AD7147电容触摸芯片与STC12C5A60S2单片机方案
  • SQL基础④ | 多表查询篇
  • AG32 mcu+cpld 联合编程(概念及流程)
  • OpenMVG OpenMVS 安装全流程常见问题与解决方法总结
  • 学习软件测试的第十九天
  • imx6ull-系统移植篇18——linux顶层 Makefile(下)
  • API是什么,如何保障API安全?
  • Springboot和postman的使用
  • XSS内容分享
  • 智能泵房监控系统:物联网应用与智能管理解决方案
  • Qt中QObject类的核心作用与使用
  • Qt 事件处理机制深入剖析
  • List<UserInfo> list = new ArrayList<>();为什么要这样创建数组?
  • 如何用keepAlive实现标签页缓存
  • 从 COLMAP 到 3D Gaussian Splatting
  • 滑动窗口经典问题整理
  • langchain4j之RAG 检索增强生成
  • Linux操作系统之线程(六):线程互斥