mysql 基础使用
mysql 登录
- 1.启动服务
进入mysql的bin目录,启动命令行1
net start mysql
- 2.登录数据库 密码要和-p连一起,数据库是分权限的,只有root用户有所有数据库的操作权限,其他的用户只能操作他所对应的数据库
1
mysql -h <服务器ip> -u <数据库用户名> -p<密码>
mysql 常用命令
数据库操作命令
- 1.创建数据库
1
create database <数据库名>;
- 2.创建表
1
create table <表名> (<字段名1> <字段类型> [<字段约束>],<字段名2> <字段类型> [<字段约束>],<...>);
- 3.插入数据
1
insert into exitdata (<字段名1>,<字段名2>) values (<数据1字段1内容>,<数据1字段2内容>),(<数据2字段1内容>,<数据2字段2内容>),(...);
- 4.修改数据
1
updata <表名> set <字段名> = <新值> where <条件>;
- 5.删除数据
1
delete from <表名> where <条件>; # 如果没有where+条件,会删除表下的所有数据,但会保留表结构
- 6.删除表/删除数据库
1
2
3
4# 删除表
drop table <表名>;
# 删除数据库
drop database <数据库名>;
数据库查询命令
- 1.查询数据库所有的库名
1
show databases;
- 2.查询数据库下所有的表名
1
2use <数据库名>;
show tables; - 3.查询表下有哪些字段
1
2
3describe <表名>;
或者
desc <表名>; - 4.查询表下所有字段的所有数据
1
select * from <表名>; # * 为所有字段
- 5.查询表下指定字段
1
select <字段名1>,<字段名2>,<...> from <表名>;
- 6.查询表下指定字段,并指定查询条件
1
2
3select <字段名1>,<字段名2>,<...> from <表名> where <查询条件>;
# 例如: (从logindata表中查询userid为1111的用户,并且给出该用户的userid和logintoken字段)
select userid,logintoken from logindata where userid=1111; - 7.列出表中不同的值 查询条件中,可以运用括号,or和and运算符用来创建更加复杂的查询条件
1
select distinct <字段名1>,<字段名2>,<...> from <表名> where <查询条件>;
其他查询:
1 | # 查看数据表存储引擎: |
order by关键字
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序(升序)
1 | # 字段所对应的序列号: 例如下面字段<字段1>字段序列号为1,当字段序列化超过select后面的字段数会报错(爆字段原理) |
like 语句
LIKE语句主要用于在WHERE子句中,以搜索匹配字段中的指定内容
- 语法:
1
where <字段> like <用于匹配的值> (and/or ...); # 可以用通配符模糊搜索
- 通配符:
LIKE主要支持两种通配符,分别是 _ 和 %:UNION 操作符1
2_ 代表匹配1个任意字符,常用于充当占位符。
% 代表匹配0个或多个任意字符。
UNION操作符用于将两个或更多的SELECT语句的结果组合到一个结果集中。这些SELECT语句默认会删除重复的数据,如果后面加上all则不会删除重复的数据 - 语法:
1
select <语句1> union (all) select <语句2>;
sql 注入
sql注入漏洞出现的关键
- 参数用户可控 如: ?id= 1 (不止于URL上面的参数)
- 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询
sql注入传参的方式
- get方式
- post方式
- xff方式(有ip记录功能的应用上(错误请求封ip,或记录后台登录的ip地址))
- cookie注入(身份验证)
sql注入的不同注入方式
盲注(用工具去操作,手工太麻烦了)
特点: sql语句执行但是不在前端返回数据(没有回显点),解决联合查询不行的情况,但是效率不行
- 基于布尔的盲注(逻辑判断):
有数据库输出判断标准,然后去猜解长度和名称 - 基于时间的盲注(延时判断):
使用(if,sleep进行拼接)然后用bp的repeater发包 观察右下角的响应时间是否有延迟 - 基于报错的盲注(报错回显):
如果开发者有对sql语句执行失败的报错处理,就可以使用一些函数来使他的报错处理显示出来并且带上我们需要的数据
堆叠注入(局限性较大)
用;
来注入多条sql语句,但是局限性较大
- 使用堆叠注入需要看数据库类型,支持的有 MySQL MSSQL PostgreSQL等,主要是看是否支持多条sql语句
- 使用堆叠注入需要看源代码怎么处理和执行sql语句
二次注入(挺常用)
原理是: 先插入恶意数据,然后再引用恶意数据,在找回密码处比较多(先注册一个用户名(存在恶意数据的用户名),然后找回密码去执行),因为开发者往往会信任已经存在数据库中的数据
dnslog带外注入(解决数据不回显,反向连接,比较鸡肋)
通过高权限用户让服务器去访问网站(dnslog.cn),然后通过这个网站来得到服务器数据的回显,一般是用来解决数据回显的(这种方法),用于注入相当鸡肋
反思: 如果我有高权限用户,我直接命令执行不是更好,但是他是可以解决数据不回显
不同sql操作的注入(增删改查)
因为部分sql操作是不需要进行前端数据回显的,只需要在数据库里执行就行,所有需要采用盲注才能得到结果
sql注入漏洞的攻击流程
- 判断注入点
- 根据经验判断数据库类型
- 根据数据库类型进行注入,获取敏感数据或者配置信息
- 看是否能够提权(如果是高权限用户,并且没有防护策略,可以通过load_file()去读取敏感文件,或者into outfile 去写入shell,如果遇到了mysql中 secure_file_priv参数设置的防护限制,可以尝试去通过得到sql执行环境(连上数据库或者通过phpmyadmin这种第三方组件来获得执行环境)来突破防护(通过启用MySQL中的慢日志记录来写入shell))
Access注入
简易注入:字典拆解
- 先用order by 语句判断字段数
- 然后用union select语句配合字典去得到敏感数据
缺点 可能字典不能够猜出来表名和列名
偏移注入:(已知表名的情况,不是特别多,遇到了网上搜blog)
Mysql注入流程(其他数据库都和mysql类似,就是注入语法不同而已)
获取信息
获取mysql版本(用
select version();
来获取)- 在mysql 5.0版本后 对应用户数据库中会有一个
information_schema
数据库,这个数据库中会存储数据库中的一些信息,如:数据库名,表名,列名,索引名等
数据库名在SCHEMATA表中 表名在TABLES表中,列名在COLUMNS表中,索引名在STATISTICS表中1
2
3
4
5
6// 查询所有数据库的名称
SELECT schema_name FROM information_schema.schemata;
// 查询某数据库的所有表名
SELECT table_name FROM information_schema.tables WHERE table_schema = '数据库名';
// 查询某个表中所有列的名称和数据类型
SELECT column_name, data_type FROM information_schema.columns WHERE table_schema = '数据库名' AND table_name = '表名'; - 如果是mysql 5.0以下版本 就只能通过字典去爆破数据库名等
- 在mysql 5.0版本后 对应用户数据库中会有一个
获取当前用户权限(DBA)(用
select user();
来获取)
由于Mysql有用户权限设置,所以针对Mysql的注入分为两种d- 非Root的注入攻击: 常规类的猜解
- Root的注入攻击: 文件读写操作,跨库查询注入等
获取当前操作系统(大小写判断或者用
select @@version_compile_os
来获取)
构造payload攻击
- 根据获取的信息先爆库名然后表名然后列名最后数据
- 如果是Root的话就可以进行跨库查询(access数据库没有权限设置)
sql注入的类型
数字型(0-9)
记得用–+或者 # 去注释后面的代码
字符型(a-z,中文,标点符号)
在数字型上面加入了单引号,要使用单引号去拼接
搜索型
在字符型上面添加了通配符,需要用通配符和单引号去拼接
但是后面(用–+)注释会报错,原因: 后面的语句会变成 --+%'
然后产生报错 此时不能用--+
需要用 and '%'='
拼接为and '%'='%'
永真式来绕过
编码型
数据以编码值传递
发送编码值 -> 解码 -> 执行sql -> 返回结果
payload需要编码来提交
加密型
数据以加密的密文去发送
格式型
数据如格式化形式发送 如:JSON{"key":"value"}
如果是注入value的话,由于取的值是双引号内的值
payload:value' union select 1,2,3#
SQL注入工具(SqlMap)
使用sqlmap前 最好先手工判断好注入点 然后用*标记注入点来注入
SqlMap 数据库注入数据猜解
1 | --is-dba 查看数据库当前用户权限 |
SqlMap 联动tamper脚本
1 | --tamper=<tamper脚本名称> 使用tamper脚本 |
SqlMap 高权限注入读写执行
1 | --file-read 读取文件 |
SqlMap 高权限注入联动MSF
先用msf生成后门和监听,然后用目标机去执行命令下载后门,执行后门 然后用msf来控制