利用SQLMAP获取os-shell的过程分析「UDF提权」
字数 1897 2025-08-25 22:58:40
SQLMAP获取os-shell过程分析:UDF提权技术详解
一、前置知识
1. MySQL文件操作限制条件
MySQL读写文件有两个主要限制条件:
-
用户权限限制:
- MySQL服务默认以mysql用户权限启动
- 没有危险目录的写入权限,如:
- /usr/lib64/mysql/plugin (root 755)
- /var/www/html (root 755)
- /var/spool/cron (root 700)
- /root/.ssh (root 700)
-
secure_file_priv参数限制:
- MySQL 5.6.34+版本默认值为NULL或指定目录(如/var/lib/mysql-files)
- 禁止在危险目录写入
2. 权限概念区分
- System root:操作系统root用户
- System mysql:操作系统mysql用户
- MySQL root:MySQL数据库root用户
- MySQL user:MySQL普通用户
二、环境准备
1. 默认测试环境
- 操作系统:CentOS 7.7.1908
- 数据库:MySQL 5.7.29
- 参数:--secure-file-priv=/var/lib/mysql-files
- 工具:SQLMAP 1.4.2
2. 关键参数说明
-d DIRECT:直接数据库连接字符串--os-shell:获取交互式操作系统shell
三、UDF提权获取System Shell
1. 常规情况下的失败
当MySQL以mysql用户启动时,尝试获取os-shell会失败:
sqlmap -d "mysql://root:`echo $pass`@172.16.58.130:3306/mysql" --os-shell --no-cast
错误提示:
[WARNING] it looks like the file has not been written (usually occurs if the DBMS process user has no write privileges in the destination path)
[ERROR] there has been a problem uploading the shared library
2. 成功条件配置
要使UDF提权成功,需要满足:
-
以root用户启动MySQL服务:
mysqld --user=root --secure_file_priv='' -
修改secure_file_priv参数:
- 在/etc/my.cnf的[mysqld]段添加:
user=root secure_file_priv='' - 重启MySQL服务
- 在/etc/my.cnf的[mysqld]段添加:
3. 检查secure_file_priv值
show global variables LIKE "secure_file_priv";
4. 成功获取shell
配置完成后执行:
sqlmap -d "mysql://root:`echo $pass`@172.16.58.130:3306/mysql" --os-shell --no-cast
成功流程:
- 建立MySQL连接
- 检测数据库架构(32位/64位)
- 获取插件目录绝对路径
- 上传UDF共享库文件
- 创建UDF函数(sys_exec和sys_eval)
- 获取交互式shell
5. 技术原理分析
-
UDF文件上传:
- 本地文件:
/tmp/sqlmap.../lib_mysqludf_sys...so - 远程路径:
/usr/lib64/mysql/plugin/libscwmi.so
- 本地文件:
-
UDF函数创建:
CREATE FUNCTION sys_exec RETURNS string SONAME 'libscwmi.so'; CREATE FUNCTION sys_eval RETURNS string SONAME 'libscwmi.so'; -
命令执行:
- 通过UDF函数执行系统命令
- 获取命令输出
6. 清理过程
退出时SQLMAP会:
- 删除UDF函数(sys_exec和sys_eval)
- 提示需要手动删除UDF共享库文件
四、常规注入获取Webshell
1. 基本流程
- 利用
SELECT ... INTO OUTFILE ... LINES TERMINATED BY上传小马 - 通过小马上传完整Webshell
- 使用Webshell执行命令(参数如cmd=whoami)
2. Webshell功能
Webshell可能使用的PHP函数:
- system()
- proc_open()
- shell_exec()
- passthru()
- popen()
- exec()
五、防御建议
-
不要以root用户运行MySQL:
- 官方明确警告此操作极其危险
- 任何有FILE权限的用户都能以root身份创建文件
-
合理配置secure_file_priv:
- 限制文件操作目录
- 需要修改配置文件并重启服务生效
-
目录权限控制:
- 避免给web目录(如/var/www/html)777权限
- 严格控制插件目录权限
六、技术总结
-
UDF提权关键点:
- MySQL服务运行用户权限
- secure_file_priv参数配置
- 插件目录可写权限
-
两种os-shell区别:
- UDF提权:获取System Shell(系统级权限)
- 常规注入:获取Webshell(受限于Web服务器权限)
-
实际利用条件:
- 需要MySQL高权限账户
- 需要能够修改MySQL服务配置
- 或系统管理员配置不当(如目录777权限)
七、参考资源
-
MySQL官方安全建议:
- Never run the MySQL server as the Unix root user
-
secure_file_priv参数文档:
- server-system-variables
-
SQLMAP支持的UDF:
- 内置MySQL和PostgreSQL的UDF so文件
-
抓包分析:
- 可参考附件中的Pcap示例