sqlmaster第五关Less-5
测试IP:http://192.168.64.131 目录:/sqlmaster/Less-5/
自我认为这一关还是挺有意思的,我们先来尝试一下注入语句。
我们先访问空白页面看看返回了什么:
输出了:Please input the ID as parameter with numeric value
,告诉我们要输入ID
好,那我们输入上id,看看页面会返回什么,如图:
可以看到,只要数据库对应的id存在,那么就会给出一串固定的“You are in …”,如果对应的id不存在那么就什么都没有。
这个时候怎么办?>_<
别急,我们先尝试万能的“'
”注入法:
可以看到,页面将错误的信息打印了出来,过了前四关的我们对这个报错已经再熟悉不过了。不过如果按照以前的注入方法,我们是得不到任何数据的,那么我们可以想想,由于输入了id页面不会返回动态的信息,那么我们可以看到,因为报错信息是动态的,那么我们尝试让报错信息返回给我们想要的数据。
说干就干,我们开始“报错注入”。。。
开始测试
这里我们会用到两个函数:UPDATEXML(),CONCAT()
语法:
updatexml(xml_target,xpat_exper,new_value) 作用是更新xpath表达式的数据
xml_target:更新的xml数据
xpat_exper:更新的xml节点的xpath表达式,如果这个参数不是xpath类型的,那么就会抛出一个错误异常
new_value:新的节点值或要插入的节点
concat(str1,str2,str3,...) 作用是将多个字符串连成一个字符串
str:需要连接的字符串
这里我们就利用 updatexml()第二个参数引发的异常报错来获取数据,我们先来看一下报错时的样子:
一眼就发现了宝藏对吧!
键入:?id=1'and updatexml(1,concat(0x7e,(select database()),0x7e),1) limit 0,1 --+
效果如图:
- 成功获取到数据库名
当然,不能就这么玩完了!我们不能就只看看数据库名或用户名就算了。。。
基础介绍:
在MySQL5.0版本之后,会有一个information_schema的数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
这个数据库中,我们需要了解以下这三个表:
schemata:存储了当前用户创建的所有数据库名[schema_name]
tables: 存储了当前用户创建的所有数据库名[table_schema]和表名[table_name]
columns:存储了当前用户创建的所有数据库名[table_schema]和表名[table_name]和字段名[column_name]
好,介绍完这些之后我们开始接下来的操作。
键入:
?id=1'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1) limit 0,1 --+
先来解释一下:
我们首先利用updatexml()函数,利用写入不合法的第二个参数类型,试图使其抛出错误异常的数据【也就是我们想要得到的数据】,对于不合法的这个参数我们是这样写的:将两个十六进制的“~”与我们需要查询的数据进行拼接【当然,这个十六进制的“~”也可以用其它的字符替代】。
对于select的写法:
查询information_schema数据库下的tables表,
需要查询的表字段是table_name,
当条件table_schema字段='security'时查询,【由前面的database()我们就知道了当前使用的数据库是“security”】
查询的范围是从第0位置开始查,查1个。
注入效果如图所示:
- 成功获取到security数据库下的表名【共四个】,第五关通过!