Node¶
WEB · 语言专题。Node.js 服务端与 npm 生态攻防。标签:命令执行、语言特性、原型链污染、大小写特性、VM沙箱逃逸、模板注入。
触发特征¶
X-Powered-By: Express、connect.sid、npm/package.json泄露、JS 为主的前后端同构应用。
语言特性¶
- 弱等与 NaN:
x!=x判 NaN、[]+{}拼接特性、parseInt前导解析。 - 大小写特性:
req.headers键全小写化;路径判断toLowerCase()后与原始路径不一致 → 绕过(turkish-I 类区域设置坑);正则i标志下的k字符 (\u0130) 特例。 Object.assign/lodashmerge/defaultsDeep递归合并 → 原型链污染入口。child_process参数数组化差异;eval/Function动态执行面。- Buffer/
toString('latin1')编码错位用于 CRLF 注入(Uvicorn 等 N-Day 同类思路)。
原型链污染¶
- Payload:
{"__proto__":{"isAdmin":true}}、constructor.prototype(防御了__proto__时换道)。 - 常见向量:JSON body 递归合并、
qs/body-parser嵌套参数、path参数对象。 - 已知漏洞库:flatnest 循环引用绕过(CVE-2023-26135)、lodash merge 系列、jquery
$.extend(true,...)。 - Gadget 链:污染后劫持库配置 → RCE,如 Lodash 污染到 Pug AST 注入(VuwCTF 2025)、
NODE_OPTIONS环境变量注入、EJSoutputFunctionName、Handlebars 模板编译选项。 - 检测:
(new Error()).__proto__或 GET 参数?__proto__[polluted]=1后验证全局对象。
VM沙箱逃逸¶
vm.runInNewContext(code)逃逸经典:this.constructor.constructor('return process')().mainModule.require('child_process')。vm2新版与 ESM 场景:CVE-2025-61927 类 ESM 兼容逃逸;CommonJSrequirehook 逃逸;happy-dom 环境document.write的作用(vm 沙箱与宿主交互面)。- 完整链:原型链污染 → VM 逃逸 → RCE(4llD4y);沙箱内
process不可得时用Buffer.prototype链或异常对象链。 Function/setTimeout字符串执行本身就是隐式 eval,常作为逃逸跳板。
模板注入¶
- EJS:
<%= 7*7 %>探测;RCE 走settings['view options']污染或locals对象。 - Pug/Nunjucks/Handlebars:AST 注入、
lookupGettergadget;Nunjucks{{range.constructor("return global.process.mainModule...")()}}。 - 模板 + 原型链污染组合是 Node 题的主流难度分层。
命令执行杂项¶
child_process.exec字符串拼接 → 命令注入(分号、反引号、$());execFile数组参数注入文件名。--inspect调试端口暴露 → 直接 RCE;node-serialize反序列化"_$$ND_FUNC$$_"IIFE 执行。