小众SSTI能免杀吗?聊聊我踩过的那些坑
说实话,最近老有人在群里问我这个问题——小众SSTI能免杀吗?我一开始还真没太当回事儿,后来问的人多了,我自己也跑去折腾了一圈,今天就把我这些天的心得跟大伙儿唠唠,纯属个人经验啊,别拿我当什么权威。

先说说我为啥会关注这个,前阵子做渗透测试的时候,碰到一个挺冷门的模板引擎,市面上那些主流的WAF规则基本没覆盖到它,我当时就琢磨,这是不是就意味着小众SSTI天然比那些大众的模板注入更容易绕过检测?带着这个疑问,我专门做了几组对比测试,结果还挺有意思的。
小众SSTI到底“小众”在哪
其实所谓小众SSTI,说白了就是指那些用的人不多、语法比较偏的模板引擎,比如某些Go语言生态里的模板、某些冷门CMS自带的渲染组件之类的,这些东西的特点就是——特征库收录少、国内玩的人更少、公开的payload就那么几篇博客翻来覆去,你跟我说这种小众SSTI能免杀吗?我第一反应是:特征少,理论上确实比Twig、Freemarker那些被规则盯得死死的好过一点。
但!是!别高兴太早啊兄弟们,免杀这事儿从来不是单纯看“特征多不多”,而是看目标环境到底部署了什么,我实测下来发现,很多所谓“免杀”其实只是躲过了静态规则,一旦上到行为检测层面,该露馅还是露馅。
我实测的几个观察
第一个观察:语法越怪,编码变形空间越大,我拿一个冷门引擎试了下,把payload拆成多段拼接、混入无意义变量名,WAF那边确实没报,这时候我心想——嘿,小众SSTI能免杀吗?好像真有点戏?
第二个观察:但是一上动态沙箱,难度陡增,有些环境会对渲染结果做二次检查,这时候你语法再小众也没用,因为检测的是“最终执行了什么”,而不是“你写了什么语法”,我折腾了大半天,最后还是老老实实换思路。
第三个观察:版本差异特别关键,同一个小众引擎,老版本和新版本的解析行为完全不一样,有时候你以为绕过了,其实只是人家压根没解析你那段,这一点我觉得比“免不免杀”本身更值得注意——别把“没生效”误判成“免杀成功”了,我吃过这个亏(笑)。
再说点掏心窝子的话
我知道很多人问小众SSTI能免杀吗,其实背后是想找个“一劳永逸”的绕过方案,但说实话,安全对抗是持续博弈,今天能过不代表明天能过,与其纠结某个payload能不能免杀,不如把精力放在理解引擎的解析机制上——你越懂它,绕过思路就越自然。
另外提醒一句啊,这些东西拿来搞授权测试、打靶场没问题,别拿去干不该干的事儿,真出事了我可担不起这责任哈。
总结一下吧
回到最初那个问题——小众SSTI能免杀吗?我的答案是:有一定概率能绕过部分静态检测,但别指望稳定“免杀”,动态行为检测那关不好过,而且场景差异极大,与其追求“免杀”这个虚名,不如老老实实做环境适配测试。
好了,今天就唠到这儿,有不同意见的欢迎来评论区掰扯,觉得有用的话顺手点个赞呗,后面我再整理一篇具体引擎的测试记录,感兴趣的记得关注一下~
(本文仅用于安全研究与授权测试场景,请勿用于非法用途。)