nodejs原型链污染

Node.js前置基础

相关文章:w3cschool.cn/nodejs/

Node.js是运行在服务端的JavaScript

Express框架

Express是一个为Node.js设计的web开发框架,它基于nodejs平台。

Express 简介:
Express是一个简洁而灵活的node.js Web应用框架,提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。

你使用Express可以快速地搭建一个完整功能的网站。

Express框架核心特性包括:

可以设置中间件来响应HTTP请求。
定义了路由表用于执行不同的HTTP请求动作。
可以通过向模版传递参数来动态渲染HTML页面。

第一个Express 框架实例

用Express框架输出”Hello World”

创建express_demo.js文件,代码如下所示:

//express_demo.js 文件
var express = require('express');
var app = express();

app.get('/',function(req,res) {
    res.send('Hello World');
})

var server = app.listen(8081,function(){
    var host = server.address().address
    var port = server.address().port
    
    console.log("应用实例,访问地址为http://%s:%s",host,port)

})

和前端js不同的区别,你在页面上看到的结果是已经代码执行后的结果,不像普通js代码可以在前端就可以看得到

const express = require('express');	//相当于python里面的导包操作,把express框架导入
const app=express();

//get路由
app.get('/login',function(req,res){
    res.send('<hr>登录页面</hr>');
    
})

app.get('/',function(req,res){
    res.send('<hr>首页页面</hr>');
    res.sendFile(__dirname+'/'+'sql.html');
})

const app.listen(3000,function(){
    console.log('web的3000端口已经启动!')

})

接收数据の代码

const express = require('express');	//相当于python里面的导包操作,把express框架导入
const app=express();

//get路由
app.get('/login',function(req,res){
    const u = req.query.username;
    const p = req.query.password;
    if(u=='admin'&& p == '123456'){
        console.log(u);
        console.log(p);
        res.send('欢迎进入后台管理页面');
    }else{
        res.send('登录用户或密码错误!')
    }
})

app.get('/',function(req,res){
    res.send('<hr>首页页面</hr>');
    res.sendFile(__dirname+'/'+'sql.html');
})

const app.listen(3000,function(){
    console.log('web的3000端口已经启动!')

})
//post路由
app.post('/login',urlencodedParser,function(req,res){
    const u = req.body.username;
    const p = req.body.password;
    console.log(u);
    console.log(p);
})

Node.js 连接 MySQL

连接数据库的基本代码

var mysql = require('mysql');
var connection = mysql.createConnection({
    host	: 'localhost',
    user	: 'root',
    password: '123456',
    database: 'test'
});

connection.connect();

connection.query('SELECT 1 + 1 AS solution', function(error, results, fields){
    if (error) throw error;
    console.log('The solution is: ', results[0],solution);
});
//具体代码实现
const express = require('express');	//相当于python里面的导包操作,把express框架导入
const app=express();
const mysql = require('mysql');

//get路由
app.get('/login',function(req,res){
    const u = req.query.username;
    const p = req.query.password;
    if(u=='admin'&& p == '123456'){
        console.log(u);
        console.log(p);
        res.send('欢迎进入后台管理页面');
    }else{
        res.send('登录用户或密码错误!')
    }
})

app.get('/',function(req,res){
    res.send('<hr>首页页面</hr>');
    res.sendFile(__dirname+'/'+'sql.html');
})

const app.listen(3000,function(){
    console.log('web的3000端口已经启动!')

})

var connection = mysql.createConnection({
    host	: 'localhost',
    user	: 'root',
    password	: '123456',
    database	: 'demo01'
});

connection.connect();
const sql = 'select * from admin';
connection.query(sql,function(error,data){
    if(error){
        console.log('数据库连接成功!');
    }else{
        console.log('数据库连接失败');
    }
    try{
        if(u==(data[0]['username']) && p==data[0]['password']){
            res.send('欢迎进入后台管理页面');
        }
    }catch{
        res.send('错误');
    }
})

文件管理操作

//简单的文件管理操作
const fs = require('fs');

app.get('/file',function(req,res){
    const dir=req.query.dir;
    console.log(dir);
    filemanage(dir);//dir就是路径
})

var server = app.listen(3000,function(){
    console.log('web应用3000端口已启动!')
})

function filemanage(dir){
    fs.readdir(dir,function(error,files){
        console.log(files);
    })
}

命令执行(RCE)

const rce=require('chile_process');
//node.js 调用系统命令执行
rce.exec('calc');//调用计算器
rce.exec('notepad');//调用记事本
rce.spawnSync('calc');//另一种函数调用计算器

//node.js 调用代码命令执行 把字符串当做代码解析
exec('console.log(1);')
eval('require("chile_process").exec("calc");');

通透了,还得是小迪!

Node.js原型链污染

实战测试NodeJS安全:
判断:参考前期的信息收集
黑盒:通过对各种功能和参数进行payload测试
白盒:通过对代码中写法安全进行审计分析
-原型链污染
如果攻击者控制并修改了一个对象的原型,(__proto__)
那么将可以影响所有和这个对象来自同一个类、父祖类的对象。

简单的继承关系代码展示

//foo是一个简单的JavaScript对象
let foo = {bar: 1}
//原型链污染
//foo.bar 此时为1
console.log(foo.bar)

//修改foo的原型 (即Object)
foo.__proto__.bar = 2

// //由于查找顺序的原因,foo.bar仍然是1
console.log(foo.bar)

// // 此时再用Object创建一个空的zoo对象
let zoo = {}

Node.js原型链污染利用(RCE)

let foo = {bar: 1}
console.log(foo.bar)
foo.__proto__.bar = 'require(\'chile_process\').execSync(\'calc\');'
console.log(foo.bar);
let zoo = {};
console.log(eval(zoo.bar));

在ctf中的一些小知识:https://f1veseven.github.io/2022/04/03/ctf-nodejs-zhi-yi-xie-xiao-zhi-shi/