Flask 内存马从初识到进阶 - 兼容新版 Flask 的内存马打法
内容提要
本文探讨了如何利用 Flask 中的 SSTI 漏洞动态添加后门路由以执行命令。通过分析不同版本的 Flask,提供了兼容新版的 payload,简化了攻击过程,避免了反弹 shell 的复杂性,并使用 eval 执行代码注册后门路由。
延伸解读
Flask 版本兼容性问题
在使用 Flask 内存马时,需注意不同版本之间的兼容性。新版 Flask 对 app.add_url_rule 的调用限制,要求在处理第一个请求前完成路由注册。这意味着攻击者需要对 Flask 的内部机制有深入了解,以避免因版本不兼容而导致的攻击失败。
动态路由的风险
动态添加后门路由虽然简化了攻击过程,但也带来了潜在风险。攻击者必须确保 payload 的有效性和隐蔽性,避免被 WAF 等安全机制检测到。此外,使用 eval 执行代码可能引发安全隐患,需谨慎处理输入参数,防止注入攻击。
环境限制与反弹 shell 的复杂性
反弹 shell 的实现通常受到网络环境和服务器配置的限制,尤其是在 Docker 等隔离环境中。因此,利用内存马的方式可以绕过这些限制,直接在 Flask 应用中执行命令,降低了攻击的复杂性和失败风险。
Q&A
Flask 中的 SSTI 漏洞是什么?
SSTI 漏洞是指在 Flask 应用中,攻击者可以利用模板引擎的特性执行任意代码,从而动态添加后门路由以执行命令。
如何在 Flask 中动态添加后门路由?
可以通过 SSTI 或其他 RCE 漏洞,使用 eval 执行代码,调用 app.add_url_rule 动态添加后门路由。
新版 Flask 中使用内存马的限制是什么?
在新版 Flask 中,app.add_url_rule 不能在处理第一个请求后调用,需要将 app._got_first_request 修改为 False 才能继续添加新的路由。
如何编写兼容新版 Flask 的 payload?
可以使用 gc 模块遍历 Python 中的所有对象找到 app 对象,并通过 eval 执行代码注册后门路由,确保 payload 兼容性。
使用内存马的主要优势是什么?
使用内存马可以避免反弹 shell 的复杂性,不需要公网服务器,直接在 Flask 服务端执行命令。
如何绕过 WAF 生成 payload?
可以使用 fenjing 工具生成绕过 WAF 的 payload,通过定义黑名单关键字来避免被检测。