[HITCON 2016]Leaking-nodejsVM沙箱逃逸
[HITCON 2016]Leaking
最近想學下nodejs相關的題目,所以去buu上又找了一道來做
進入題目后如上圖所示,直接給出了源代碼,老樣子,拿出之前收藏的nodejs相關安全問題來對比著看看,我發現這里用了VM沙箱,那最有可能考的就是VM逃逸了
emem由于之前沒做過,說實話,光看這個完全不知道該怎么做,還是老實找個大佬的WP來看看吧
那我們先來分析下代碼,下面這段代碼是整道題的核心
首先是這一段,看注釋也能知道,這里生成了flag
if (req.query.data && req.query.data.length <= 12) {var vm = new VM({timeout: 1000});console.log(req.query.data);res.send("eval ->" + vm.run(req.query.data));接下來是這一段,對我們傳入data參數的值進行判斷長度是否小于等于12,如果符合則會放到沙箱里去執行,這里可以用數組繞過
這里就得說說這道題的考點了,這里涉及到的是nodejs的遠古內存分配問題,nodejs在遠古版本(Node.js v5.4.1/v4.2.4)中的Buffer分配是就著以前用過的內存分配的,并且分配完了還不會初始化一下,也就意味著之前加載進內存然后被回收掉的內存位置可能被再次分配出來,并且還不會被初始化,原始數據還保留在那。這位外國老哥在這里分析了原理
所以如果使用new Buffer(size)或其別名Buffer(size))創建,則對象不會填充零,而只要是調用過的變量,一定會存在內存中,所以需要使用Buffer()來讀取內存,使用data=Buffer(9999)分配一個9999的單位為8位字節的buffer,因此很容易得到姿勢
這里寫個腳本
import requestssession = requests.Session() session.trust_env = False while True:response = session.get('http://24225844-3e1f-469b-b6bc-343124db15d5.node4.buuoj.cn:81/?data=Buffer(9999)')if "flag" in response.text:print(response.text)break
最后再提一下這題的考點
在較早一點的 node 版本中 (8.0 之前),當 Buffer 的構造函數傳入數字時, 會得到與數字長度一致的一個 Buffer,并且這個 Buffer 是未清零的。8.0 之后的版本可以通過另一個函數 Buffer.allocUnsafe(size) 來獲得未清空的內存。
參考文章:
https://y4tacker.blog.csdn.net/article/details/114003419?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-5.control
https://blog.z3ratu1.cn/%E5%88%B7%E9%A2%98%E5%88%B7%E9%A2%98.html
總結
以上是生活随笔為你收集整理的[HITCON 2016]Leaking-nodejsVM沙箱逃逸的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TKDE2022 | 知识图谱质量控制综
- 下一篇: 上传图片到指定路径