Joomla!安全技术研究
字数 1487 2025-08-23 18:31:34
Joomla! 安全技术研究教学文档
1. Joomla! MVC架构概述
Joomla是基于MVC(Model-View-Controller)架构的内容管理系统:
- 模型(Model):负责数据和业务逻辑,处理数据的存取和转换,通常与数据库交互
- 视图(View):负责展示数据,生成用户界面,对应布局文件和模板
- 控制器(Controller):接收用户输入,调用模型处理数据,选择视图进行显示
2. 环境搭建与调试
2.1 使用Docker搭建Joomla 4.2.7环境
FROM joomla:4.2.7-php8.1-apache
# 安装Xdebug
RUN pecl install xdebug-3.1.2 && docker-php-ext-enable xdebug
# 配置Xdebug
RUN echo 'xdebug.mode=debug' >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo 'xdebug.start_with_request=yes' >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo 'xdebug.client_host=host.docker.internal' >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo 'xdebug.client_port=9000' >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
2.2 docker-compose配置
version: "3.9"
services:
db:
image: mariadb:10.6.4-focal
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: joomla
volumes:
- ./database:/var/lib/mysql
joomla:
depends_on:
- db
build:
context: .
dockerfile: Dockerfile
image: joomla:4.2.7-php8.1-apache
restart: always
ports:
- 18081:80
environment:
JOOMLA_DB_HOST: db:3306
JOOMLA_DB_USER: root
JOOMLA_DB_PASSWORD: 123456
volumes:
- ./html:/var/www/html
3. Joomla目录结构分析
LICENSE.txt # Joomla许可证文件
README.txt # 安装和配置指南
administrator/ # 后台管理界面文件
api/ # API相关文件
cache/ # 缓存文件
cli/ # 命令行脚本
components/ # 组件文件
configuration.php # 主配置文件
htaccess.txt # Apache配置文件
images/ # 图片文件
includes/ # 核心PHP库
index.php # 主入口文件
language/ # 语言文件
layouts/ # 布局文件
libraries/ # 库文件
media/ # 媒体文件(CSS,JS等)
modules/ # 模块文件
plugins/ # 插件文件
robots.txt # 搜索引擎指南
templates/ # 模板文件
tmp/ # 临时文件夹
web.config.txt # IIS服务器配置文件
4. 数据库结构与安全研究
4.1 行为日志相关表
action_log_config表结构
CREATE TABLE `action_log_config` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type_title` varchar(255) NOT NULL DEFAULT '',
`type_alias` varchar(255) NOT NULL DEFAULT '',
`id_holder` varchar(255) DEFAULT NULL,
`title_holder` varchar(255) DEFAULT NULL,
`table_name` varchar(255) DEFAULT NULL,
`text_prefix` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
action_logs表结构
CREATE TABLE `action_logs` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`message_language_key` varchar(255) NOT NULL DEFAULT '',
`message` text NOT NULL,
`log_date` datetime NOT NULL,
`extension` varchar(50) NOT NULL DEFAULT '',
`user_id` int(11) NOT NULL DEFAULT 0,
`item_id` int(11) NOT NULL DEFAULT 0,
`ip_address` varchar(40) NOT NULL DEFAULT '0.0.0.0',
PRIMARY KEY (`id`),
KEY `idx_extension` (`extension`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 用户和权限表
users表结构
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(400) NOT NULL DEFAULT '',
`username` varchar(150) NOT NULL DEFAULT '',
`email` varchar(100) NOT NULL DEFAULT '',
`password` varchar(100) NOT NULL DEFAULT '',
`block` tinyint(4) NOT NULL DEFAULT 0,
`sendEmail` tinyint(4) DEFAULT 0,
`registerDate` datetime NOT NULL,
`lastvisitDate` datetime DEFAULT NULL,
`activation` varchar(100) NOT NULL DEFAULT '',
`params` text NOT NULL,
`lastResetTime` datetime DEFAULT NULL,
`resetCount` int(11) NOT NULL DEFAULT 0,
`otpKey` varchar(1000) NOT NULL DEFAULT '',
`otep` varchar(1000) NOT NULL DEFAULT '',
`requireReset` tinyint(4) NOT NULL DEFAULT 0,
`authProvider` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
KEY `idx_name` (`name`(100)),
KEY `idx_block` (`block`),
KEY `idx_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
usergroups表结构
CREATE TABLE `usergroups` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned NOT NULL DEFAULT 0,
`lft` int(11) NOT NULL DEFAULT 0,
`rgt` int(11) NOT NULL DEFAULT 0,
`title` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_lft_rgt` (`lft`,`rgt`),
KEY `idx_title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.3 用户密码加密算法
从Joomla 3.2.0版本开始使用PHP自带的password_hash()和password_verify()函数进行密码散列,默认使用bcrypt算法。
实现位于/libraries/vendor/joomla/authentication/src/Password/BCryptHandler.php:
class BCryptHandler implements HandlerInterface {
public function hashPassword($plaintext, array $options = []) {
return password_hash($plaintext, \PASSWORD_BCRYPT, $options);
}
public static function isSupported() {
return \function_exists('password_verify');
}
public function validatePassword($plaintext, $hashed) {
return password_verify($plaintext, $hashed);
}
}
5. 渗透测试技术
5.1 主流工具
-
joomscan - Perl开发的Joomla扫描工具
- 自动化漏洞利用
- 版本枚举
- 组件枚举(支持1209款热门组件)
- 组件漏洞枚举(1030+漏洞利用)
- 防火墙检测
- 导出数据功能
-
cmsmap - Python开发的跨平台CMS扫描工具
- 支持Joomla、WordPress、Drupal、Moodle
- 使用exploitdb进行扫描
5.2 漏洞利用案例
CVE-2023-23752 - 信息泄露漏洞
- 影响范围:4.0.0-4.2.7
- 漏洞本质:API不当访问控制检查
- EXP:
/api/index.php/v1/config/application?public=true - 利用:泄漏数据库账号密码,若开放3306端口可修改users表password字段
5.3 后台getshell方法
-
语言包getshell
- 修改语言包文件添加shell
- 通过上传文件安装扩展
- 访问
/administrator/language/zh-CN/shell.php
-
媒体文件getshell
- 后台 -> 全局配置 -> 媒体文件添加php扩展
- 上传shell文件(注意版本限制)
-
模板编辑getshell
- 编辑模板文件(如error.php)插入shell代码
- 访问模板对应的error.php文件
6. 安全防护建议
- 及时更新:保持Joomla核心、组件和插件的最新版本
- 权限控制:合理配置用户组权限,遵循最小权限原则
- 密码策略:启用强密码策略,使用多因素认证
- 日志监控:定期检查行为日志,监控异常活动
- 文件权限:严格控制文件和目录权限
- 禁用不必要功能:如不需要用户注册,应禁用此功能
- 定期备份:建立完整的数据备份策略
7. 多因素认证(MFA)配置
Joomla支持四种MFA认证方式:
- 基于时间的一次性密码(TOTP)
- YubiKey硬件认证
- WebAuthn标准
- 电子邮件验证码
配置步骤:
- 启用相关插件(
plg_multifactorauth_*) - 在系统设置->用户管理->多因素认证中配置
- 用户个人设置中启用MFA
注意:正确关闭MFA的步骤是先全局设置为"无用户组",再在个人设置中关闭。