必读模板注入提权成功!我折腾三天三夜,终于搞懂了这该死的漏洞
兄弟们,我悟了!
哎,说到这个“必读模板注入提权成功”,我真的是又爱又恨啊!爱的是——终于搞定了,恨的是——为毛我一开始没早点看到这个模板?!

事情是这样的,前两天接了个项目,目标系统看着平平无奇,就是个内容管理系统,我按照老套路,先扫目录、测注入、翻源码,折腾了半天屁都没发现,正当我准备放弃的时候,嘿!突然想起来之前看过的一个思路——模板注入!
一开始我还在想:模板注入?啥玩意儿?
说真的,模板注入(SSTI) 这东西,我以前真没当回事儿,总觉得就是程序员写代码不严谨,把用户输入直接拼到了模板里,能有多大危害?结果呢?真香定律来了!
我抱着试试看的心态,往目标URL的某个参数里塞了个${7*7},结果页面居然显示了个49!!!当时我差点把水杯碰倒——我的天呐!这系统居然用的是Jinja2模板引擎!这意味着什么?意味着我可以直接执行Python表达式啊!
一步步走向提权成功
既然确认了模板注入,那接下来的思路就清晰多了,我先用{{ config }}试了试,好家伙,直接把应用的配置信息全给我吐出来了!数据库连接字符串、密钥、还有内网IP……这信息泄露得也太豪爽了。
不过光看配置有啥用?我要的是提权成功!于是我赶紧去翻那个“必读模板” —— 没错,我在网上找到了一份专门讲模板注入提权的笔记,里面写了各种引擎的payload,照着上面的方法,我构造了一个{{ ''.__class__.__mro__[2].__subclasses__() }}的payload,把内存里的所有类对象全调出来了!
找到一个可以利用的类后,我试着调用os.popen('whoami'),结果直接返回了root!!!哇靠,这台服务器居然是root权限跑的!那一刻,我的手都在发抖,心跳直接飙升到180!
必读模板的核心技巧分享
现在冷静下来,我给你们总结下我能提权成功的关键,就在这个必读模板里:
- 确定模板引擎:不同引擎(Jinja2、Twig、Freemarker)payload不一样,第一步必须判断清楚
- 寻找可利用的类链:利用
__mro__、__subclasses__()遍历所有类,找到能RCE的“桥梁” - 读取配置文件:通常配置里藏着数据库密码、密钥,这些对后续提权至关重要
- 命令执行的姿势:优先尝试
os.popen、subprocess这些模块
老实说,如果没有那份必读模板,我自己瞎试可能得整到猴年马月去,它把每个引擎的利用链、过滤绕过方法都整理得明明白白,简直是渗透界的“葵花宝典”啊!
最后的感慨
说实话,这次能提权成功,运气成分占了一半,但要是没有必读模板的指点,我估计还在那瞎猫碰死耗子呢!
给你们个建议哈:搞模板注入千万别死脑筋,多准备几套payload轮番试,而且稍微留意下你提交的数据在页面上是怎么被渲染的 —— 是直接输出还是经过某种处理,这直接影响利用难度!
好啦,今日份装逼完毕!我得赶紧去写报告了,老板催着呢!下次有空再给你们聊聊过滤绕过的骚操作!
祝各位也能早日提权成功!加油,打工人! ♂️