上一篇文章提到过,information_schema是mysql自带的一个表,这个表里存放了大量信息。
我们可以进去这个数据库简单的看一下
然后输入 show tables,
能看到这里面有很多的表,我们先来看一下tables这个表
可以发现这里面有很多的字段,这些字段包含了这个数据库的名称,这个数据库里的表的名称,表的类型,默认的引擎,版本等等。。这些东西,都会放到这个表里面
还有一个叫做COLUMNS的表
在这里面也有很多字段,这里比上一个多一个COLUMN_NAME 的列,它会通过这个表对这个数据库进行相关的记录。
接下来我们可以在mysql里尝试一些简单的操作来获取数据库的一些信息
这行代码很好理解,前面就是在pikachu里面进行正常的查询,后面接union,字段数要一致,然后通过information_schema.tables where table_schema='pikachu’来实现跨数据库查询,也就是说我们可以通过这个操作来查一下pikachu 这个数据库里面有多少张表,表的名称是什么。
我们把这个操作来执行一下
这些都是在后台数据库上的原理演示,我们的目光转移到Pikachu平台上来
这时候我们所有的想法和操作都初始化,我们站在一个测试者的角度,首先来测试一下这是否存在SQL注入点,通过网页的报错,或者基于一些逻辑判断来进行
因为是字符型,我们输入一个单引号试试
发现网页报了一个语法错误,这就说明了我们输入的单引号已经被拼接到后台数据库中了,也就意味着这个地方存在着SQL数据漏洞
然后我们可以开始尝试输入一些闭合,点击查询
发现可以套出表里的数据
但是这还并没有达到我们想要查看数据库信息的目的,所以我们开始尝试使用union(联合查询)
在使用union之前,我们首先需要使用order by 来确认主查询里面有多少个字段
先尝试一下3
发现网页报出了列的错误
我们再来试试2,发现成功的查询出来信息了,这就说明主查询是两个字段
确认两个字段之后,我们就可以使用union来进行查询了,我们知道,如果想获取数据库的信息,你至少得先要知道当前数据库的名称
点查询,发现数据库的名称已经出来了
数据库的名称就叫做pikachu,拿到数据库的名称之后,我们就可以进一步通过information_schema来获取更多数据了,我们需要构造一个payload来实现这些操作
kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
我们将这个payload测试一下
然后我们就得到了对应的,我们想拿到的数据
第一条是前面kobe正常查询的结果,后面是union连带出来的,pikachu数据库中所有表的名称都给我们报出来了
我们接着来查一下COLUMNS的表,经过刚才的查询,我们这次的payload可以这样填写
输入进去后点击查询
我们可以得到对应的信息。
我们发现在这个表中有账号和密码
那么是不是只要把账号密码这个表查出来,就可以得到所有的账号密码了呢?我们再做进一步的测试
我们根据之前的结果已经得知了users这个表,这个表里含有username,password,所以直接做出了这样的payload,输入进去点击查询
账号和密码全都查了出来,不过显然,这个密码是做过处理的,一看这个密码长度就可以得知它是经过md5加密的,我们可以吧密码复制下来到互联网上找一些md5解密的网站
很容易就可以把密码找出来。