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

小程序网站韩家英设计公司官网

小程序网站,韩家英设计公司官网,网站成本费用,泰安营销网站建设目录 代码分析 代码流程: 一次循环的问题 原因分析:删除顺序导致遗漏 两次循环修复方案 两种绕过方式 绕过方法 1:DOM破环 绕过方法 2:SVG XSS(双 SVG 绕过) 1. 为什么 "一个SVG注定失败&…

目录

代码分析

代码流程:

一次循环的问题

原因分析:删除顺序导致遗漏

两次循环修复方案

两种绕过方式

绕过方法 1:DOM破环

绕过方法 2:SVG XSS(双 SVG 绕过)

1. 为什么 "一个SVG注定失败,两个SVG直接成功"?

2. 为什么属性被删除后SVG仍能触发XSS?

复现对比实验

场景1:单SVG(失败)

场景2:双SVG(成功)

防御建议:


代码分析

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form id=x><input id=attributes><input id=attributes></form>
</body>
<script>console.info(x.attributes);const data = decodeURIComponent(location.hash.substr(1));const root = document.createElement('div');root.innerHTML = data;// 这里模拟了XSS过滤的过程,方法是移除所有属性for (let el of root.querySelectorAll('*')) {for (let attr of el.attributes) {el.removeAttribute(attr.name);}}document.body.appendChild(root); 
</script>
</html>

代码流程:

  1. 通过 decodeURIComponent(location.hash.substr(1)) 获取 URL # 号后面的内容。
  2. 创建一个 div,并将获取的内容赋值给 div.innerHTML
  3. 遍历 div 内部的所有子元素,并移除它们的所有属性。
  4. div 添加到 document.body

一次循环的问题

测试 Payload:

<img src=1 οnerrοr=alert(1)>

意外结果: src=1 被删除,但 onerror=alert(1) 仍然存在。

原因分析:删除顺序导致遗漏

  1. for (let attr of el.attributes) 遍历元素的属性。
  2. src 作为第一个属性被删除后,属性列表的索引发生变化。
  3. onerror 变成第一个属性,而 for 循环仍在进行,导致跳过了 onerror

绕过方法:

<img test=aaa src=1 title=bbb οnerrοr=alert(1)>

通过增加 test=aaatitle=bbb 等属性,可以让 onerror 处于不会被跳过的位置,从而绕过一次循环的属性删除。


两次循环修复方案

改进代码:

<script>const data = decodeURIComponent(location.hash.substr(1));const root = document.createElement('div');root.innerHTML = data;// 这里模拟了XSS过滤的过程,方法是移除所有属性,sanitizerfor (let el of root.querySelectorAll('*')) {let attrs = [];for (let attr of el.attributes) {attrs.push(attr.name);}for (let name of attrs) {el.removeAttribute(name);}}    document.body.appendChild(root); 
</script>

两次循环的改进点:

  • 第一次循环 先收集所有属性的名称。
  • 第二次循环 再删除这些属性,避免索引错位问题。

两种绕过方式

绕过方法 1:DOM破环

原理:onfocus 事件先触发,移除 onfocus 后,仍然可以执行 alert(1)

<form%20 tabindex=1 οnfοcus="alert(1);this.removeAttribute('onfocus');" autofocus="true"><input name=attributes><input name=attributes>
</form>

过程:

  1. <form> 被解析时,tabindex=1 使其获得焦点。
  2. autofocus="true" 使 <form> 立即聚焦。
  3. onfocus 触发 alert(1),并删除自身的 onfocus
  4. 代码执行时,属性删除已经无法影响 XSS 触发。

绕过方法 2:SVG XSS(双 SVG 绕过)

<svg><svg/οnlοad=alert(1)>

1. 为什么 "一个SVG注定失败,两个SVG直接成功"?

关键原因:浏览器解析的时序差异

  • 单SVG场景

    <svg><image href="valid.png" onload="alert(1)"></svg>
    1. 当插入DOM时,浏览器会立即解析SVG并开始加载<image>href资源。

    2. 资源加载是异步的onload事件会在资源加载完成后触发。

    3. 此时代码中的属性删除循环(el.removeAttribute)可能已经执行完毕,移除了onload属性。

    4. 事件未被绑定:因为属性在事件触发前已被删除,XSS无法触发。

  • 双SVG场景

    <svg></svg> <!-- 第一个SVG -->
    <svg><image href="valid.png" onload="alert(1)"></svg> <!-- 第二个SVG -->
    1. 浏览器解析第一个SVG时,会同步处理其子元素。

    2. 当解析第二个SVG时,浏览器可能已经进入异步任务队列

    3. 事件触发时机提前:第二个SVG的<image>onload事件可能在属性删除循环完成前触发。

    4. XSS成功:事件回调在属性被删除前已绑定到DOM元素。

本质

  • 多个SVG可能改变浏览器的事件循环时序,导致属性删除和事件触发的竞争条件(Race Condition)。


2. 为什么属性被删除后SVG仍能触发XSS?

关键原因:事件触发与属性删除的异步性

  • 示例代码

    <svg><image onload="alert(1)"></svg>
    1. 插入DOM阶段:浏览器解析SVG并立即触发<image>onload事件。

    2. 事件触发是异步的:即使后续通过removeAttribute删除了onload属性,但事件回调已经在事件队列中等待执行。

    3. 执行顺序

      root.innerHTML = data;       // 插入SVG,触发onload(事件进入队列)
      deleteAllAttributes();       // 删除onload属性
      // 事件队列中的回调仍会执行!

技术细节

  • 事件绑定与属性无关onload="..."内联事件处理函数,浏览器在解析HTML时会直接将其转换为事件监听器,而不是依赖属性存在与否。

  • 属性删除仅移除了HTML特性,但无法撤销已经注册的事件回调。


复现对比实验

场景1:单SVG(失败)
// 插入内容:<svg><image onload="alert(1)"></svg>
root.innerHTML = data;
// 浏览器解析SVG,触发onload(事件进入队列)
deleteAllAttributes(); 
// 事件回调尝试执行时,发现image元素已无onload属性,可能被浏览器忽略
场景2:双SVG(成功)
// 插入内容:<svg></svg><svg><image onload="alert(1)"></svg>
root.innerHTML = data;
// 第一个SVG解析完成(同步)
// 解析第二个SVG时,可能已进入异步队列
deleteAllAttributes(); 
// onload事件在删除前已绑定,回调执行成功

防御建议:

  1. 彻底禁用 innerHTML
    document.body.textContent = data;
    
  2. 使用 DOMPurify 进行过滤
    import DOMPurify from 'dompurify';
    root.innerHTML = DOMPurify.sanitize(data, { FORBID_ATTR: ['onload', 'onfocus'] });
    
  3. 隔离 SVG 解析
    const svgContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    svgContainer.innerHTML = data;
    

http://www.dtcms.com/wzjs/824015.html

相关文章:

  • 生活家装饰小红书seo排名
  • 深圳 响应式网站建设西安社动网站建设
  • 网站在那里沈阳正规的男科医院排名
  • 荥阳网站建设公司哪家好代刷网站推广
  • 太和县建设局网站设计师网站赚钱
  • 河南网站建设首选公司西宁网站seo外包
  • 技术支持 东莞网站建设家装外网访问wordpress全站路径设置
  • 网站提高内容的丰富度创意灵感素材库
  • 网站建设是指襄阳seo优化排名
  • 核酸检测最新消息网页关键词优化难度
  • 做网站的需要什么软件河北网站制作公司哪家好
  • 做更好的自己 网站易语言如何做网站
  • 都有什么类别的网站免费网络电话无限打
  • wordpress+远程缓存青岛做网站优化哪家好
  • 建设视频网站流量网站建设方面的优劣势分析
  • 深圳龙岗建站公司网站制作中搜索栏怎么做
  • 宁波网站搭建公司html5网站实例
  • 建设网站五个步骤近一周财经新闻热点
  • 酒店网站建设栏目分析wordpress4.9+多站点
  • 迪庆北京网站建设闵行品划网站建设公司
  • 做广告在哪个网站做效果人流最多免费论文网站大全
  • 网站大图怎么做更吸引客户网站空间文件删不掉
  • 景区智慧旅游网站建设360如何做网站优化
  • 简单的美食网站模板免费下载wordpress木马乐主题
  • 厦门网站建设优化自己做app
  • 程序员外包网站惠州室内设计公司排名
  • 青秀网站建设seo优化报告
  • 网站开发的过程中遇到的难题wordpress 手机 写文
  • 如何买域名发布网站专业做化妆品外包材的招聘网站
  • 做网站到八方资源网怎么样房地产查询官网