SQL注入漏洞利用

预计更新
  1. SQL注入概述
    1.1 SQL注入攻击概述
    1.2 SQL注入漏洞分类
    1.3 SQL注入攻击的危害

  2. SQLMap介绍
    2.1 SQLMap简介
    2.2 SQLMap安装与配置
    2.3 SQLMap基本用法

  3. SQLMap进阶使用
    3.1 SQLMap高级用法
    3.2 SQLMap配置文件详解
    3.3 SQLMap插件的使用

  4. SQL注入漏洞检测
    4.1 SQL注入漏洞检测基础
    4.2 SQL注入漏洞检测工具
    4.3 SQL注入漏洞检测实战

  5. SQL注入漏洞利用
    5.1 SQL注入漏洞利用介绍
    5.2 SQLMap利用SQL注入漏洞
    5.3 SQL注入漏洞利用实战

  6. SQL注入防御
    6.1 SQL注入防御基础
    6.2 防御SQL注入的最佳实践
    6.3 使用SQLMap测试防御效果

  7. SQL注入绕过技术
    7.1 SQL注入绕过技术介绍
    7.2 绕过WAF
    7.3 绕过输入过滤

  8. SQL注入攻击的后果
    8.1 数据泄露
    8.2 数据篡改
    8.3 数据删除

  9. SQL注入漏洞的利用场景
    9.1 SQL注入漏洞的利用场景介绍
    9.2 电商网站SQL注入漏洞利用实战
    9.3 CMS网站SQL注入漏洞利用实战

  10. SQL注入漏洞的漏洞挖掘与利用
    10.1 SQL注入漏洞的漏洞挖掘方法
    10.2 SQL注入漏洞利用的高级技巧
    10.3 SQL注入漏洞利用的未来趋势

SQL注入漏洞利用介绍

SQL注入攻击是一种常见的Web应用程序安全漏洞,它可以允许攻击者绕过应用程序的身份验证和访问敏感数据。作为渗透测试工程师,了解SQL注入漏洞的利用是非常重要的,因为它可以帮助您发现并利用目标Web应用程序中的漏洞。

SQL注入攻击的原理

SQL注入攻击的原理是利用了Web应用程序中的输入验证不充分,允许恶意用户将恶意代码注入到SQL查询中的漏洞。攻击者可以利用这个漏洞来执行任意SQL命令,从而访问、修改或删除数据库中的数据。

例如,考虑一个简单的Web应用程序,其中用户可以通过用户名和密码进行身份验证,并访问其账户信息。在这种情况下,应用程序可能会使用以下SQL查询来验证用户的身份:

SELECT * FROM users WHERE username = '$username' AND password = '$password'

在这个查询中,$username$password是用户提交的值。如果应用程序不正确地验证这些值,攻击者可以通过将恶意代码注入到其中一个值中来执行任意的SQL查询。例如,以下是一个恶意输入,它将修改查询,从而允许攻击者访问所有用户的账户信息:

$username = 'admin';--'
$password = 'password';

在这个输入中,攻击者将$username设置为admin';--'。这个输入的效果是将查询修改为以下内容:

SELECT * FROM users WHERE username = 'admin';--'' AND password = 'password';

在这个查询中,--表示注释掉了后面的所有内容,所以密码验证被忽略了。这意味着攻击者可以绕过身份验证并访问所有用户的账户信息。

SQL注入漏洞的利用步骤

要利用SQL注入漏洞,渗透测试工程师通常需要执行以下步骤:

  1. 识别目标Web应用程序的漏洞

渗透测试工程师需要识别目标Web应用程序中的潜在漏洞。这可以通过手动测试、自动化扫描工具或其他技术来完成。常见的漏洞包括未经身份验证的访问、输入验证不充分、错误的授权、不安全的数据存储和未加密的传输等。

  1. 识别潜在的注入点

一旦识别了目标Web应用程序中的漏洞,渗透测试工程师需要确定是否存在潜在的注入点。注入点是指允许用户将恶意代码注入到SQL查询中的输入字段。渗透测试工程师可以检查Web应用程序中的输入字段,例如用户提交的表单、URL参数和Cookie等,以确定是否存在潜在的注入点。

  1. 利用注入点

一旦找到了注入点,渗透测试工程师可以通过输入恶意代码来利用它。攻击者可以使用常见的SQL注入技术,例如联合查询、布尔盲注和时间盲注等。联合查询是一种利用UNION操作符将恶意查询与原始查询合并的技术。布尔盲注和时间盲注是一种在没有直接访问查询结果的情况下,通过利用应用程序的响应时间来确定查询是否成功的技术。

例如,以下是一个漏洞的示例,其中使用了联合查询技术来获取数据库中的敏感信息:

http://example.com/products.php?id=1' UNION SELECT username, password FROM users;--

在这个示例中,攻击者将id参数设置为1' UNION SELECT username, password FROM users;--。这个输入的效果是将查询修改为以下内容:

SELECT * FROM products WHERE id = '1' UNION SELECT username, password FROM users;--'

在这个查询中,UNION SELECT username, password FROM users将恶意查询添加到原始查询中,以获取所有用户的用户名和密码。--注释掉了后面的所有内容,以确保查询成功。

  1. 利用结果

一旦攻击者成功地利用了注入点,他们可以访问、修改或删除数据库中的数据。攻击者可以使用这些数据来执行其他攻击,例如访问其他系统、窃取机密信息或破坏目标系统。

防止SQL注入攻击的方法

为了保护Web应用程序免受SQL注入攻击,渗透测试工程师可以采取以下措施:

  1. 输入验证

应用程序应该对所有用户输入进行验证,以确保它们符合预期的格式和类型。例如,如果应用程序期望用户名只包含字母和数字,则应该验证用户输入是否符合这些要求。输入验证可以防止攻击者利用注入点注入恶意代码。

  1. 参数化查询

应用程序应该使用参数化查询来构建SQL查询。参数化查询是一种将输入参数作为参数传递给查询的技术,而不是将它们嵌入到查询字符串中。这可以防止攻击者利用注入点注入恶意代码。

  1. 最小权限原则

应用程序应该使用最小权限原则,以确保用户只能访问他们需要的数据。例如,管理员应该只能访问管理相关的数据,而不是所有用户的数据。这可以防止攻击者访问敏感数据。

  1. 定期更新和维护

应用程序应该定期更新和维护,以确保它们不受已知的安全漏洞的影响。应用程序应该使用最新的安全补丁,并定期进行漏洞扫描和渗透测试。

结论

SQL注入攻击是一种常见的Web应用程序安全漏洞,它可以允许攻击者绕过应用程序的身份验证和访问敏感数据。渗透测试工程师可以利用SQL注入漏洞来发现和利用目标Web应用程序中的漏洞。为了防止SQL注入攻击,应用程序应该对用户输入进行验证,使用参数化查询,使用最小权限原则,并定期更新和维护。

SQLMap利用SQL注入漏洞

SQL注入是一种常见的网络攻击手段,利用这种漏洞攻击者可以获取并修改数据库中的数据,甚至可以执行恶意代码。SQLMap是一种自动化SQL注入工具,可以帮助渗透测试工程师快速识别和利用SQL注入漏洞。

本篇文章将从以下几个方面详细阐述SQLMap的使用方法和注意事项:

  1. SQL注入的原理和类型

  2. SQLMap的安装和配置

  3. SQLMap的基本用法

  4. SQLMap的高级用法

  5. SQLMap的注意事项

  6. SQL注入的原理和类型

SQL注入是一种利用Web应用程序的漏洞攻击数据库的技术。攻击者通过在Web应用程序的输入框中插入恶意的SQL语句,从而让数据库执行攻击者预设的操作。SQL注入漏洞通常出现在Web应用程序中,特别是那些使用动态SQL语句的应用程序。

SQL注入漏洞可以分为以下几种类型:

  • 基于错误的注入:攻击者通过将恶意代码插入到SQL语句中,从而使应用程序生成错误消息。这种类型的注入可以通过错误消息来识别。
  • 盲注注入:攻击者无法直接获取数据库的详细信息,但可以通过将恶意代码插入到SQL语句中来进行推测。
  • 基于时间的注入:攻击者可以通过在SQL语句中插入延时操作,从而获取数据库的详细信息。
  • 堆叠查询注入:攻击者可以通过在SQL语句中插入多个查询语句,从而进行多个操作。
  1. SQLMap的安装和配置

SQLMap是一个Python编写的工具,可以在Windows、Linux和Mac等操作系统上运行。安装SQLMap非常简单,只需要下载最新的版本并运行即可。

下载SQLMap:

git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

安装Python依赖:

python3 -m pip install -r requirements.txt

配置SQLMap的代理服务器(可选):

./sqlmap.py --proxy=http://127.0.0.1:8080 --proxy-auth=username:password
  1. SQLMap的基本用法

SQLMap的基本用法非常简单,只需要指定目标URL即可。下面是一个使用SQLMap进行基于错误的注入的示例:

./sqlmap.py -u "http://example.com/index.php?id=1" --dbs --batch

这个命令将自动检测目标URL是否存在注入漏洞,并列出所有数据库的名称。–dbs参数表示列出所有数据库,–batch参数表示以批处理模式运行,不需要用户交互。

除了基于错误的注入外,SQLMap还支持多种其他类型的注入。下面是一个使用SQLMap进行盲注注入的示例:

./sqlmap.py -u "http://example.com/index.php?id=1" --data="username=admin&password=1234" --level=5 --risk=3 --string="Invalid username or password" --batch

这个命令将自动检测目标URL是否存在盲注漏洞,并尝试推测用户名和密码。–data参数表示POST请求中的数据,–level和–risk参数表示注入的级别和风险,–string参数表示错误消息,–batch参数表示以批处理模式运行。

  1. SQLMap的高级用法

SQLMap还支持多种高级用法,包括指定数据库类型、指定注入点、指定注入语句、指定用户代理等。下面是一些常用的高级用法示例:

指定数据库类型:

./sqlmap.py -u "http://example.com/index.php?id=1" --dbms=mysql --batch

指定注入点:

./sqlmap.py -u "http://example.com/index.php?id=1" --data="username=admin&password=1234" --level=5 --risk=3 --string="Invalid username or password" --batch --sqlmap-shell

指定注入语句:

./sqlmap.py -u "http://example.com/index.php?id=1" --sql-query="SELECT * FROM users WHERE id=1" --batch

指定用户代理:

./sqlmap.py -u "http://example.com/index.php?id=1" --headers="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" --batch
  1. SQLMap的注意事项

使用SQLMap进行渗透测试需要注意以下几点:

  • 不要在未经授权的情况下使用SQLMap进行攻击,这是非法的。
  • 在使用SQLMap之前,应该对目标网站进行充分的授权和测试,并遵守渗透测试的道德准则。
  • 在使用SQLMap时,应该对目标网站进行备份,以免不慎修改了数据库中的数据。
  • 在使用SQLMap时,应该始终使用代理服务器,并在代理服务器上记录所有请求和响应数据。
  • 在使用SQLMap时,应该始终使用低风险和低级别的注入,以减少对目标网站的影响。
  • 在使用SQLMap时,应该始终进行日志记录,并对所有操作进行适当的文档记录。

总之,SQLMap是一种非常有用的工具,可以帮助渗透测试工程师快速识别和利用SQL注入漏洞。但是,在使用SQLMap时,我们也应该遵守渗透测试的道德准则,保护目标网站的安全。

SQL注入漏洞利用实战

在这篇文章中,我们将从渗透测试工程师的角度,深入探讨SQL注入漏洞的利用实战,并提供一些有用的技巧和工具,帮助您更好地理解和应对这种常见的漏洞。

  1. 确认注入点

在利用SQL注入漏洞之前,我们需要确认注入点。这通常可以通过手动测试或使用自动化工具来完成。

手动测试

手动测试是一种较为耗时的方法,但是它可以帮助我们更好地理解目标应用程序的工作原理,并发现一些自动化工具可能会错过的注入点。

手动测试的步骤如下:

  • 确认目标应用程序是否使用动态SQL语句。我们可以通过查看页面源代码或使用Burp Suite等代理工具来判断。
  • 尝试在URL参数、表单字段、Cookie等输入框中插入简单的SQL语句,例如’ or 1=1–,看是否会出现错误消息或页面内容发生变化。
  • 尝试使用一些特殊字符,例如单引号、双引号、反斜杠等,看是否会出现错误消息或页面内容发生变化。
  • 尝试使用一些SQL关键字,例如SELECT、UNION、FROM等,看是否会出现错误消息或页面内容发生变化。

自动化工具

自动化工具可以帮助我们更快地发现注入点,并生成一些基本的注入语句。常用的自动化工具包括sqlmap、JSQL、Havij等。

以sqlmap为例,它的使用步骤如下:

  • 确认目标应用程序是否使用动态SQL语句。
  • 使用sqlmap进行扫描,例如:sqlmap -u “http://example.com/index.php?id=1”。
  • 如果sqlmap发现注入点,则使用选项-r或–risk参数指定注入风险级别,并使用选项–dbs列出所有可访问的数据库。
  1. 利用注入点

一旦我们确认了注入点,就可以开始利用它来执行一些有趣的操作了。下面是一些常见的注入技巧和攻击向量。

基于错误消息的注入

当我们在注入点插入一些不合法的SQL语句时,应用程序可能会返回一些错误消息。这些错误消息可能会包含一些有用的信息,例如SQL查询的细节、数据库版本、文件路径等。

例如,在以下URL中,我们可以将id参数设置为’,应用程序将返回一条SQL语句错误消息:

http://example.com/index.php?id=’

如果我们将id参数设置为’ union select 1,2,3–,应用程序可能会返回一个包含3个列的结果集,其中第一列的值为1,第二列的值为2,第三列的值为3。

这种攻击向量的关键在于我们可以通过错误消息来推断出目标应用程序的后端架构和数据库类型,从而为后续的攻击打下基础。

基于布尔盲注的注入

当应用程序不返回错误消息时,我们可以利用布尔盲注来进行注入。布尔盲注是一种利用布尔逻辑的注入技巧,它可以帮助我们判断SQL查询的结果是否为真或为假。

例如,在以下URL中,我们可以使用id参数设置为1’ and substring(database(),1,1)=‘a’–,如果应用程序返回结果,则表示数据库名称以字母a开头:

http://example.com/index.php?id=1’ and substring(database(),1,1)=‘a’–

类似地,我们还可以使用其他SQL函数和操作符,例如substring、left、right、mid、if、case等来构造注入语句。

基于时间盲注的注入

当应用程序不返回错误消息并且我们无法使用布尔盲注时,我们可以利用时间盲注来进行注入。时间盲注是一种利用时间延迟的注入技巧,它可以帮助我们判断SQL查询的结果是否为真或为假。

例如,在以下URL中,我们可以使用id参数设置为1’ and if(1=1,sleep(5),0)–,如果应用程序响应时间超过5秒,则表示查询结果为真:

http://example.com/index.php?id=1’ and if(1=1,sleep(5),0)–

时间盲注可能需要一些耐心和技巧,但是它可以帮助我们在无法使用布尔盲注的情况下进行注入。

  1. 防范注入攻击

为了保护应用程序免受SQL注入攻击,我们可以采取以下一些措施:

使用参数化查询

参数化查询是一种预编译SQL语句的方法,它可以帮助我们避免使用字符串拼接构造SQL查询语句。例如,在Python的SQLite3模块中,我们可以使用以下代码来执行参数化查询:

cursor.execute(“SELECT * FROM users WHERE username = ?”, (username,))

使用输入验证和过滤

在接受用户输入时,我们应该对输入进行验证和过滤,以确保它符合预期的格式和类型,并且不包含任何恶意的内容。例如,我们可以使用正则表达式来验证电子邮件地址、电话号码、URL等。

限制权限和访问控制

在数据库层面上,我们应该限制应用程序的访问权限,并且使用强密码和加密机制来保护数据库中的敏感数据。

使用防火墙和IDS/IPS

在网络层面上,我们可以使用防火墙和入侵检测/防御系统来监控和防范SQL注入攻击。

结论

SQL注入漏洞是一种常见的安全漏洞,它可以被黑客用来获取敏感信息、执行恶意代码或破坏应用程序的功能。为了保护应用程序免受SQL注入攻击,我们应该采取一些措施,例如使用参数化查询、输入验证和过滤、限制权限和访问控制、使用防火墙和IDS/IPS等。同时,我们还应该保持警惕,及时更新应用程序和数据库的补丁,以确保它们能够抵御最新的攻击。

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

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

相关文章

shiro入门demo

搭建springboot项目&#xff0c;引入以下依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--单元测试--><depe…

集的增删操作

集是可以修改的&#xff0c;增加元素可以用add和update函数。删除可以用pop、discard、remove等函数。 1 增加集里的元素 add函数的参数视为一个整体插入到集里&#xff0c;而update函数传入的参数是把要传入的元素拆分&#xff0c;做为个体传入到集合中。 s set("hell…

.9.png的创建

1、创建.9.png 选中图片&#xff0c;右击&#xff0c;选择Create 9-Patch file&#xff0c;点击确定会生成一个xxx.9.png的图片 2、绘制拉伸区域 在图片的最外边界绘制拉伸区域&#xff0c;按住鼠标左键不放&#xff0c;绘制完成后保存就可以使用了。绘制结果示意如下&…

phpstudy小皮(PHP集成环境)下载及使用

下载 https://www.xp.cn/download.html直接官网下载即可&#xff0c;下载完解压是个.exe程序&#xff0c;直接点击安装就可以&#xff0c;它会自动在D盘目录为D:\phpstudy_pro 使用 phpMyAdmin是集成的数据库可视化&#xff0c;这里需要下载一下&#xff0c;在软件管理-》网站程…

OPPO怎么录屏?教程来了,让你成为录屏达人

“有人知道OPPO怎么录屏吗&#xff0c;前阵子刚买的OPPO手机&#xff0c;用起来感觉挺流畅的&#xff0c;功能也很齐全&#xff0c;最近因为工作原因&#xff0c;需要用到录屏功能&#xff0c;但是我不知道怎么打开&#xff0c;就想问问大伙&#xff0c;OPPO怎么录屏呀。” 在…

Redis分片集群一步一步全过程搭建

文章目录 Redis搭建分片集群1. 搭建的分片集群结构2.准备实例和配置&#xff08;1&#xff09;创建目录&#xff08;2&#xff09;创建配置文件&#xff08;3&#xff09;将这个文件拷贝到每个目录下&#xff08;4&#xff09;修改每个目录下的redis.conf&#xff0c;将其中的6…

Yocto 还是 Buildroot,构建自定义嵌入式系统时,您会选择哪一种?

假设您正在采用集成平板开发新一代大型智能微波炉。这个创意不错吧&#xff01;现在&#xff0c;您需要构建自定义操作系统&#xff0c;在保证不会烧焦食物&#xff08;更不要烧毁房屋哦&#xff09;的前提下&#xff0c;辅助管理各项事务。除此之外&#xff0c;您还需要创建一…

px? pt? dp? em?rem?vw?vh?ch?ex?这些单位你了解吗?

目录 前言 一、常见单位 1、px单位 2、dp单位 3、pt单位 4、百分比% 5、em单位 6、rem单位 7、vw和vh单位 8、ch、ex单位 二、如何换算 1、 pt和px换算 2、px和dp换算 3、em和px换算 4、rem和px换算 三、总结 前言 前端开发在日常设计中除了最常用的 px 以外&…

第二十八章 控制到 XML 模式的映射 - 流类到 XML 类型的映射

文章目录 第二十八章 控制到 XML 模式的映射 - 流类到 XML 类型的映射将集合属性映射到 XML 模式 第二十八章 控制到 XML 模式的映射 - 流类到 XML 类型的映射 如果类或属性基于流&#xff0c;则它将投影为 XML 类型&#xff0c;如下表所示&#xff1a; IRIS 流的 XML 类型 …

使用BeautifulSoup 4和Pillow合并网页图片到一个PDF:一种高效的方式来处理网页图像

背景 ​ 网页上的培训材料&#xff0c;内容全是PPT页面图片。直接通过浏览器打印&#xff0c;会存在只打印第一页&#xff0c;并且把浏览器上无效信息也打印出来情况。但目标是希望将页面图片全部打印为pdf形式。 实现方案 利用网页“另存为”&#xff0c;将页面内所有图片资…

官宣!「湾区之光群星演唱会」拉开2024新年音乐华丽序幕!

万众期待&#xff0c;群星荟萃&#xff01;青春宝安时尚湾区——湾区之光群星演唱会即将在2024年1月5日闪耀亮相深圳宝安。 华语歌坛巨星天后齐聚一堂&#xff0c;携手多位实力唱将&#xff0c;共同呈现一场无与伦比的演唱会盛宴&#xff01;在深情而又充满力量的歌声之中&…

Linux修复磁盘坏道,重新挂载硬盘

修复磁盘 挂载报错&#xff1a; [rootlocalhost ~]$ mount /dev/sdb /mnt/mydevmount: /dev/sdb is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sdb,missing codepage or helper program, or other errorIn some cases …

15、lambda表达式、右值引用、移动语义

前言 返回值后置 auto 函数名 (形参表) ->decltype(表达式) lambda表达式 lambda表达式的名称是一个表达式 (外观类似函数)&#xff0c;但本质绝非如此 语法规则 [捕获表] (参数表) 选项 -> 返回类型 { 函数体; }lambda表达式的本质 lambda表达式本质其实是一个类…

textarea文本框回车enter的时候自动提交表单,根据内容自动高度

切图网近期一个bootstrap5仿chatgpt页面的项目遇到的&#xff0c;textarea文本框回车enter的时候自动提交表单&#xff0c;根据内容自动高度&#xff0c;代码如下&#xff0c;亲测可用。 <textarea placeholder"Message ChatGPT…" name"" rows"&q…

TypeScript 第五节:条件语句

一、TypeScript 中常用的条件语句 TypeScript 的条件语句与 JavaScript 的条件语句类似&#xff0c;包括 if 语句、if...else 语句、switch 语句等。 1、if 语句 if 语句用于判断指定条件是否为 true&#xff0c;如果是 true&#xff0c;则执行一段代码块。 示例&#xff1a;…

命名空间this_thread

命名空间 - this_thread 在C11中不仅添加了线程类&#xff0c;还添加了一个关于线程的命名空间std::this_thread&#xff0c;在这个命名空间中提供了四个公共的成员函数&#xff0c;通过这些成员函数就可以对当前线程进行相关的操作了。 1.get_id() 调用命名空间std::this_t…

java脚本引擎Groovy动态执行

1.java脚本引擎Groovy实战_groovy脚本-CSDN博客 2.java可用的动态脚本引擎和动态代码执行_java动态执行代码片段-CSDN博客 3.Groovy动态加载Java代码的使用方法和工具类_groovy调用java类方法-CSDN博客 4.springboot应用动态运行groovy脚本-附源码 - 简书 (jianshu.com) 5.…

是不是学了低代码就自动放弃了高薪?内部资深解答来了!

目录 前言低代码开发&#xff1a;点餐还是自助烹饪&#xff1f;低代码的“菜单”低代码的局限性 市场影响的分析&#xff1a;一场关于低代码的对话低代码开发与程序员职业&#xff1a;名人视角解析总结 前言 近年来&#xff0c;低代码开发因其低门槛、高效率和易集成的特点受到…

conda 计算当前包的个数

Conda是一个强大的包管理器和环境管理器&#xff0c;它用于安装和管理来自不同源的软件包。若要计算当前conda环境中安装的包的数量&#xff0c;你可以使用以下命令&#xff1a; 首先&#xff0c;激活你想要检查的conda环境&#xff08;如果不是默认的base环境&#xff09;&am…

虹科新闻丨广州市“强企增效”项目助力虹科高质量发展!

来源&#xff1a;虹科电子科技有限公司 虹科新闻丨广州市“强企增效”项目助力虹科高质量发展&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/9pUXx5ZZpIi5S4s4o90GJA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 2023年12月6日至7日&#xff0c;工…