尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MySQL安全测试实战:从SQL注入到UDF提权的完整渗透链解析

MySQL安全测试实战:从SQL注入到UDF提权的完整渗透链解析 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 userwebuser;来确认其精确身份和允许登录的主机范围。更重要的是执行SHOW GRANTS FOR CURRENT_USER();或SELECT * FROM mysql.user WHERE userwebuser\G来详细查看其权限。一个常见的低权限配置是只有对某个应用数据库的SELECT,INSERT,UPDATE,DELETE权限没有FILE,PROCESS,SUPER,CREATE USER等危险权限。2.2. 低权限下的信息收集与横向移动拿到一个低权限数据库用户远不是终点而是起点。你的信息收集工作才刚刚开始。数据库内信息挖掘查询information_schema库摸清所有数据库、表、列的结构。寻找可能存储着其他系统密码、配置信息的表。国赛题目经常会把一些关键信息如其他服务的密码、SSH私钥片段藏在某个不起眼的用户表或配置表里。利用LOAD_FILE()读取系统文件这是低权限用户可能拥有的一个危险权限。如果用户有FILE权限就可以使用SELECT LOAD_FILE(‘/etc/passwd’)来读取服务器上的文件。常见的敏感文件路径包括/etc/passwd,/etc/shadowLinux用户密码/home/*/.bash_history,/home/*/.ssh/id_rsa用户历史命令和SSH私钥Web应用的配置文件如config.php,web.config里面可能有更高权限的数据库连接字符串。MYSQL自身的配置文件my.cnf或my.ini可能包含其他安全配置信息。利用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表极罕见且需要特定条件就可以尝试提升权限。但更常见、更经典的提权方式是UDFUser-Defined Function提权。UDF提权的原理MYSQL允许用户通过编写共享库Linux下的.so文件Windows下的.dll文件来创建自定义函数。如果攻击者能将一个包含恶意代码的共享库文件写入到MYSQL插件目录并创建函数指向它那么就可以通过调用这个自定义函数来执行系统命令从而以MYSQL服务进程通常是mysql或systemd的身份运行命令。提权步骤详解确认插件目录SHOW VARIABLES LIKE ‘plugin_dir’;。这是关键一步你必须把编译好的恶意UDF库文件写入这个目录。检查secure_file_priv如前所述这决定了你是否能通过MYSQL将文件写入磁盘。如果限制很死此路可能不通需要寻找其他漏洞如CVE。准备UDF库文件在比赛环境中通常需要你自行上传或利用现有文件。一种常见技巧是如果MYSQL版本较低如5.x并且lib_mysqludf_sys.soLinux或lib_mysqludf_sys.dllWindows这类已知的UDF库已经存在于系统某处你可以尝试用LOAD_FILE()读取其二进制内容然后用SELECT … INTO DUMPFILE将其写入插件目录。但这要求你对二进制内容进行十六进制转换。更直接的方式是如果题目环境提供了文件上传点或者你能通过其他Web漏洞上传文件可以先将UDF库上传到Web目录然后利用MYSQL的LOAD DATA INFILE或系统命令将其复制到插件目录这需要FILE权限和相应的路径访问权。创建UDF函数假设你的库文件udf.so已成功放入/usr/lib/mysql/plugin/。CREATE FUNCTION sys_exec RETURNS INTEGER SONAME ‘udf.so’;这条语句创建了一个名为sys_exec的函数它调用udf.so库中的代码执行系统命令并返回退出状态。执行系统命令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中你可以修改my.cnf故意将secure_file_priv设置为空或Web目录。创建多个数据库用户并赋予不同的、存在问题的权限组合如给Web用户FILE权限。预置一个有SQL注入漏洞的Web应用可以用DVWA、SQLi-Labs的Docker版。在容器内放置一些“Flag”文件或数据库记录。训练流程信息收集阶段使用nmap扫描靶机确定MYSQL端口默认3306开放尝试版本探测。使用mysql客户端尝试空口令、弱口令root/root, root/123456连接。即使不成功也要记录下版本信息因为特定版本对应着已知的漏洞如CVE-2012-2122身份认证绕过漏洞。漏洞利用阶段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可以使用hashcat或john配合对应的哈希类型mysqlna进行离线破解。弱口令依然是安全演练中的高发问题。模拟比赛压力训练给自己设定时间限制比如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中。但前提是你有SUPER或FILE权限来修改全局变量且日志目录Web可访问。 *利用SELECT … INTO DUMPFILE写入二进制文件DUMPFILE与OUTFILE不同它不会进行转义且每行只写入一个值。对于写入二进制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_infileON客户端可以在连接时请求读取客户端本地的文件如果服务器端用户有FILE权限这可能造成客户端文件泄露。但这在比赛环境中不常见。5. 保持连接与隐蔽性在通过Web注入点执行命令时你的SQL语句可能会被记录在应用日志或数据库日志中。尽量使用盲注减少直接的回显。在通过UDF执行系统命令获取反弹Shell时考虑使用nc、bash -i、python -c或php -r等多种方式因为靶机环境可能缺少某些工具。拿到Shell后第一时间检查当前用户、sudo -l、SUID文件等进行系统层面的权限维持和信息收集因为最终的Flag可能不在数据库里而是在文件系统中。国赛的MYSQL安全测试本质上是一场关于“知其然更知其所以然”的考试。它要求你不仅会使用工具更要理解每一个操作背后的数据库原理、权限模型和系统交互。从简单的注入到复杂的提权链每一步都考验着你的基本功和临场串联能力。我建议在备战时不要满足于“做出来”而要深究“为什么能这么做”以及“还有没有别的路”。搭建自己的漏洞实验环境反复演练不同的利用链直到形成肌肉记忆。这样当你在赛场上遇到那些经过精心伪装和组合的漏洞点时才能迅速看穿本质直击要害。
返回列表