第三十天 NODE.js的使用 && node 编写登录页面 && 文件管理 && 数据库互联 && 以及 相应的安全问题

前言

学习node.js 就是因为这个 node.js 和前端的js是不同的 因为他是运行在 服务器端的 而前端的只能运行在 浏览器 前端的js 很容易就被捕捉内容 但是 node.js 其实和php一样 我们学习的目的就是 以后碰到这样的 问题 会解决 也要了解 node.js 相应的安全问题

node.js的基础知识的学习

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>后台登录</title>
    <style>
        body {
            background-color: #f1f1f1;
        }
        .login {
            width: 400px;
            margin: 100px auto;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0,0,0,0.3);
            padding: 30px;
        }
        .login h2 {
            text-align: center;
            font-size: 2em;
            margin-bottom: 30px;
        }
        .login label {
            display: block;
            margin-bottom: 20px;
            font-size: 1.2em;
        }
        .login input[type="text"], .login input[type="password"] {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            font-size: 1.2em;
            margin-bottom: 20px;
        }
        .login input[type="submit"] {
            background-color: #2ecc71;
            color: #fff;
            border: none;
            padding: 10px 20px;
            border-radius: 5px;
            font-size: 1.2em;
            cursor: pointer;
        }
        .login input[type="submit"]:hover {
            background-color: #27ae60;
        }
    </style>
</head>
<body>
<div class="login" >
    <h2>后台登录</h2>
    <form action="" method="">
        <label for="username">用户名:</label>
        <input type="text" name="username" id="username"  class="user">
        <label for="password">密码:</label>
        <input type="password" name="password" id="password" class="pass" >
        <button>  登录  </button>
    </form>  
</div>

上边是个 登录页面的html 我们复制到 sql.html 此外还需要创建 sql.js file.js file.txt zuse.js 在开发之前呢先学习一下 node.js的简单使用

node.js的使用手册

https://www.w3cschool.cn/nodejs/

首先呢就是了解 node.js的自建服务器机制和请求响应包的获取,node.js 的应用其实就是调用 模块 来帮助我们完成

1、服务器的创建

我们先 创建个sql.html 装上上边的代码 在创建个sql.js 写入以下代码 : 服务的创建并绑定 3000 端口

代码如下 :

复制代码
var http = require('http')   //定义个 http 让其包含(require 包含函数) 

执行完成之后 我们不是调用了模块吗 然后这个模块其实是 不存在在这里的 需要我们自己下载

演示一下 :

安装完 可以 npm list -g 查看

直接回车 就可以下载了 如果报错 请看我上个文章

调用完模块 我就进行页面的创建

复制代码
http.createSever(function(req,res){    //http的创建  function(req,res)  是自带的函数 意思就是获取请求和响应   

//因为我们这个页面不需要交互所以只给  响应就可以了 

res.writeHead(200,{'Content-Type':'text/html'});  //给与返回的内容 为'text'

res.end('hello myfist node.js');    //发送的请求信息 

}).listen(3000);    //把网站搭建在  3000端口
    console.log('3000 端口已开启') ;    //验证端口开启是否成功

然后运行一下试试

运行一下 要访问127.0.0.1:3000

Node.js 解释器 REPL

就是我们的node.js 其实也是一个终端的命令行

演示一下 :

NODE.js 回调函数

理解 同步(你给一个req 我给你一个 res ) 异步(你给我一个 req 我让别人干完活之后一块给你 res) 阻塞(你给我个req 我很忙我先让你等等 通话挂起 你直到收到我的res 才进行下一步)

非阻塞 (和上边相反)(看了就懂)彻底理解同步、异步、阻塞和非阻塞的概念_同步异步、阻塞非阻塞-CSDN博客

实例

阻塞(单线程) :

JavaScript toString() 方法 | 菜鸟教程

非阻塞:

说到这

就先搞个文件夹的打开的执行 以及文件的遍历漏洞(允许攻击者在未授权的状态下读取应用服务上任意文件的安全漏洞)

复制代码
//文件的遍历
var fs = require ('fs');    //导入文件管理模块
var express = require('express')    //导入 express 框架(这个框架后边说)
var app=express();            
function filemanage(dir)        定义一个函数 我们传入一个 dir  以为之后我们需要他来执行打开我们指定的目录
{ fs.readdir(dir,function(error,files){       //利用Fs自带的读取功能   读取并输出  files

      console.log(files);  

}); 

}
app.get('/',function(req,res){    //

var dir=req.query.dir;
console.log(dir);    //输出 目录
filemanage(dir);     //调用打开文件夹函数


})

运行一下

回车 哎?你妹的怎么没反应啊 什么情况 我们看看vs code

你妹的什么情况裤衩都被爆出来了 ; 这个就是文件的遍历漏洞 搞一搞 c盘 爆东西了

Express框架 &&node.js 开发登录页面

第一步还是先下载模块

因为我下了一次了 所以会报已经存在的错

下面展示一下 express 的简单应用 :

然后开启 node ./sql.js 得到这个页面 是因为我们没有 进行get 传参 那我们传参一下

给予了请求, 那这样 我们就可以直

复制代码
app.get('/',function(req,res){     //如果get路径是当前  就给与请求文件
res.sendFile(__dirname+"/","sql.html")      //sql.html 是我们的一个登录界面

});

接让当前页面显示个别的页面不可以吗? 当然可以

技巧 : 一般的文件路径都用 " " 进行包裹

完成这个之后我们就来演示一下 get 数据的传输 就是在我们刚刚这个页面去写入数据 然后 我们要用 js 接收 数据可以先判断一下 之后我们就可以进行数据库互联

然后下一步 就是把username 和pass 传输到后台就行了 这边我们演示get 类型的

然后我们需要 对html进行修改了

修改为 login // 因为我们是 get 接收login时触发 上边的函数 就可以运行玩一玩

'/login'原理 就是 我们刚刚html的指向不是 上边这个吗 我们输入账号密码登录的时候就会触发 上边的 login(直接进入 http://127.0.0.1:3000/login ? 账号=xxx && 密码=xxx)

get不是重点 我们主要是进行 post方式联动数据库

node.js Post 传输 数据库内容的显示 和简单的 or SQl注入

先修改一下 html 的method传输方式

引用 body 模块进行post 传输

复制代码
var mysql = require('mysql');   //引用数据库模块

var bodyParser = require('body')     //Parser  是解析器的意思
var urlencodedParser = bodyParser.urlencoded({ extended: false })   // 这个是url 加密的

app.post('/login',urlencodedParser,function(req,res){    //这边这样书写 
    const u = req.body.username;
    const p = req.body.password;     //数据传输方式的不同  get使用query   post使用body
    console.log(u);
    console.log(p);
// 利用模块 进行数据库的连接    
var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : '123456',
        database : 'demo01'
    });
// 进行连接之后我们就得进行 登录判断  这个判断的值是从数据库取出来的 (也可以这么想 就是 我们输入的 数据  他会进行一个查询  如 select * from admin where u=xxx and p=xxx  如果有数据返回就让你进 (这种是常用的模式))
// 后台验证 

connection.connect();  
var sql ='select * from admin where username="+u" and password="+p"'; // 这边注意就是 "+u" 这边是看见发蓝就是对的  //这是个拼接 把我们定义的 u , p 拼接到数据库里   //node.js 多用这个拼接

console.log(sql);  // 把查找进行输出到console
connection.query(sql,function(error,date){     //连接之后 进行数据库的操作
    if(error){
     console.log('数据库连接失败!');

} try{
            if(u==(data[0]['username']) && p==data[0]['password']){    // try   catch就是一种  测试  现在这个判断就是直接进行数据的对比   不是判断数据是不是为有和没有
                res.send('欢迎进入后台管理页面');
            }
        }catch{
            res.send('错误');
        };

}



});

然后我们就是 打开 phpstudy 打开数据库 然后使用 navicat 连接数据库 没创建的可以自己创建

好了连接一下试试

随便输入账号密码 输入正确的

然后就是简单的sql注入 前提 1、是这个数据库使用了 拼接 2、

判断模式(第一种 就是 拼接我们的输入数据 进入判断 是不是在 数据库里有 匹配 结果以返回值 是不是有为判断 能不能放你登录 第二种就是 真实利用 数据库里的你查找出来的东西和你的输入进行 == 对了就让你进 不对不让你进)为 第一种 ;

最简单的注入 就是 x'or1=1 #

解析一下 我们输入的账号密码 select * from admin where name='xxxx a' or1=1 #' and password='123456'

这个就是 逻辑判断 xxxx or 1=1 这个就是判断正确与错误 我们输入的是假密码 但是 or 逻辑 有一个对的就是真的 现在这个账号就是正确的了 # and password='123456' //这个就是注释后边的内容 这样就只剩下了 前边的逻辑 我们这个代码 用不了 因为有个判断

(u==(data[0]['username']) && p==data[0]['password']) 这样我们注入 之后还是错的

讲个例题 sql注入
BUUCTF在线评测

web题的第一个 简单的sql注入

那我们直接玩一玩吧 利用我们分析的逻辑 直接进行注入

直接登录 flag直接出来

其实还有一步就是 判断 注入点 是 ' 还是 " 简单的就是 直接 a' a''试一试

输入点 a' 直接出来这个 那就是注入点

有兴趣的可以玩一玩sql注入 下边这个是一些注入的万能密码https://zhuanlan.zhihu.com/p/485448815#:~:text=%E3%80%90%E5%8F%8C%E5%BC%95%E5%8F%B7%E5%AD%97%E7%AC%A6%E5%9E%8B%E4%B8%87%E8%83%BD%E5%AF%86%E7%A0%81%E3%80%91%20a%22%20or%20true%20#%20a%22%20or%201,a%20a%22%20or%201=1%20--%20a%201.1%20%E4%B8%87%E8%83%BD%E8%B4%A6%E5%8F%B7%E7%9A%84%E4%BD%BF%E7%94%A8

最后一个

node.js 进行系统命令的调用 | RCE注入

上边我们说了 node.js其实就是个终端

这个系统命令的调用 演示一下 先下载模块

利用的命令 是 exec 这个可以记一下

和大家说一说 就是 为什么使用函数 都是有个 . 呀 这个就是rce 是个主模块 exec是它里边的东西 (我们可以叫他方法 这个就涉及到 原型对象(可以存储模块的方法) ) 这个可以调用系统的命令 调用一下玩玩

计算机 弹出

上边这个 rce命令 再一个就是下边的RCE代码执行

eval 这个就是个危险命令 以后看着就偷着笑吧 他会把文本的输出解析(就是这个毛病造成了代码的注入)

再一个就是两种 组合的注入 eval("require('child_process').exec('calc')")

总结

: 为什么学这个node.js 都没有什么服务器用这个破玩意 哎呀 要是遇到了呀 会看代码 是吧 能知道点东西 查查模块 是不是 要是不了解 那你妹的连模块也不知道 那不废了吗

相关推荐
程序员爱钓鱼6 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
sg_knight14 小时前
Nuxt 4 生产环境部署指南 (Node.js + Nginx)
运维·nginx·node.js·nuxt·ssr
LYFlied20 小时前
TS-Loader 源码解析与自定义 Webpack Loader 开发指南
前端·webpack·node.js·编译·打包
暴富的Tdy20 小时前
【Webpack 的核心应用场景】
前端·webpack·node.js
xiliuhu20 小时前
Node.js 的事件循环机制
node.js
soul g21 小时前
npm 包发布流程
前端·npm·node.js
Y‍waiX‍‍‮‪‎⁠‌‫‎‌‫‬21 小时前
【npm】从零到一基于Vite+vue3制作自己的Vue3项目基础的npm包并发布npm
前端·npm·node.js
elangyipi1231 天前
pnpm 深度解析:下一代包管理工具的原理与实践
npm·node.js
Y‍waiX‍‍‮‪‎⁠‌‫‎‌‫‬1 天前
NRM-NPM的镜像源管理工具使用方法
前端·npm·node.js
程序员爱钓鱼1 天前
Node.js 编程实战:数据库连接池与性能优化
javascript·后端·node.js