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

SVG利用+xssgame第8关注入详解

1.SVG利用实现xss攻击

 1.如下代码所示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
</head>
<body>
    
</body>
<script>
    const data = decodeURIComponent(location.hash.substr(1));
    const root = document.createElement('div');
    root.innerHTML = data;

    for (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>
</html>

代码解析: location:JavaScript 的 window 对象的属性,表示当前页面的 URL。随后进行了div标签创建,innerHTML讲data的数据插入root当中,for循环获取所有的元素,会将payload当中所有的属性删除

图中可见,删除了所有的属性

但是在使用两个svg标签之后,payload却成功执行,这是为什么呢?

经过代码断点调试发现在 root.innerHTML = data; 这一行中就已经执行了payload进行了xss弹窗,这其实与svg标签的命名空间有些关系  Embedded Content — SVG 2

浏览器发现 <svg> 标签后,会根据 HTML 标准中的 SVG 解析规则,创建一个 SVG 命名空间的元素。此时,解析器切换到 SVG 解析模式,后续内容(包括子元素)将按照 SVG 规范处理。所以此时会按照svg规范进行处理,内部的这个 <svg> 并不是普通 HTML 中的 <svg>,它是在 SVG 命名空间下 解析的,仍然是一个 SVG 元素。它的 onload 属性被识别为 SVG 事件,并且立即执行 alert(1)。在 SVG 解析上下文 中,浏览器对 SVG 元素的行为有特殊处理:SVG 的某些事件(如 onload)在浏览器解析到该元素时,立即绑定并触发,无需等待元素插入文档(document.body)。解析阶段的即时执行:内层 <svg onload=alert(1)> 在解析阶段被浏览器识别为 SVG 元素,其 onload 事件会在属性被后续代码移除前触发。   所以利用两个svg标签可以进行该代码缺陷的xss漏洞。

2.xssgame第7关详解

网站链接:XSS Game - Learning XSS Made Simple! | Created by PwnFunction

 

 代码分析,对payload进行了长度和特殊字符进行了限制以及对alert也进行了限制,因为对alert也进行了过滤,此时第一种想法是结合前面学的location,获取当前页面的url

解法一:

eval(location.hash.slice(1))#alert(1)

使用location特性获取本页面url地址,使用slice进行#号后的字符串截取,之后弹窗成功

 解法二:

Function构造函数,Function() 构造函数创建 Function 对象。直接调用构造函数可以动态创建函数,与eval()函数相似

Function("alert(1)") 创建了一个新的函数,等价于:

function anonymous() {

alert(1);

}

因为过滤了alert所以可以在构造函数的时候使用大写ALERT再进行转小写

Function(/ALERT(1)/.source.toLowerCase())()

()表示立即执行该函数

3.xssgame第8关详解

 DOMPurify 是一个用于清理恶意输入的库,它会从输入的 HTML 字符串中删除潜在的恶意代码,从而防止 XSS 攻击。所以平时我们使用的标签在这里都会被过滤清除,但是真的没有任何办法了吗?

在GitHub上找到该项目源码及白名单

通过官方文档可以查到setTimeout()这个函数只能执行一个函数或指定的代码片,不能为一个对象 

 

 我们可以伪造一个ok,然后利用setTimeout执行我们的代码,而刚好setTimeout拿到ok时,会自动调用toString方法去执行我们标签后面的属性,a标签在alert函数中会自动调用toString方法

结合之前的白名单构造正确的payload:

boomer=<a id="ok" href="mailto:alert(1)">

 

相关文章:

  • 裂缝识别系统 Matlab GUI设计
  • C# Unity 唐老狮 No.10 模拟面试题
  • 路由器与防火墙配置命令
  • QT5.15.2加载pdf为QGraphicsScene的背景
  • Matlab 汽车传动系统的振动特性分析
  • Elasticsearch 滚动索引(Rollover Index)详解
  • 算法基础篇(蓝桥杯常考点)
  • ZED X系列双目3D相机的耐用性与创新设计解析
  • SpringCloud 学习笔记2(Nacos)
  • AMBA-CHI协议详解(二十三)
  • vue2:el-table列中文字前面加icon图标的两种方式
  • AI自动获客系统源码
  • 【LangChain】理论及应用实战(5):Agent
  • Linux 入门:权限的认识和学习
  • 非常优秀的1个软件,再也不求人了!
  • DBA(数据库管理员)常用的 Linux 命令
  • Unity教程(二十二)技能系统 分身技能
  • 居家养老老年信息大数据分析基于SpringBootSSM框架
  • 实现回车键自动登录功能:Vue 2 和 Vue 3 的解决方案
  • 力扣No.673.最长递增子序列的个数
  • 轿车追尾半挂车致3死1伤,事故调查报告:司机过分依赖巡航系统
  • 观察|印巴交火开始升级,是否会升级为第四次印巴战争?
  • 中方对原产印度进口氯氰菊酯实施反倾销措施,商务部回应
  • 潘功胜:坚定支持汇金公司在必要时实施对股票市场指数基金的增持
  • 吴清:推动公募基金高质量发展的行动方案今天将会发布
  • 心期末后有人传——《钱谦益年谱长编》在钱氏故里首发