XCTF Leaking
[HITCON2016]Leaking
- 題目
- 淺談Node.js沙盒逃逸
題目
原題目來自HITCON 2016
題目如下
由于我還是個小白,經過漫長的翻查php手冊和查閱一些大佬的博客得知這是一題是關于Node.js沙盒逃逸的。其中var { VM } = require(“vm2”);是Node.js有關沙盒的代碼。在查閱大佬文章得知:在較早一點的 node 版本中 (8.0 之前),當 Buffer 的構造函數傳入數字時, 會得到與數字長度一致的一個 Buffer,并且這個 Buffer 是未清零的。8.0 之后的版本可以通過另一個函數 Buffer.allocUnsafe(size) 來獲得未清空的內存。
然后通過腳本,找到內存泄漏時執行的eval()函數,得到flag。
淺談Node.js沙盒逃逸
VM簡介
在一些日常開發中有時候為了追求靈活性或降低開發難度,會在業務代碼里直接使用 eval/Function/vm 等功能,其中 eval/Function 算是動態執行 JS,卻無法屏蔽當前執行環境的上下文,但 node.js 里提供了 vm 模塊,相當于一個虛擬機,可以讓你在執行代碼時候隔離當前的執行環境,避免被惡意代碼攻擊。
官方文檔原話:一個常見的用例是在不同的 V8 上下文中運行代碼。 這意味著被調用的代碼與調用的代碼具有不同的全局對象。可以通過使對象上下文隔離化來提供上下文。 被調用的代碼將上下文中的任何屬性都視為全局變量。 由調用的代碼引起的對全局變量的任何更改都將會反映在上下文對象中。
逃逸原理
苦于我還是初學者,對于js的代碼不是特別了解,于是到網上找到一段逃逸示例的講解:
以上代碼示例中的this指向ctx并通過原型鏈的形式拿到沙盒外的Funtion實現逃逸,并執行逃逸后的JS代碼。JS 里所有對象的原型鏈都會指向Object.prototype,且Object.prototype和Function之間是相互指向的,所有對象通過原型鏈都能拿到Function,最終完成沙盒逃逸并執行代碼。逃逸后代碼能夠執行如下代碼拿到 require,從而并加載其余模塊性能
const vm = require("vm"); const ctx = {console, }; vm.runInNewContext(`var exec = this.constructor.constructor;var require = exec('return process.mainModule.constructor._load')();console.log(require('fs')); `,ctx );沙盒執行上下文是隔離的,但可通過原型鏈的形式獲取到沙盒外的 Function,從而實現逃逸,拿到全局數據。
參考文章來源:
node.js 沙盒逃逸分析
xctf攻防世界Leaking wp
總結
以上是生活随笔為你收集整理的XCTF Leaking的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MIT6.824-lab4B-Shard
- 下一篇: NVMe技术基础知识