大余
- 关注

系列文章
简介
渗透测试-地基篇
该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
名言:
你对这行的兴趣,决定你在这行的成就!
一、前言
数据库作为业务平台信息技术的核心和基础,承载着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,数据库的安全稳定运行也直接决定着业务系统能否正常使用。并且平台的数据库中往往储存着等极其重要和敏感的信息。这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。所以对数据库的保护是一项必须的,关键的,重要的工作任务。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
二、查询数据
1、表单查询
1. select * from biao1; #查询所有数据
2. select username from biao1; #查询单个类型数据
3. select username,password from biao1; #查询多个类型数据
2、按条件查询
命令:
select * from biao1 where id=1;
#按指定条件查询
select * from biao1 where id<=1;
关系运算符说明:
= 等于
<> 不等于
!= 不等于< 小于
<= 小于等于
> 大于
>= 大于等于
3、带 IN 关键字的查询
命令:
select * from biao1 where id in(1,2,3);
select * from biao1 where id not in(1,2,3);
4、空值查询
命令:
select * from biao1 where id is not null;
select * from biao1 where id is null;
5、去掉重复查询
命令:
select distinct username from biao1;
6、带 LIKE 关键字进行模糊查询
常用百分号通配符:
命令:
select * from biao1 where username like "d%";
select * from biao1 where username like "%d%";
下划线通配符:
命令:
select * from biao1 where username like "dayu_";
select * from biao1 where username like "d____";
#一个数值加一个_
7、带 AND和or 关键字的多条件查询
带 AND 关键字的多条件查询:
命令:
select * from biao1 where id<7 and username='test1';
带 OR 关键字的多条件查询:
命令:
select * from biao1 where id<7 or username='test1';
select * from biao1 where id=5 or username='test1';
OR 和 AND 一起使用:
命令:
select * from biao1 where id>2 and password='12345116' or username='test';
select * from biao1 where id>2 and password='123456' or username='testa';
select * from biao1 where id>2 and password='123456' or username='test11'
OR 和 AND 一起使用的时候,AND 的优先级高于 OR,因此二者一起使用时,会先运算 AND 两边的表达式,再运算 OR 两边的表达式。
三、高级查询数据
1、聚合查询
命令:
select count(id) from biao1;
select count(*) from biao1;
select sum(id) from biao1;
select avg(id) from biao1;
select max(id) from biao1;
select min(id) from biao1;
COUNT() 返回某列的行数
SUM() 返回某列值的和
AVG() 返回某列的平均值
MAX() 返回某列的最大值
MIN() 返回某列的最小值
2、分组查询
1)单独使用 GROUP BY 进行分组
命令:
select * from biao1 group by password;
select * from biao1 group by username;
2) GROUP BY 和 HAVING 关键字一起使用
select max(id) from biao1 group by username;
select count(id) from biao1 group by username;
HAVING关键字和WHERE关键字的作用相同,区别在于HAVING 关键字可以跟聚合函数,而 WHERE 关键字不能。通常HAVING 关键字都和GROUP BY一起使用,用于对分组后的结果进行过滤。
例如:
命令:
select * from biao1 group by username having sum(id)<6;
#查询sum函数求和中小于6的数据返回
3、使用 LIMIT 限制查询结果的数量
命令:
select * from biao1 limit 1;
select * from biao1 limit 4;
select * from biao1 limit 1,5; #显示1~5的结果
4、为表和字段取别名
1)为表取别名
命令:
select * from biao1 as u where u.id=2;
#数据量非常大的情况下,用as定义类型别名查询
2)为字段别名
命令:
select username as n from biao1;
select username as myname from biao1;
#字段名username变成myname,在以后会使用到
四、mysql的子查询
1、where型子查询
命令:
select * from biao1 where id in (select * from biao1 where id>5);
# "*"类型需要选择需要查询的类型, (把内层查询结果当作外层查询的比较条件)
select * from biao1 where id in (select id from biao1 where id>5);
2、from型子查询
命令:
select * from (select * from biao1 where id<4) as age_1;
#(把内层的查询结果供外层再次查询)
#(select * from users where id<4)查询出来的是一个集合别名为age_1
#例如:select * from age_1 内容一样
3、exists型子查询
命令:
select * from biao1 where exists(select * from biao1 where id>2);
#(把外层查询结果拿到内层,看内层的查询是否成立)
#假如()内返回成立,则输出所有,返回不成立则无
4、联合查询(两个表的查询)
利用前面的知识创建一个表,然后添加三行数据。
命令:
select * from biao1 union select *,1 from biao2;
#这里*,1 指的是两个表列不一致的情况下,添加可相匹配后列出数据
五、数据库内链接、左和右连接操作
1、利用navicat操作数据库
登录数据库;
这就是我们之前学习操作的四个表;
创建a_new表内容如图;
创建b_new表内容如图;
开始查询;
2、数据库内连接
关键字:inner join on
说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
select * from a_new a INNER JOIN b_new b on a.classid=b.user_id;
3、数据库左连接
关键字:left join on / left outer join on
说明:left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
select * from a_new a LEFT JOIN b_new b on a.classid=b.user_id;
4、数据库右链接
关键字:right join on / right outer join on
说明:right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
select * from a_new a RIGHT JOIN b_new b on a.classid=b.user_id;
六、数据库-IFORMATION_SCHEMA详解
1、前言背景
跨库查询 是 SQL注入的一种:
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
2、information_schema数据库表
1)information_schema数据库表说明:
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
3、information_schema数据库-三种表
1)三种重要表格介绍
渗透测试后期基础上必须掌握以下三种表格,数据收集等;
SCHEMATA #包含了所有数据库名、类型、字符集等
TABLES #新建所有表的信息
COLUMNS #列的类型
可以开始进行联动查询;
2)查询SCHEMATA库
SELECT schema_name FROM information_schema.SCHEMATA LIMIT 0,1
此类查询出库中第一个表里的第一行数据;
SELECT schema_name FROM information_schema.SCHEMATA LIMIT 1,1
此类查询出库中第二个表里的第一行数据,下面以此类推
3)查询库中TABLES表
select * from information_schema.`TABLES` where TABLE_SCHEMA='ceshi' limit 0,1
查询出表中第一个数据信息;
在平常SQL注入中,不会直接写账号,需要转换下值:
select HEX('ceshi')
6365736869
select * from information_schema.`TABLES` where TABLE_SCHEMA=0x6365736869 limit 0,1
可以看到通过转值查询也是没问题的,该思路对于后期SQL注入更好的理解;
4)查询COLUMNS列
select COLUMN_NAME from information_schema.`COLUMNS` where TABLE_SCHEMA=0x6365736869 and TABLE_NAME='biao1'
或者:
select COLUMN_NAME from information_schema.`COLUMNS` WHERE TABLE_NAME='biao1'
5)综合查询
select id,username,password from ceshi.biao1
#通过information_schema系统库里面表来查询其他库表的数据,跨库查询需要权限比较大的时候才可以的
七、总结
经历完Mysql数据库的基础篇操作后,熟悉了查询数据七种方法,高级查询四种方法,子查询、内连接、左右连接、information_schema数据库表操作等等,当然还有很多渗透的方式方法,在高级篇会详细讲解!到这里就已经结束了数据库五章的渗透学习,想要入门渗透,这些必须得牢记掌握!知识点有:
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)......
接下来在《服务攻防之数据库MSSQL(上)》中会接触到如何对数据MSSQL的安装、漏洞的分析详解等操作,请看下篇服务攻防之数据库MSSQL上篇章!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
