mysql手注入之information_schema数据库详解_集群智慧网络安全云
全国客户服务热线:4006-054-001 疑难解答:159-9855-7370(7X24受理投诉、建议、合作、售前咨询),173-0411-9111(售前),155-4267-2990(售前),座机/传真:0411-83767788(售后),微信咨询:543646
企业服务导航

mysql手注入之information_schema数据库详解

发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370


mysql手注入之information_schema数据库详解

一、作为一个半道出家的萌新,深知在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() 还有许多函数,其他自行百度,如有错误请指教,谢谢。

mysql手注入之information_schema数据库详解