前言
学习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自带的读取功能 读取并输出 filesconsole.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使用bodyconsole.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 都没有什么服务器用这个破玩意 哎呀 要是遇到了呀 会看代码 是吧 能知道点东西 查查模块 是不是 要是不了解 那你妹的连模块也不知道 那不废了吗