NodeJS 安全
1 NodeJS 基础
1.1 定义与原理
是开源的跨平台运行时环境。有了它,开发人员可以使用JavaScript创建各种服务器端工具和应用程序。此运行时应在浏览器上下文之外使用(即可以直接在计算机或服务器操作系统上运行)。1.2 常见框架
Express是最受欢迎的节点框架,是许多其他流行节点框架的基础库。尽管Express本身是极简主义者,但开发人员通过创建各种兼容的中间件软件包来解决几乎所有的Web开发问题。这些库可以实现cookie,会话,用户登录,URL参数,帖子数据,安全标头和其他功能。特征:
使用不同的URL路径中的不同HTTP动词为请求(路由)编写处理程序。
集成的“视图”渲染引擎通过将数据插入模板中产生响应。
设置通用的Web应用程序设置,例如用于连接的端口以及构成响应模板的位置。
在请求处理管道中的任何地方添加其他请求处理“中间件”。
1.3 Node 环境
1.3.1 基础环境
下载地址:https://nodejs.org/en/从Helloworld程序开始
1
2
3
4
5
const http=require('http');
http.Createserver((REQ,RES)={
res.writehead(200,{'content-type':'text/plain'});
res.end('Hello World \ n');
})。听(80);

1.3.2 Express 环境简介
安装1
NPM安装Express
从Helloworld程序开始
1
2
3
4
5
6
7
8
9
10
const express=require('express');
const app=express();
app.get('/hello',(req,res)={
res.send(“ Hello World”);
});
app.listen(80,()={
console.log('听80');
});
2 Express 及其组件
2.1 路由模块
路由的函数是解析URL,调用相应的控制器(方法和通行参数)。客户的请求以URL的形式传递给服务器。在传统的Web开发中,URL对应于服务器目录中的文件。 MVC开发改变了这一信件。 Web服务器将拦截所有请求,不执行资源存在检查,然后将其直接转发到网站的路由程序。
路由器然后调用相关控制器。控制器调用相关服务并返回视图对象。然后,路由器从视图对象提取生成的网页代码并将其返回到Web服务器,并最终将其返回到客户端。
例如:
下载
1
2
3
4
5
6
7
8
9
10
11
const express=require('express');
const router=express.router();
router.get('/',(req,res)={
res.send('下载页面');
});
router.get('/docs',(req,res)={
res.send('下载页文档');
});
模块。Exports=路由器;
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express=require('express');
const app=express();
const download=require(__ dirname +'/download.js');
app.use('/download',下载);
app.get('/',(req,res)={
res.send(“ Hello World”);
});
app.get('/news',(req,res)={
res.send('新闻页面');
});
app.listen(80,()={
console.log('听80');
});
app.use表示所有路线和所有方法都调用中间功能。
app.get(’/’)是指在获取方法开始时将中间函数调用到URL
app.use(“ /download”)是指在/下载标题上调用中间功能。

2.1 中间件
中间件已被广泛用于快递应用程序。大多数应用程序都使用第三方中间件来简化常见的Web开发任务,例如Cookie,会话,用户身份验证,访问请求发布和JSON数据,日志记录,压缩HTTP响应等。引入某些中间件的顺序很重要(例如,如果会话中间件取决于cookie中间件,则必须首先添加cookie处理器)。在大多数情况下,必须先调用中间件然后设置路由,否则路由处理器将无法访问中间件的功能。摩根是伐木中间件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const express=require('express');
const app=express();
const download=require(__ dirname +'/download.js');
const logger=require('Morgan');
app.use(logger('dev'));
app.listen(80,()={
console.log('听80');
});
app.use('/download',下载);
app.get('/',(req,res)={
res.send(“ Hello World”);
});
app.get('/news',(req,res)={
res.send('新闻页面');
});
中间件和路由函数是按照声明顺序调用的
2.2 渲染
PUG模板引擎是一种健壮,灵活且功能丰富的HTML模板引擎,专门为节点平台开发。哈巴斯被玉改名。通过凹痕编写代码的过程(代表标签之间的嵌套关系)。在编译过程中,无需考虑是否关闭标签。
pugdemo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express=require('express');
const app=express();
const路径=require('path');
app.listen(80,()={
console.log(“在80'上听);
});
app.set('views',path.join(__ dirname,'views'));
app.set('视图引擎','pug');
app.get('/',function(req,res){
res.render('index',{title:'Hello',Message:'Hello World Pug Engine'})
}))
视图/index.pug
1
2
3
4
5
html
头
标题=标题
身体
H1=消息

3 威胁分析
3.1 常见漏洞
代码执行,命令执行,XSS,SQL注入,SSRF,文件上传Nodejs可以保护某些经典的Web漏洞,而在其他语言中,某些漏洞并不明显。但这在nodejs中更为突出。
需要链条劫持(软件中毒),正则表达拒绝服务(重做),不安全的软件包。
3.2 代码审计
3.2.1 项目结构

3.2.2 审计依赖
NSP是检测软件包依赖项的工具。获得后,在NPM=6.0.0中使用以下说明:1
2
NPM审核
NPM审核修复

3.2.3 不安全的对象直接引用
12
3
4
5
6
7
8
9
函数isadmin(req,res,next){
if(req.user.role=='admin')//检查帐户用户是否为admin
返回next();
//如果没有,错误
res.redirect('/403');
}
app.get('/admin',isadmin,function(req,res){
res.send('Secret');
});
3.2.4 敏感信息泄露
12
3
app.use(function(err,req,res,sext){
res.status(500).send(err.stack);
}))
3.2.5 未经验证的重定向和转发
SSRF1
2
3
4
5
6
7
app.use('/redirect',function(req,res){
请求(req.query.url,函数(错误,响应,身体){
如果(err){
返回res.send(body);
}
}))
}))
3.3 安全配置
Helmet0X框架选项提供单击劫机保护
XSS保护支持最新网络浏览器中内置的跨站点脚本(XSS)过滤器
x-content-type-options可防止浏览器从声明的内容类型中嗅出响应
内容- 安全性- 可防止各种攻击,包括跨站点脚本和其他跨站点注射
4 常见问题
4.1 XSS
12
3
sudo docker pull注册表
sudo docker run -d -p 0.0.0.0.0:3288888:80 igemistry.cn-shanghai.aliyuncs.com/yhskc/yhskc/chatsys
哈哈XS
练习一:

逃脱的输出,因此无法绕过
练习二:

使用Unescaper方法,因此只需直接使用定期有效载荷

练习三:

在脚本标签中,您可以通过直接使用XSS,有效载荷:1; arter(1)来使用在行中缝线的方法

练习四:

它仍然是不浮标的,只需直接拼接

练习五:

发现它过滤了敏感的字符,例如角括号,警报和分号。

用JSFUCK旁路过滤
1
[] [(![]+[])[+[]+([![]+[]+[] [[]])[+!+[]+[+[+[]]+(![]+[]+[])[!+[]+[]+!+[]+[]+(! []+[]+[]+[]+ []]+(! []+[])[!+[]+!+[]+!+!+[]+(! []+[])[+!+[]] ]])[+!+[]+[+[]+(![]+[])[!+[]+!+[]]+(! []+[])[+[]+[]+(! []+[]+[])[ +[]+!+[]]+(! []+[])[!+[]+!+[]]+(! []+[])[!+[]+[]+[]+[])[!+[]+[]+[]]+ [+!+[]+[+[]+(![]+[])[!+[]+!+!+[]+(! []+[])[+[]+(! []+[]+[]+[]+[]+[]+!+[]+[]+[]+[] +[]+(! []+[])[+!+[]+(![]+[])[!+[]+!+[]+]+]+(![]+[]+[])[!+[]+[]+!+[]+!+!+[]+[]+(![]]+(![]] ![]+[])[+[]+(! []+[])[+!+[]+(]+(] [] [] []+[])[+[]+(]+(] [] [] [(![]+[]+[+[+[]+(! ]]+[]]+[]+(![]+[])[+!+[]+[]+(![]+[])[!+[]+!+[]+[]+(! []+[]+[]+[])[!+[]+!+[]+ (! []+[])[+!+[]+[])[!+[]+!+[]+!+[]]+(! []+[])[+[+[]+[]+[]+(! []+[]+[] ])[+[]+[]]+(![]]+[]+[])[+[]+[]]+(![]]+[])[+!+[]+[]+[]+[]+(![]+[]+[])[! +!+[]+!+[]]+(! []+[])[+!+[]])[+!+[]]+(! []+[])[+!+[]]]+(![]+[]+[]+[+!+[]+(]+( ![]+[])[+!+[]]+(! []+[])[!+[]+!+[]]+(! []+[])[!+[]+!+!+[]]+(! []+[]+[]+[]+[+!+[]+ ]+(![]+[] [(![]+[])[+[]+[]+[]+([![![]+[]])[+!+[]+[]+[]+(![]+[]+[]+[]+[]+[]+[]+[]+(!] []]+(! []+[] [(![]+[])[+[]+([![![]+[]+[]])[+!+[]+[]+[]+(![]+[]+[]+[]+[]+[]+[]+[]+(!] []+]+(! []+[])[!+[]+!+[]])[!+[]+!+[]+[]+[])[!+[]+]+[]+[])[!+[]+!+[]+[]+[]+[]+!+[]+[]+[]+[]
