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 主流工具

  1. joomscan - Perl开发的Joomla扫描工具

    • 自动化漏洞利用
    • 版本枚举
    • 组件枚举(支持1209款热门组件)
    • 组件漏洞枚举(1030+漏洞利用)
    • 防火墙检测
    • 导出数据功能
  2. 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方法

  1. 语言包getshell

    • 修改语言包文件添加shell
    • 通过上传文件安装扩展
    • 访问/administrator/language/zh-CN/shell.php
  2. 媒体文件getshell

    • 后台 -> 全局配置 -> 媒体文件添加php扩展
    • 上传shell文件(注意版本限制)
  3. 模板编辑getshell

    • 编辑模板文件(如error.php)插入shell代码
    • 访问模板对应的error.php文件

6. 安全防护建议

  1. 及时更新:保持Joomla核心、组件和插件的最新版本
  2. 权限控制:合理配置用户组权限,遵循最小权限原则
  3. 密码策略:启用强密码策略,使用多因素认证
  4. 日志监控:定期检查行为日志,监控异常活动
  5. 文件权限:严格控制文件和目录权限
  6. 禁用不必要功能:如不需要用户注册,应禁用此功能
  7. 定期备份:建立完整的数据备份策略

7. 多因素认证(MFA)配置

Joomla支持四种MFA认证方式:

  1. 基于时间的一次性密码(TOTP)
  2. YubiKey硬件认证
  3. WebAuthn标准
  4. 电子邮件验证码

配置步骤:

  1. 启用相关插件(plg_multifactorauth_*)
  2. 在系统设置->用户管理->多因素认证中配置
  3. 用户个人设置中启用MFA

注意:正确关闭MFA的步骤是先全局设置为"无用户组",再在个人设置中关闭。

Joomla ! 安全技术研究教学文档 1. Joomla ! MVC架构概述 Joomla是基于MVC(Model-View-Controller)架构的内容管理系统: 模型(Model) :负责数据和业务逻辑,处理数据的存取和转换,通常与数据库交互 视图(View) :负责展示数据,生成用户界面,对应布局文件和模板 控制器(Controller) :接收用户输入,调用模型处理数据,选择视图进行显示 2. 环境搭建与调试 2.1 使用Docker搭建Joomla 4.2.7环境 2.2 docker-compose配置 3. Joomla目录结构分析 4. 数据库结构与安全研究 4.1 行为日志相关表 action_ log_ config表结构 action_ logs表结构 4.2 用户和权限表 users表结构 usergroups表结构 4.3 用户密码加密算法 从Joomla 3.2.0版本开始使用PHP自带的 password_hash() 和 password_verify() 函数进行密码散列,默认使用bcrypt算法。 实现位于 /libraries/vendor/joomla/authentication/src/Password/BCryptHandler.php : 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的步骤是先全局设置为"无用户组",再在个人设置中关闭。