H

NodeJS 安全

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%

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);
20201227172203.png-water_print

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”)是指在/下载标题上调用中间功能。
20201227200630.png-water_print

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=消息
20201227202805.png-water_print

3 威胁分析​

3.1 常见漏洞​

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

3.2 代码审计​

3.2.1 项目结构​

20201227204456.png-water_print

3.2.2 审计依赖​

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

3.2.3 不安全的对象直接引用​

1
2
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 敏感信息泄露​

1
2
3
app.use(function(err,req,res,sext){
res.status(500).send(err.stack);
}))

3.2.5 未经验证的重定向和转发​

SSRF
1
2
3
4
5
6
7
app.use('/redirect',function(req,res){
请求(req.query.url,函数(错误,响应,身体){
如果(err){
返回res.send(body);
}
}))
}))

3.3 安全配置​

Helmet0
X框架选项提供单击劫机保护
XSS保护支持最新网络浏览器中内置的跨站点脚本(XSS)过滤器
x-content-type-options可防止浏览器从声明的内容类型中嗅出响应
内容- 安全性- 可防止各种攻击,包括跨站点脚本和其他跨站点注射

4 常见问题​

4.1 XSS​

1
2
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
练习一:
20210111114309.png-water_print

逃脱的输出,因此无法绕过
练习二:
20210111114357.png-water_print

使用Unescaper方法,因此只需直接使用定期有效载荷
20210111114440.png-water_print

练习三:
20210111114516.png-water_print

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

练习四:
20210111114739.png-water_print

它仍然是不浮标的,只需直接拼接
20210111114850.png-water_print

练习五:
20210111114915.png-water_print

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

用JSFUCK旁路过滤
1
[] [(![]+[])[+[]+([![]+[]+[] [[]])[+!+[]+[+[+[]]+(![]+[]+[])[!+[]+[]+!+[]+[]+(! []+[]+[]+[]+ []]+(! []+[])[!+[]+!+[]+!+!+[]+(! []+[])[+!+[]] ]])[+!+[]+[+[]+(![]+[])[!+[]+!+[]]+(! []+[])[+[]+[]+(! []+[]+[])[ +[]+!+[]]+(! []+[])[!+[]+!+[]]+(! []+[])[!+[]+[]+[]+[])[!+[]+[]+[]]+ [+!+[]+[+[]+(![]+[])[!+[]+!+!+[]+(! []+[])[+[]+(! []+[]+[]+[]+[]+[]+!+[]+[]+[]+[] +[]+(! []+[])[+!+[]+(![]+[])[!+[]+!+[]+]+]+(![]+[]+[])[!+[]+[]+!+[]+!+!+[]+[]+(![]]+(![]] ![]+[])[+[]+(! []+[])[+!+[]+(]+(] [] [] []+[])[+[]+(]+(] [] [] [(![]+[]+[+[+[]+(! ]]+[]]+[]+(![]+[])[+!+[]+[]+(![]+[])[!+[]+!+[]+[]+(! []+[]+[]+[])[!+[]+!+[]+ (! []+[])[+!+[]+[])[!+[]+!+[]+!+[]]+(! []+[])[+[+[]+[]+[]+(! []+[]+[] ])[+[]+[]]+(![]]+[]+[])[+[]+[]]+(![]]+[])[+!+[]+[]+[]+[]+(![]+[]+[])[! +!+[]+!+[]]+(! []+[])[+!+[]])[+!+[]]+(! []+[])[+!+[]]]+(![]+[]+[]+[+!+[]+(]+( ![]+[])[+!+[]]+(! []+[])[!+[]+!+[]]+(! []+[])[!+[]+!+!+[]]+(! []+[]+[]+[]+[+!+[]+ ]+(![]+[] [(![]+[])[+[]+[]+[]+([![![]+[]])[+!+[]+[]+[]+(![]+[]+[]+[]+[]+[]+[]+[]+(!] []]+(! []+[] [(![]+[])[+[]+([![![]+[]+[]])[+!+[]+[]+[]+(![]+[]+[]+[]+[]+[]+[]+[]+(!] []+]+(! []+[])[!+[]+!+[]])[!+[]+!+[]+[]+[])[!+[]+]+[]+[])[!+[]+!+[]+[]+[]+[]+!+[]+[]+[]+[]
20210111115357.png-water_print
 
后退
顶部