iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0

前言

今天來解這個的後面 3 題,希望可以順利解決!
Google XSS Game - AppSpot

Write-up

Level 4/6

這題是一個計時器,送出數字之後會開始算時間
https://ithelp.ithome.com.tw/upload/images/20230923/20162615aOOBaMm72Z.png

timer.html 的 21 行:

<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />

這是 timer 這個參數傳入的地方,我們嘗試注入第二個指令:');alert('
此時上面那行的 onload 會執行:

startTimer('');alert('');

成功觸發 XSS!

Level 5/6

首先看到歡迎頁面,我們點擊 Sign up 會進到一個可以填寫 Email 的頁面:
https://ithelp.ithome.com.tw/upload/images/20230923/20162615yeaWpe3xO3.png

level.py 的 11 到 13 行可以看到,網址中的 next 參數決定了底下那個 Next >> 超連結的效果:

level.py L11~L13

    if "signup" in self.request.path:
      self.render_template('signup.html', 
        {'next': self.request.get('next')})

signup.html L15

    <a href="{{ next }}">Next >></a>

如果有讀者不認識這種語法的話,它是一個叫做 Jinja 的模板引擎,一些 Python 的框架(例如 Flask)都有使用這個引擎來渲染
Docs: https://jinja.palletsprojects.com/en/3.1.x/

那我們如何讓 <a> 的 tag 可以執行 js 語法呢?MDN 的文件提到 href 中可以放 mailto:, tel: 這類的 URL,我們再往下可以看到可以 onclick events 這節中提到用 href 搭配 javascript:void(0) 可以讓超連結按下去不刷新頁面,我想這應該對我們有幫助,嘗試把參數改成這樣:
?next=javascript:alert();

點擊下面的 Next >>,成功通關 XD

找了一下資料,這個 javascript: 有人稱呼它為 pseudo protocol,詳情推薦大家看看 Huli 大大的文章:接觸資安才發現我不懂前端

Level 6/6

終於來到最後一個 Level 了,頁面載入完成後會看到一句 Couldn't load gadget from /static/gadget.js,除此之外沒有什麼可以注入參數的地方
https://ithelp.ithome.com.tw/upload/images/20230923/201626152U88WHamlZ.png

我們到這題還沒有用到提示,來看看提示告訴我們什麼~

1. See how the value of the location fragment (after #) influences the URL of the loaded script.

但你們從圖上可以看到,URL 在載入完都會變成 [object Object] XD
多 F5 了幾次,總之 URL 應該是長這樣:
https://xss-game.appspot.com/level6/frame#/static/gadget.js

提示說 # 後面的值影響載入的腳本,這個部分在 index.html 中 44 到 46 行可以找到,接著我們一次把提示按完,反正後面沒了,第 4 點是個有用的資訊

4. If you can't easily host your own evil JS file, see if google.com/jsapi?callback=foo will help you here.

我們回來看看 index.html 中 20 到 25 行的檢查:

      // This will totally prevent us from loading evil URLs!
      if (url.match(/^https?:\/\//)) {
        setInnerText(document.getElementById("log"),
          "Sorry, cannot load a URL containing \"http\".");
        return;
      }

這個 regex 寫的相當寬鬆,我們試試把提示的連結帶進去,但不帶協定:
https://xss-game.appspot.com/level6/frame#//google.com/jsapi?callback=foo

這次沒有跳錯誤了,gadget 成功載入:Loaded gadget from google.com/jsapi?callback=foo

我們試試把後面的 callback 改成 alert,居然成功通關了 XD,但其實我找了一下資料,還有別種解法,大概是長這樣:
data:text/plain,blabla...

這個東西相信寫 Web 的人應該不陌生,常見於 base64 圖片之類的東西:
data:image/png;base64,...
它稱為 Data URLs,同樣可以在 MDN 上找到文件。

這次我們來試試這招,帶到網址中長這樣:
https://xss-game.appspot.com/level6/frame#data:,alert();

效果相當於我們嵌入了一個 alert(); 的 js 檔,再次成功通關🥳

後記

XSS 的型態實在很多變,也還好順利的把 6 題都解開了。一連寫了好幾天文章,給自己適度的休息也是很重要的,所以明天的主題我明天再想 XD

看完這邊的大家如果有什麼想看的主題可以許願看看,如果對我來說不會太難的話,說不定有機會出現在後面的篇幅!


上一篇
Day 8. Web Security - XSS 實戰(上)
下一篇
Day 10. Web Security - CSRF 介紹
系列文
進了資安公司當後端 RD 才入門資安會不會太晚了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言