当前位置: 首页 > 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.xdnf.cn/news/1168381.html

相关文章:

  • 低成本、高泛化能力的无人机自主飞行!VLM-Nav:基于单目视觉与视觉语言模型的无地图无人机导航
  • excle中匹配加密手机号(同sheet中)
  • Springboot + MyBatis-Plus + PageHelper 分页性能混合优化方案
  • 解决栅格数据裁剪矢量数据问题两种方法,ArcGIS解决与PYTHON解决
  • 物联网_TDengine_EMQX_性能测试
  • 【Android】xml和Java两种方式实现发送邮件页面
  • API网关原理与使用场景详解
  • Apache Ignite 中 WHERE 子句中的子查询(Subqueries in WHERE Clause)的执行方式
  • Linux操作系统从入门到实战(十二)Linux操作系统第一个程序(进度条)
  • 北京养老金计算公式网页实现案例:从需求分析到架构设计
  • J2EE模式---前端控制器模式
  • Python 绘制各类折线图全指南:从基础到进阶
  • k8s:离线部署tomcatV11.0.9,报Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh
  • zabbix“专家坐诊”第295期问答
  • 以太网基础⑥ ZYNQ PS端 基于LWIP的TCP例程测试
  • MATLAB软件使用频繁,企业如何做到“少买多用”?
  • MFC类Qt的自动布局框架
  • 力扣-链表相关题 持续更新中。。。。。。
  • UE5 UI ScrollBox 滚动框
  • 欧拉系统二进制部署Docker
  • Linux_Ext系列文件系统基本认识(一)
  • Fluent许可与网络安全策略
  • 【洛谷】用两个数组实现静态单链表、静态双向链表,排队顺序
  • 【C语言进阶】动态内存管理(1)
  • 赋能未来数学课堂——基于Qwen3、LangChain与Agent架构的个性化教辅系统研究
  • Vue + WebSocket 实时数据可视化实战:多源融合与模拟数据双模式设计
  • vscode目录,右键菜单加入用VSCode打开文件和文件夹(快速解决)(含删除)(脚本)
  • 华为服务器操作系统openEuler介绍与安装
  • 信息学奥赛一本通 1553:【例 2】暗的连锁
  • C++_Hello算法_队列