MySQL安全测试实战:从SQL注入到UDF提权的完整渗透链解析
2026/8/28 11:33:17 网站建设 项目流程

1. 赛题场景还原与核心挑战拆解

2022年的那场中职网络空间安全国赛,B模块的MYSQL安全测试环节,可以说给当时参赛的选手们留下了深刻的印象。它不像一些基础题目那样,只是让你配置个权限或者写个简单的注入语句就完事了。这个模块的设定,更像是一个微缩版的真实渗透测试场景,你需要从一个“外部攻击者”的视角出发,去发现、利用并最终控制一个存在多处安全缺陷的MYSQL数据库服务。很多队伍在这里折戟,不是因为技术点有多高深,而是因为对“安全测试”的理解还停留在工具扫描和固定套路上,缺乏系统性的分析和逻辑串联能力。

这个模块的核心,我认为可以概括为“在限定条件下的深度利用”。题目通常会给你一个模拟的靶机环境,上面运行着一个特定版本的MYSQL服务。你的目标很明确:获取数据库中的特定敏感信息(Flag),或者拿到数据库的最高权限。但路径绝不是直通车的。它可能混合了弱口令、权限配置不当、SQL注入、数据库特性漏洞(如UDF提权)、甚至是利用MYSQL去攻击操作系统等多个层面的知识点。你需要像解连环锁一样,一步步解开前置条件,才能触及最终目标。比如,你可能先通过一个前端的注入点拿到一个低权限的数据库用户,然后利用这个用户的权限去读取系统文件,从中发现另一个高权限用户的密码哈希,接着破解或复用这个哈希,最终完成权限提升。整个过程考验的是你对MYSQL安全体系的理解深度和灵活运用能力。

2. 典型漏洞利用链的深度剖析

国赛级别的题目,很少会只考察一个孤立的漏洞。更常见的是设计一条或多条漏洞利用链。下面,我结合常见的考点,拆解几条典型的攻击路径。

2.1 从Web注入到数据库权限获取

这是最经典的入口。题目往往会提供一个有SQL注入漏洞的Web应用。这里的第一个坑就是注入类型的判断与利用。不仅仅是普通的UNION查询,你可能需要用到基于时间的盲注(sleep())、基于布尔(if())的盲注,或者报错注入(extractvalue(),updatexml())。在比赛环境中,时间往往紧张,手工注入效率太低,所以熟练掌握sqlmap这样的工具进行快速探测和利用是基本素养。但工具不是万能的,sqlmap的默认Tamper脚本可能被WAF规则拦截,这时候就需要你根据实际情况,手动编写或修改Tamper脚本,对注入载荷进行混淆、分割,以绕过简单的过滤。

注意:在真实比赛和授权测试中,使用sqlmap--batch--threads参数可以节省大量时间,但务必先用手动测试确认存在注入点,避免盲目扫描对目标造成不必要的负载或触发警报。

通过注入,我们通常能获取到的第一个成果是数据库的连接信息,或者直接执行查询语句的权限。这时,你可能会拿到一个数据库用户,比如webuser@%。立刻通过SELECT CURRENT_USER();SELECT user, host FROM mysql.user WHERE user='webuser';来确认其精确身份和允许登录的主机范围。更重要的是,执行SHOW GRANTS FOR CURRENT_USER();SELECT * FROM mysql.user WHERE user='webuser'\G来详细查看其权限。一个常见的低权限配置是只有对某个应用数据库的SELECT,INSERT,UPDATE,DELETE权限,没有FILE,PROCESS,SUPER,CREATE USER等危险权限。

2.2. 低权限下的信息收集与横向移动

拿到一个低权限数据库用户,远不是终点,而是起点。你的信息收集工作才刚刚开始。

  1. 数据库内信息挖掘:查询information_schema库,摸清所有数据库、表、列的结构。寻找可能存储着其他系统密码、配置信息的表。国赛题目经常会把一些关键信息(如其他服务的密码、SSH私钥片段)藏在某个不起眼的用户表或配置表里。
  2. 利用LOAD_FILE()读取系统文件:这是低权限用户可能拥有的一个危险权限。如果用户有FILE权限,就可以使用SELECT LOAD_FILE(‘/etc/passwd’)来读取服务器上的文件。常见的敏感文件路径包括:
    • /etc/passwd,/etc/shadow(Linux用户密码)
    • /home/*/.bash_history,/home/*/.ssh/id_rsa(用户历史命令和SSH私钥)
    • Web应用的配置文件(如config.php,web.config),里面可能有更高权限的数据库连接字符串。
    • MYSQL自身的配置文件my.cnfmy.ini,可能包含其他安全配置信息。
  3. 利用INTO OUTFILE/DUMPFILE写文件:如果用户同时有FILE权限,并能写入Web目录,那么就可以尝试写入一个Web Shell。例如:SELECT ‘<?php system($_GET[“cmd”]); ?>’ INTO OUTFILE ‘/var/www/html/shell.php’。但在现代MYSQL和系统配置下,这通常受到secure_file_priv系统变量的严格限制。通过SHOW VARIABLES LIKE ‘secure_file_priv’;查看允许导出的目录。如果值为NULL,则禁止导出;如果为具体路径,则只能导出到该路径下。比赛环境可能会将此变量设置为Web根目录,为写Shell创造条件。

2.3. 权限提升的经典路径:UDF提权与漏洞利用

当你通过文件读取拿到了更高权限的数据库用户密码(可能是明文,也可能是MYSQL的mysql_native_password哈希),或者发现当前用户有INSERT权限可以修改mysql.user表(极罕见且需要特定条件),就可以尝试提升权限。但更常见、更经典的提权方式是UDF(User-Defined Function)提权

UDF提权的原理:MYSQL允许用户通过编写共享库(Linux下的.so文件,Windows下的.dll文件)来创建自定义函数。如果攻击者能将一个包含恶意代码的共享库文件写入到MYSQL插件目录,并创建函数指向它,那么就可以通过调用这个自定义函数来执行系统命令,从而以MYSQL服务进程(通常是mysqlsystemd)的身份运行命令。

提权步骤详解

  1. 确认插件目录SHOW VARIABLES LIKE ‘plugin_dir’;。这是关键一步,你必须把编译好的恶意UDF库文件写入这个目录。
  2. 检查secure_file_priv:如前所述,这决定了你是否能通过MYSQL将文件写入磁盘。如果限制很死,此路可能不通,需要寻找其他漏洞(如CVE)。
  3. 准备UDF库文件:在比赛环境中,通常需要你自行上传或利用现有文件。一种常见技巧是,如果MYSQL版本较低(如5.x),并且lib_mysqludf_sys.so(Linux)或lib_mysqludf_sys.dll(Windows)这类已知的UDF库已经存在于系统某处,你可以尝试用LOAD_FILE()读取其二进制内容,然后用SELECT … INTO DUMPFILE将其写入插件目录。但这要求你对二进制内容进行十六进制转换。更直接的方式是,如果题目环境提供了文件上传点,或者你能通过其他Web漏洞上传文件,可以先将UDF库上传到Web目录,然后利用MYSQL的LOAD DATA INFILE或系统命令将其复制到插件目录(这需要FILE权限和相应的路径访问权)。
  4. 创建UDF函数:假设你的库文件udf.so已成功放入/usr/lib/mysql/plugin/
    CREATE FUNCTION sys_exec RETURNS INTEGER SONAME ‘udf.so’;
    这条语句创建了一个名为sys_exec的函数,它调用udf.so库中的代码,执行系统命令并返回退出状态。
  5. 执行系统命令
    SELECT sys_exec(‘id > /tmp/test.txt’); SELECT LOAD_FILE(‘/tmp/test.txt’);
    第一条命令执行id并将结果输出到/tmp/test.txt,第二条命令读取结果,验证提权是否成功。

为什么UDF提权是重点?因为它完美结合了数据库漏洞(不当的FILE权限、可写的插件目录)和系统漏洞利用思想,是MYSQL安全测试中从“数据库用户”到“系统用户”身份跨越的标志性动作。比赛中,能否完成UDF提权,往往是区分成绩高低的关键。

3. 靶场环境搭建与针对性训练方法

纸上得来终觉浅,绝知此事要躬行。要真正掌握这些技能,必须自己动手搭建靶场进行练习。我推荐以下方法:

环境搭建:使用Docker是最快最干净的方式。你可以基于官方MYSQL镜像(如mysql:5.7)构建一个包含多种预设漏洞的镜像。在Dockerfile中,你可以:

  1. 修改my.cnf,故意将secure_file_priv设置为空或Web目录。
  2. 创建多个数据库用户,并赋予不同的、存在问题的权限组合(如给Web用户FILE权限)。
  3. 预置一个有SQL注入漏洞的Web应用(可以用DVWASQLi-Labs的Docker版)。
  4. 在容器内放置一些“Flag”文件或数据库记录。

训练流程

  1. 信息收集阶段:使用nmap扫描靶机,确定MYSQL端口(默认3306)开放,尝试版本探测。使用mysql客户端尝试空口令、弱口令(root/root, root/123456)连接。即使不成功,也要记录下版本信息,因为特定版本对应着已知的漏洞(如CVE-2012-2122身份认证绕过漏洞)。
  2. 漏洞利用阶段
    • Web注入:针对Web应用,系统性地测试每一个输入点。不仅关注GET/POST参数,还有Cookie、User-Agent、X-Forwarded-For等HTTP头。
    • 权限提升:在获得一个数据库会话后,立即执行SELECT user(), current_user();SHOW GRANTS;。规划利用路径:有FILE权限吗?secure_file_priv是什么?插件目录可写吗?系统有没有现成的UDF库?
    • 口令破解:如果读取到了mysql.user表的authentication_string字段(MYSQL 5.7+),可以使用hashcatjohn配合对应的哈希类型(mysqlna)进行离线破解。弱口令依然是安全演练中的高发问题。
  3. 模拟比赛压力训练:给自己设定时间限制,比如2小时内必须从外网渗透拿到Flag。记录下每个步骤花费的时间,分析瓶颈在哪里。是工具不熟练?是知识点遗忘?还是对漏洞链的理解不连贯?

4. 实战中的高频“坑点”与精妙技巧

在实际比赛和渗透测试中,有一些细节往往决定成败,这些在标准教材里不一定强调。

1. 关于secure_file_priv的绕过尝试:如果这个变量被设置为NULL,常规的INTO OUTFILE就失效了。但可以尝试: *日志文件写入:MYSQL的通用查询日志或慢查询日志的路径可能可控。尝试SET GLOBAL general_log_file = ‘/var/www/html/shell.php’; SET GLOBAL general_log = on;然后执行SELECT ‘<?php phpinfo(); ?>’;,最后关闭日志。这样,PHP代码就被写入到了日志文件(即Web Shell)中。但前提是你有SUPERFILE权限来修改全局变量,且日志目录Web可访问。 *利用SELECT … INTO DUMPFILE写入二进制文件DUMPFILEOUTFILE不同,它不会进行转义,且每行只写入一个值。对于写入二进制UDF库,DUMPFILE是必须的。但路径限制同样受secure_file_priv约束。

2. UDF库的版本兼容性与编译:这是最大的坑之一。UDF库必须与MYSQL服务器的版本、操作系统架构(x86/x64)完全匹配。从网上下载的现成.so文件很可能不兼容,导致CREATE FUNCTION时出现“Can‘t open shared library”“Function ‘sys_exec’ already exists”(其实是加载失败)的错误。最稳妥的方法是在与靶机相同或相似的系统环境上自行编译。比赛时,如果环境是提供的,可能需要你具备从源码编译UDF库的能力,或者题目会暗示UDF库的存放位置。

3. 权限的精确理解: *FILE权限:允许读写服务器主机上的文件。但能读/写哪里,还受操作系统权限(MYSQL进程用户的文件系统权限)和secure_file_priv的双重限制。 *SUPER权限:允许执行SET语句修改全局变量、进行复制管理等。在提权中常用于修改日志路径、启用/禁用日志等。 *PROCESS权限:允许查看当前正在执行的所有线程(即连接)。可以通过SHOW PROCESSLIST;或查询information_schema.PROCESSLIST来窥探其他连接执行的SQL语句,有时能发现敏感信息。

4. 利用MYSQL客户端漏洞:有时候,突破口不在服务器,而在客户端。如果题目是一个需要你连接的管理界面,可以尝试在连接参数(如主机名、数据库名)中注入。或者,如果服务器配置了local_infile=ON,客户端可以在连接时请求读取客户端本地的文件,如果服务器端用户有FILE权限,这可能造成客户端文件泄露。但这在比赛环境中不常见。

5. 保持连接与隐蔽性:在通过Web注入点执行命令时,你的SQL语句可能会被记录在应用日志或数据库日志中。尽量使用盲注,减少直接的回显。在通过UDF执行系统命令获取反弹Shell时,考虑使用ncbash -ipython -cphp -r等多种方式,因为靶机环境可能缺少某些工具。拿到Shell后,第一时间检查当前用户、sudo -l、SUID文件等,进行系统层面的权限维持和信息收集,因为最终的Flag可能不在数据库里,而是在文件系统中。

国赛的MYSQL安全测试,本质上是一场关于“知其然,更知其所以然”的考试。它要求你不仅会使用工具,更要理解每一个操作背后的数据库原理、权限模型和系统交互。从简单的注入到复杂的提权链,每一步都考验着你的基本功和临场串联能力。我建议在备战时,不要满足于“做出来”,而要深究“为什么能这么做”以及“还有没有别的路”。搭建自己的漏洞实验环境,反复演练不同的利用链,直到形成肌肉记忆。这样,当你在赛场上遇到那些经过精心伪装和组合的漏洞点时,才能迅速看穿本质,直击要害。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询