这一篇文章如何将MySQL数据库爆库? 上一篇【超级蜘蛛池之何谓为SQL注入?】介绍了SQL注入的根本原理和试验想法! 假如作为一名黑客,基本无法知道系统中有哪些表,表中有哪些字段,那如何将数据库的内容盗取出来呢? 答案就是MySQL数据有一个元数据库,它会描述整个MySQL服务器有哪些数据库,每个数据有哪些表,每个表有哪些字段,这就相当于把自家屋子有什么宝贝统统通知别人了。 那这个元数据库就一个根,只要抓紧了这依据,沿着:元数据库 - 数据库列表-表列表-字段列表-表内容 刚才谈到MySQL里面有个元数据库,但它在藏在哪里呢?别急,请登录MySQL数据库,并运行sho databases;号召,就可以获取所有数据库列表,如下图所示: 图片中标红色的数据库information_schema就是元数据库,里面利用尽有,可以尽兴扩展处女地。 进入information_schema数据库,看看里面有哪些数据表,采用如下号召: 我们所说的根就在SCHEMATA表,它里面描述了整个MySQL 下所有数据库。 然后再应用TABLES表,则可以看到数据下的表名,再应用COLUMNS表,则可以看到每个表下的字段名。下面依次呈现如何察看这些数据。 SCHEMATA表描述所有数据库信息,只需尺度的select语句: SELECT * FROM information_schemaSCHEMATA 即可将该表的内容全体显示出来: 图中SCHEMA_NAME字段为数据库名,从查询结局可以知该MySQL服务器有5个数据库。 请留心,从这里开端不再入进入某个数据库之后再拜访表,而是使用数据库名表名的尺度形式来拜访某个数据库下的表。上述的information_schemaSCHEMATA表示查询information_schema数据库下的 SCHEMATA表。 有了数据库列表,就可以进一步察看某个数据库下所有表(当前也可以察看所有数据库下的所有表)。比如察看lyt_test数据库下的所有表,采用SQL语句: SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schemaTABLES WHERE TABLE_SCHEMA = lyt_test 查询结局如下图所示: TABLE_NAME表示表名,左列TABLE_SCHEMA为数据库名,因为lyt_test数据库下只有accounts这个表,所以输出结局只有一列。 然后采用COLUMNS表可以查询表的所有字段信息,采用下面SQL语句可查询accounts表的所有字段名和类型: SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM information_schemaCOLUMNS WHERE TABLE_NAME = accounts 查询出accounts表所有字段和类型信息如下图所示: 察看accounts表中的内容更是小菜一碟了,学过数据库的都知道SQL写成下面这样:SELECT * FROM lyt_testaccounts 还记得上篇文章介绍的试验吗?应用SQL注入专业,可以将userinfo表中的所有数据都盗取出来。但该SQL能注入的部门只是WHERE部门,而SELECT FROM 部门中的字段和表名却是无法注入的,那怎么可以将其它表的数据盗取出来呢? 这个密秘就就是应用UNION语句。是的,尺度SQL提供了UNION语句,可以将两个SELECT结局联盟起来(即对两个SELECT结局作并集)。UNION语句的语法如下: SELECT column_name1(s) FROM table_name1 UNION SELECT column_name2(s) FROM table_name2 唯一的要求就是两个SELECT语句的列数要相等。 有了UNION语句,就可以将 SELECT * from userinfo WHERE 和 SELECT * from lyt_testaccounts两个结局联盟起来。 那么在没有拿到源代码的场合,怎么知道 SELECT * from userinfo 查询结局有多少列呢? 可通过探索想法拿到这个数值:依次注入UNION SELECT 1, N这样的语句来探索。先尝试 SELECT 1, 再SELECT 1,2, 然后SELECT 1,2,3,直到不运行犯错为止。可以先在MySQL上测试一下,结局下图所示: 从上图测试结局可知UNION后面跟的SELECT结局必要是两列,否则会犯错。 们在注入时WHERE后是两个条件吗?(name = ‘name′ANDpassd=′passsd ‘),在实际代码中可能会是更复杂的条件,甚至黑客也很难猜测的条件,那这个UNION语然该插在那个变量呢?使得整个SQL还是个正当的查询语句。 最好安全的做法是将UNION SELECT 注入到第一个变量中,然后注入的尾部增加一个注释符号,将后的语句注释掉,就不会斟酌后面的是什么语句了。在MySQL数据库,采用符号即可实现注释。 可以做一下注入测试,验证一下: 在username文本框中输入:ivan union select 1,2,如下图: 点login 按钮后的运行结局如下图所示: union注入结局 请留注下红框中生成的SQL语句: SELECT * FROM userinfo WHERE name = ‘ivan’ union select 1,2 AND passd = ” 将后面的SQL内容注释掉了,MySQL分析时直接将它干掉,相当于下面的SQL语句: SELECT * FROM userinfo WHERE name = ‘ivan’ union select 1,2 select 1, 2的结局是常数行, 在后面的例中尝试从表中查询数据,而不彻底是常数行。 好了 ,UNION和就是撬动爆库的那个支点 以下试验都是基于《SQL注入底层》一文开发的数据库利用demo来试验的,假如读者没有SQL注入的底层知识,建议看看这篇文章;同时建议SQL注入的初学者也按此文搭建雷同的数据利用demo来试验测试一把。 往username中注入:ivan’ union select 1,SCHEMA_NAME from information_schemaSCHEMATA 即可查询所有数据库列表如下图: 注入获取所有数据库 图示标红色框的就是数据库列表。我们在UNION SELECT 语句中第一列为常数1,第二列是information_schemaSCHEMATA表中SCHEMA_NAME这一列,它刚好就是数据库名。 为了精减输出结局,这里只爆lyt_test数据库下的表名,往username中注入: ivan’ union select 1,TABLE_NAME from information_schemaTABLES here TABLE_SCHEMA = ‘lyt_test’ 即可查询得lyt_test数据库下所有表,如下图所示: 注入获取lyt_test数据库下的表 差异的场所是lyt_test数据库下只有accounts一个表,其它与爆数据库原理雷同。 这里只爆accounts表下的所有字段,往username中注入: ivan’ union select 1, COLUMN_NAME from information_schemaCOLUMNS WHERE TABLE_NAME = ‘accounts’ 结局如下图所示: 注入获取字段名 标红的是字段名。那么类型呢? 改动注入内容为:ivan’ union select 1, DATA_TYPE from information_schemaCOLUMNS WHERE TABLE_NAME = ‘accounts’ 就可以获取字段类型信息,如下图所示: 注入获了字段类型 标红色的差别是前面两个字段的类型,即类型为char, balance类型为float。 从上面可以发明规律:每个注入可以获取到目的表中的每个列表数据, 假如表中有N表,注入N次可以获取完整的表信息。 SQL注入爆数据库就是这么容易的,但有几个必备条件: MySQL中显露一个元数据库information_schema,它描述整个MySQL服务器所有数据库-表-字段关系树 SQL语言提供了UNION语句,可以新增盗取其它数据合并到被注入SELECT结局 MySQL对SQL做开拓,提供注释符
这个树状分层的检索次序,就可以将整个数据库内容全体盗取出来。
一、元数据库在哪
二、察看所有数据库
三、察看数据表
四、察看表中的所有字段
五、察看表中的所有纪实
那么如何应用SQL注入来盗取整个数据库呢?,这就是要寻找的支点。
七、实践爆库
八、爆数据库列表
九、爆某个数据库下的所有表名
十、爆某个表下所有字段
结算
利用SQL注入进行爆库进阶:云盘服务无法连接服务器
云盘服务无法连接服务器描述::