Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-79387-PbootCMS-SQL-Injection — Prueba de concepto para CVE-2026-79387, una inyección SQL autenticada en la gestión de usuarios de PbootCMS que permite actualizaciones arbitrarias de campos y la toma de control de cuentas. | Kitploit
Herramientas/GitHubGitHub/jhli07/cve-2026-79387-pbootcms-sql-injection
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de Penetración
GitHubjhli07/cve-2026-79387-pbootcms-sql-injection

CVE-2026-79387-PbootCMS-SQL-Injection

Prueba de concepto para CVE-2026-79387, una inyección SQL autenticada en la gestión de usuarios de PbootCMS que permite actualizaciones arbitrarias de campos y la toma de control de cuentas.

Ver Repositorio
47hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-79387: Inyección SQL en el módulo de gestión de usuarios de PbootCMS V3.2.5

Descripción general

CampoDetalle
ID de CVECVE-2026-79387
ProductoPbootCMS
Versiones afectadas3.2.0 – 3.2.5, y posiblemente anteriores
Tipo de vulnerabilidadInyección SQL (CWE-89)
Vector de ataqueRemoto (Autenticado)
Gravedad CVSSAlta
DescubridorJiahaoLi
Proveedorhttps://www.pbootcms.com/

Descripción de la vulnerabilidad

Existe una vulnerabilidad de inyección SQL en el módulo de gestión de usuarios de PbootCMS V3.2.5. La vulnerabilidad reside en el método mod() de /apps/admin/controller/system/UserController.php (línea 149) y en el método modUser() de /apps/admin/model/system/UserModel.php.

El parámetro field es totalmente controlado por el usuario a través de una solicitud GET sin ninguna validación de lista blanca. El parámetro value es igualmente controlado por el usuario y se concatena directamente en la sentencia SQL UPDATE. Un atacante autenticado puede especificar cualquier columna de la base de datos como field (por ejemplo, password, username, status, role), lo que permite la manipulación arbitraria de datos.

Causa raíz

// UserController.php - mod() method
if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) {
    if ($this->model->modUser($ucode, "$field='$value',update_user='" . session('username') . "'")) {
        location(- 1);
    }
}

$field y $value se toman directamente del superglobal $_GET y se concatenan en una cadena SQL sin sanitización, sin lista blanca y sin consulta parametrizada. Esta cadena se pasa luego a UserModel::modUser(), que la reenvía al método base Model::update(). Dado que el argumento es una cadena (no un array), evita la validación de nombres de campo de checkKey() y se incrusta literalmente en la cláusula SET:

UPDATE ay_user SET <user-controlled>= '<user-controlled>', update_user='admin' WHERE ucode='<ucode>'

Cadena de llamadas

GET /admin.php?p=/User/mod&ucode=10002&field=password&value=<MD5>
  → UserController::mod()
    → UserModel::modUser($ucode, "password='<value>',update_user='admin'")
      → Model::table('ay_user')->where("ucode='$ucode'")->update($data_string)
        → SQL: UPDATE ay_user SET password='<value>',update_user='admin' WHERE ucode='10002'

Impacto

Un atacante autenticado puede:

  1. Modificar la contraseña de cualquier usuario — incluido el superadministrador (excepto el fundador integrado ucode=10001).
  2. Alterar el estado de la cuenta — habilitar o deshabilitar cuentas arbitrarias.
  3. Inyectar SQL más profundo — el parámetro value permite el escape de comillas simples, lo que potencialmente habilita ataques apilados o basados en tautologías.

Esto conduce a la toma de control de cuentas y al control total del backend del CMS.

Pasos de reproducción

Requisitos previos

  • PbootCMS V3.2.5 instalado localmente (probado en 192.168.1.104, Apache/PHP 7.2.1/SQLite)
  • Una cuenta de administrador de backend válida

Paso 1: Iniciar sesión en el panel de administración

Acceda al panel de administración de PbootCMS e inicie sesión con la cuenta predeterminada admin.

Admin Dashboard

Paso 2: Crear un usuario objetivo

Navegue a System Management → User Management → Add User. Cree un nuevo usuario:

  • Nombre de usuario: admin2
  • Contraseña: admin
  • Rol: System Administrator

Create User

Paso 3: Verificar que el usuario existe

La lista de usuarios confirma admin2 con ucode=10002:

User List

Paso 4: Confirmar la contraseña inicial

Abra una nueva ventana del navegador. Intente iniciar sesión como admin2 con la contraseña 123456 — esto falla porque la contraseña real es admin:

Login Failed

Paso 5: Elaborar y ejecutar el payload

Usando el navegador del administrador que ya tiene sesión iniciada, navegue a:

http://192.168.1.104/PbootCMS/admin.php?p=/User/mod&ucode=10002&field=password&value=14e1b600b1fd579f47433b88e8d85291

14e1b600b1fd579f47433b88e8d85291 es el hash MD5 de 123456.

El método mod() ejecuta la inyección y redirige mediante location(-1):

Payload ejecutado - No encontrado

Paso 6: Verificar el cambio de contraseña

Ahora intenta iniciar sesión con admin2 / 123456:

Inicio de sesión exitoso

La contraseña se ha cambiado correctamente mediante inyección SQL. El usuario ahora ha iniciado sesión con la nueva contraseña, lo que confirma la toma de control total de la cuenta.

Análisis del código fuente

Código vulnerable (UserController.php, línea ~149)

Código fuente

Capa de base de datos (Model.php - método update)

Cuando update() recibe un argumento de tipo string, este se utiliza tal cual en la cláusula SET sin ningún tipo de escape:

final public function update($data = null)
{
    if (is_array($data)) {
        // Array path: checkKey() validates field names
        ...
    } else {
        // String path: NO VALIDATION AT ALL
        $update_string = $data;
    }
    $this->sql['value'] = $update_string;
    $sql = $this->buildSql($this->updateSql);
    return $this->getDb()->amd($sql);  // Direct execution, no prepared statement
}

Remediación

  1. Validación mediante lista blanca en el parámetro field — permitir únicamente nombres de columna conocidos (status, username, realname, password).
  2. Consultas parametrizadas — usar sentencias preparadas en lugar de concatenación de cadenas.
  3. Escapar la entrada del usuario — como mínimo, sanear $value para evitar la ruptura de comillas.
  4. Forzar el hash de contraseñas — si field es password, aplicar encrypt_string() al valor antes de almacenarlo.
  5. Restringir la ruta de modificación independiente — la rama de "modificación de un solo campo" en mod() debería requerir un token CSRF válido y una comprobación de autorización por nivel de rol.

Referencias

  • Sitio web oficial de PbootCMS
  • Código fuente de PbootCMS en Gitee
  • CVE-2026-79387

Descargar herramienta