
PoC of CVE-2025-22783
WordPress-Plugin
Component name SEO-Plugin von Squirrly SEO
Vulnerable version <= 12.4.01
Component slug squirrly-seo
Component link https://wordpress.org/plugins/squirrly-seo/
Vulnerability class A3: Injection
Vulnerability type SQL-Injection
Contributor +
Das SEO-Plugin von Squirrly SEO ermöglicht es Ihnen, die SEO Ihrer Website durch eine interne Verlinkungsfunktion zu verbessern, die es Ihnen erlaubt, Quell- und Zielseiten basierend auf bestimmten Schlüsselwörtern auszuwählen. Sie können die Schlüsselwörter, Quellseiten, Zielseiten und den Status jedes Links über die Verwaltungsseite für interne Links verwalten (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks).
In Version 12.4.01 und niedriger des Squirrly SEO-Plugins können Sie auf der Verwaltungsseite für interne Links nach erstellten internen Links suchen. Eine SQL-Injection-Schwachstelle tritt auf, wenn von Benutzern (Contributor+) eingegebene Suchbegriffe ohne Validierung direkt an Datenbankabfragen übergeben werden.
Während Suchergebnisse nicht direkt auf der Verwaltungsseite für interne Links angezeigt werden, können Datenbankinformationen mithilfe von zeitbasierten SQL-Injection-Techniken wie der SLEEP-Funktion extrahiert werden.
Melden Sie sich auf der Zielseite mit einem Konto an, das über Contributor- oder höhere Berechtigungen verfügt, auf dem das Squirrly SEO-Plugin in Version 12.4.01 oder niedriger installiert ist.
Wenn Sie dann auf die folgende URL zugreifen, da die IF-Anweisungsbedingung '1=1' im SQL-Injection-Payload immer wahr ist, wird die Funktion SLEEP(5) ausgeführt und die Seite wird nach 5 Sekunden geladen.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=1,SLEEP(5),1)),2,3,4,5,6,7%23
Wenn Sie die IF-Anweisungsbedingung hingegen auf '1=2' ändern, wird die Seite sofort geladen, da der Ergebniswert falsch ist.
http://localhost:8080/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks&stype&squery='+AND+1%3D2)+UNION+SELECT+(IF(1=2,SLEEP(5),1)),2,3,4,5,6,7%23
Auf der Verwaltungsseite für interne Links (/wp-admin/admin.php?page=sq_focuspages&tab=innerlinks) des Squirrly SEO-Plugins wird bei der Suche nach internen Links die Datenbank abgefragt, indem die Funktion getSqInnerlinks in der Datei /wp-content/plugins/squirrly-seo/models/Qss.php aufgerufen wird.

An dieser Stelle sehen wir, dass die Variable $query_where direkt in die SQL-Abfrage eingefügt wird. Lassen Sie uns untersuchen, wie der Wert der Variablen $query_where konstruiert wird:
$search enthält den bei der internen Linksuche eingegebenen Suchbegriff, und die Funktion sanitize_text_field wird verwendet, um die Benutzereingabedaten zu verarbeiten.$search als Teil der Bedingungsklausel verwendet und in der Variablen $query_where gespeichert.$query_where werden zusätzliche Bedingungen hinzugefügt, und über die Funktion apply_filters werden Filter angewendet.Daher wird der von Benutzern bei der internen Linksuche eingegebene Suchbegriff zwar von der Funktion sanitize_text_field verarbeitet, aber diese Funktion kann SQL-Injection-Angriffe nicht verhindern. In SQL-Abfragen verwendete Sonderzeichen (einfache Anführungszeichen ('), Kommentare (#) usw.) werden nicht gefiltert, und wenn die Variable $search mit SQL-Injection-Payload ohne ordnungsgemäße Maskierung an die Datenbankabfrage übergeben wird, entsteht eine SQL-Injection-Schwachstelle.
⚠️ Der implementierte PoC-Code meldet sich mit einem Administratorkonto an, um ein Konto mit minimalen Berechtigungen (Contributor+) zu erstellen, die für die Reproduktion der Schwachstelle erforderlich sind, und löst dann die Schwachstelle mit diesem Konto aus.

Geben Sie als Nächstes den folgenden Befehl ein, um den PoC-Code auszuführen.
Erforderliches Modulrequests
python poc.py
