原文链接 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 删除。