一,完成事项
漏洞复现
js基础学习
二,未完成事项
三,下周待做
四,本周学习内容
JavaScript基础
- DOM&BOM
相当于内置模块
-
JQuery
相当于第三方模块
1.变量
var a; /*正常变量,具有函数作用域*/
let y = "原神"; /*正常变量,具有块级作用域*/
const PI = "3.14"; /*声明常量/*
三者特点
引用出处:https://blog.csdn.net/xiewenhui111/article/details/113133330
var:
1、存在变量提升
console.log(a); // undefined
var a = 10;
// 编译过程
var a;
console.log(a); // undefined
a = 10;
2、一个变量可多次声明,后面的声明会覆盖前面的声明
var a = 10;
var a = 20;
console.log(a); // 20
3、在函数中使用var声明变量的时候,该变量是局部的
var a = 10;
function change(){
var a = 20;
}
change();
console.log(a); // 10
而如果在函数内不使用var,该变量是全局的
var a = 10;
function change(){
a = 20
};
change();
console.log(a); // 20
let:
1、不存在变量提升,let声明变量前,该变量不能使用(暂时性死区)。
console.log(a); // ReferenceError: a is not defined
let a = 10;
2、let命令所在的代码块内有效,在块级作用域内有效
{
let a = 10;
}
console.log(a); // ReferenceError: a is not defined
3、let不允许在相同作用域中重复声明,注意是相同作用域,不同作用域有重复声明不会报错
let a = 10;
let a = 20;
// Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 10;
{
let a = 20;
}
const:
1、const声明一个只读的变量,声明后,值就不能改变
const a = 10;
a = 20; // TypeError: Assignment to constant variable.
2、const必须初始化
const a; // SyntaxError: Missing initializer in const declaration
const a = 10; // ok
3、const并不是变量的值不能改动,而是变量指向的内存地址所保存的数据不得改动
const obj = {
age: 17
}
obj.age = 18; // ok
obj = {
age: 18
}
// SyntaxError: Identifier 'obj' has already been declared
4、let该有的特点const都有
区别
1,变量提升
var声明的变量存在变量提升,即变量可以在声明之前调用,值为undefined
let和const不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错
2,块级作用域
var不存在块级作用域
let和const存在块级作用域
3,重复声明
var允许重复声明变量
let和const在同一作用域不允许重复声明变量
4,修改声明的变量
var和let可以
const声明一个只读的常量。一旦声明,常量的值就不能改变,但对于对象和数据这种引用类型,内存地址不能修改,可以修改里面的值。`
使用
能用const的情况下尽量使用const,大多数情况使用let,避免使用var。
const > let > var
const声明的好处,一让阅读代码的人知道该变量不可修改,二是防止在修改代码的过程中无意中修改了该变量导致报错,减少bug的产生。let声明没有产生预编译和变量提升的问题,先声明再使用可以让代码本身更加规范,let是个块级作用域,也不会污染到全局的变量声明。
最后说一点就是使用的场景说明:let一般应用于基本数据类型;const 一般应用于引用数据类型,也就是函数对象等。
此处引用结束
var常见功能:
var GenShen = "原神";
var name = "原神启动!";
var a1 = name.length;//获取name长度
var a2 = name[0];//原||name[0]==name.charAt(0)
var a3 = name.trim()//去除空白
var a4 = name.substring(0,2);//前取后不取||原神
实列
<span id="txt"> 豆✌,伟大,无需多言!!! </span>
<script>
function show() {
// 在HTML中找到目标并获取内容(DOM)
let tag = document.getElementById("txt");//拿到标签对象
let darastring = tag.innerText;//获取目标内容
/* console.log(darastring)*/
// 2.动态起来:把文本的第一个字符放在字符串的最后。
let firstchar = darastring[0];
let others = darastring.substring(1, darastring.length);
let newtxt = others + firstchar;
console.log(newtxt)
// 3,在HTML中更新内容
tag.innerText = newtxt;
}
//js中的定时器
setInterval(show, 200);//每()ms执行一次show
</script>
2.数组
let a1 = [1,2,3,4];
let a2 = Array([1,2,3,4]);
a1[0] = "原神";
a1.push("原神启动!"); //尾部追加字符:[1,2,3,4,"原神启动!"]
a1.unshift("原神启动!") //尾部追加字符:["原神启动!",1,2,3,4]
a1.splice(索引位置,0,元素);
a1.splice(1,0,"原神"); //尾部追加:[1,"原神",2,3,4]
a1.pop() //尾部删除
a1.shift() //头部删除
a1.splice(索引位置,1)
a1.splice(2,1); //删除索引为2的元素:[1,2,4]
循环
let a1 = [1,2,3,4];
for(let item in a1){
//idx=0/1/2/3/ data=a1[idx]
}
for(let i=0; i<a1.length; i++){
// i=0/1/2/3/ data=a1[i]
}
实例
<script>
let cityname = ['213','321','123'];
for(let idx in cityname){
let text = cityname[idx]
//创建<li></li>
let tag=document.createElement("dd");
//在li标签中写入内容
tag.innerText = text;
// tag.innerText = text;
//添加到id=city中
let biaoqian = document.getElementById("city");
biaoqian.appendChild(tag);
}
</script>
3.字典
info = {
"game" : "原神",
"computer" : "联想",
}
info.game = "崩坏"
info["computer"] = "华硕"
delete info["game"]
info = {
"game" : "原神",
"computer" : "联想",
}
for(let i in info){
//i = game/computer|键 data=info[i]|值
}
实例
<form id="pinglun">
<br>
<input style="width: 200px" type="text" id="username" placeholder="yout username" required>
<br>
<br>
<textarea style="width: 200px" id="users" placeholder="评论..." required></textarea>
<button type="submit">提交</button>
</form>
<div id="pingluns"></div>
<script>
document.getElementById('pinglun').addEventListener('submit', function(e) {
e.preventDefault(); // 阻止表单默认提交行为
// 这一行首先获取了HTML中id为'commentForm'的表单元素,并给它添加了一个提交事件监听器。
// 当表单被提交时(例如用户点击“提交”按钮),这个匿名函数将会执行。
const username = document.getElementById('username').value;
const userComment = document.getElementById('users').value;
// 这行代码阻止了表单的默认提交行为,也就是浏览器不会重新加载页面或导航到新的URL。
// 在这里我们不需要页面刷新,而是希望通过JavaScript来处理提交动作。
// 下面两行代码获取用户在表单中填写的用户名和评论文本
const commentDiv = document.createElement('div');
// 设置这个新创建的`div`元素的文本内容,包含用户名和评论内容
commentDiv.textContent = `${username}: ${userComment}`;
// 把新创建的评论元素添加到ID为'commentsList'的HTML元素内部,这样它就出现在了页面的评论列表中
document.getElementById('pingluns').appendChild(commentDiv);
// 清空表单中的用户名和评论文本框以便用户再次输入新的评论
document.getElementById('username').value = '';
document.getElementById('users').value = '';
});
</script>
DOM
js模块,对HTML页面标签进行操作
//通过ID获取标签
let doms = document.getElementById('GengShen');
//获取标签文本
doms.innerText;
//修改标签文本
doms.innerText = "原神启动!";
//创建标签
let make = document.createElement('div');
//标签内写文本
make.innerText = "原神启动!";
漏洞复现
下载docker(切root)
Linux内核>=5.5.0
uname -a//查看Linux内核
1、更新下载源
#新重写sources.list中内容,一个个字母删除太久了
cho > /etc/apt/sources.list
#进入sources.lis重新编辑apt源
vim /etc/apt/sources.list
写完后按Esc退出编辑模式
之后shitf+;输入wq,回车
源
#其他apt源
#中科大
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
#阿里云
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
#清华大学
#deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
#deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
#浙大
#deb http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
#deb-src http://mirrors.zju.edu.cn/kali kali-rolling main contrib non-free
#东软大学
#deb http://mirrors.neusoft.edu.cn/kali kali-rolling/main non-free contribp.kali.org/kali kali-rolling main non-free contrib
#重庆大学
#deb http://http.kali.org/kali kali-rolling main non-free contrib
#deb-src http://http.kali.org/kali kali-rolling main non-free contrib
2、进行系统或工具的更新
建议边下边打游戏,这样时间快一点TvT
#注:当出现正在设定软件包界面时,直接按tab+enter进行确认
apt-get update && apt-get upgrade && apt-get dist-upgrade
apt-get clean
3、采用apt安装Docker
apt-get install docker docker-compose
#或
apt-get install docker.io
4、检验Docker成功安装
#启动docker服务
service docker start
#列出docker现有镜像
docker images
5、搭建环境
vim docker-compose.yml
#内容如下
version: '3'
services:
nacos:
restart: always
image: nacos/nacos-server:1.4.0
container_name: nacos
ports:
- 8848:8848
environment:
MODE: standalone
docker-compose up -d启动
访问 http://192.168.xx.xx:8848/nacos/#/login
默认用户名密码 nacos,nacos
NACOS未授权访问漏洞
访问用户账号密码列表
url/nacos/v1/auth/users?pageNo=1&pageSize=9
#pageNo表示第几页,pageSize表示一页显示几个账号,可以根据需要修改
curl -XGET 'http://192.168.1.5:8848/nacos/v1/auth/users/?pageNo=1&pageSize=9'
向服务器添加用户
方法1
curl -XPOST 'http://192.168.xx.xx:8848/nacos/v1/auth/users?username=hack&password=hackers'
方法2
User-Agent 字段表示的是Nacos服务器自身作为客户端与其他服务交互时的身份标识。
Nacos-Server 是指 Nacos 服务端程序,它是 Nacos 整个服务体系中的核心组件。
在微服务架构中,Nacos-Server 扮演的角色主要包括:
1.服务注册中心:服务提供者启动时向 Nacos Server 注册自己的服务实例信息,如 IP 地址、端口号等,服务消费者则可以从 Nacos Server 查询并订阅服务列表,实现服务间的自动发现和调用。
2.配置中心:Nacos 提供统一的配置管理服务,应用可以通过 Nacos-Server 动态地获取和更新配置信息,而不必重启服务,极大地提高了系统的灵活性和运维效率。
!
NACOS旁路身份验证安全漏洞
https://jwt.io/
构造base64 - jwt的网站
我构造的是 2024-05-12 21:21:37 --> 1715520097
构造Authorization: Bearer <access_token>
Authorization: Bearer
是HTTP协议中的一种授权头字段(Header Field),常用于OAuth 2.0协议以及其他JWT(JSON Web Tokens)认证机制中。当客户端通过OAuth 2.0获取到访问令牌(Access Token)后,在后续向受保护资源服务器发起请求时,会在HTTP请求头中携带这个字段以证明其身份和权限。
<access_token>
是一个由授权服务器颁发的、经过加密签名的字符串,代表了客户端获得的授权许可。服务器接收到请求后,会验证这个Bearer Token的有效性,确认无误后允许客户端访问对应的受保护资源。
将jwt码放入Authorization: Bearer后的<access_token>位置
之后继续进行绕过
放包之后登陆成功