今天來解這個的後面 3 題,希望可以順利解決!
Google XSS Game - AppSpot
這題是一個計時器,送出數字之後會開始算時間
timer.html
的 21 行:
<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
這是 timer
這個參數傳入的地方,我們嘗試注入第二個指令:');alert('
此時上面那行的 onload
會執行:
startTimer('');alert('');
成功觸發 XSS!
首先看到歡迎頁面,我們點擊 Sign up
會進到一個可以填寫 Email 的頁面:
從 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 了,頁面載入完成後會看到一句 Couldn't load gadget from /static/gadget.js
,除此之外沒有什麼可以注入參數的地方
我們到這題還沒有用到提示,來看看提示告訴我們什麼~
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
看完這邊的大家如果有什麼想看的主題可以許願看看,如果對我來說不會太難的話,說不定有機會出現在後面的篇幅!