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-2018-7747 — CalderaForms 1.5.9.1 XSS (WordPress-Plugin) - Tutorial | Kitploit
Tools/GitHubGitHub/mindpr00f/cve-2018-7747
SchwachstellenanalyseWebanwendungs-ExploitationWebsicherheitCTFPenetrationstestsLernen & Bildung
GitHubmindpr00f/cve-2018-7747

CVE-2018-7747

CalderaForms 1.5.9.1 XSS (WordPress-Plugin) - Tutorial

Repository anzeigen
vor 8 JahrenNoch 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-2018-7747

CalderaForms 1.5.9.1 XSS (WordPress-Plugin) - Tutorial


CalderaForm ist ein WordPress-Plugin, mit dem sich einfach per Drag & Drop Formulare erstellen lassen. Im Rahmen einer aktuellen Tätigkeit habe ich einige Portale getestet, auf denen genau ein solches, mit diesem Plugin erstelltes Kontaktformular gehostet wurde. Die benutzerdefinierte Konfiguration der betreffenden Instanz ermöglichte es mir, eine Sicherheitslücke zu finden: Aufgrund ihrer einfachen, lehrbuchhaften Natur denke ich, dass sie ein guter Anlass ist, um Einsteigern einige Mechanismen zu veranschaulichen.

Ausschließlich zu Lehrzwecken – diese Informationen nicht zum Testen von Zielen ohne ausdrückliche Genehmigung oder für illegale Zwecke verwenden – nicht nach dem Essen in kaltes Wasser springen – sich bei Hitze zwiebelartig anziehen

Für den vollständigen Exploit:
https://www.exploit-db.com/exploits/44489/
Für die CVE:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7747


KONFIGURATION

In der untersuchten Konfiguration war das Formular so eingestellt, dass es dem Benutzer mit einer Dankesnachricht antwortet, die ihn mit dem gerade eingegebenen Namen anspricht.

Um die Testumgebung nachzubauen, installieren Sie lokal eine WordPress-Instanz und das Plugin CalderaForms Version 1.5.9.1 (verfügbar hier oder hier).

Nach der Installation: Über die WordPress-Administrationskonsole > linke Spalte > „Caldera Forms“ > obere Buttons > „New Form“ > Contact Form auswählen, umbenennen und „Create Form“

alt text

Nach der Erstellung kann die Konfiguration geändert werden: Obere Buttons > „Form Settings“ > Die Erfolgsmeldung (Success Message) so ändern, dass sie einen der vom Benutzer eingegebenen Daten enthält. Klicken Sie auf das Feld, es erscheint eine Dropdown-Liste mit Vorschlägen. Fügen Sie %first_name% hinzu

alt text

Obere Buttons > „Save Form“

Um das Formular in eine Seite einzufügen: Linke Spalte > „Pages“ > „Sample Page“ > „Edit“ > „Caldera Form“ > das gerade erstellte Formular auswählen > „Insert Form“ > rechte Spalte > „Update“

alt text

Erledigt.


ERKENNUNG UND IDENTIFIZIERUNG DES ANGRIFFSVEKTORS

Lassen Sie uns Schritt für Schritt die notwendigen Schritte zur Durchführung dieser Art von Angriff nach dem Prinzip „Teile und herrsche“ durchgehen.

Während des Tests, wenn man mit einer Komponente interagiert, muss man stets auf ihre Reaktionen auf die gegebenen Reize achten; insbesondere konzentrieren wir uns auf den „Weg“ der von uns eingegebenen Daten und etwaige Veränderungen, die sie durchlaufen.

Ein konkretes Beispiel für unseren Fall ist das Folgende:

  1. Wir besuchen die Seite mit dem Formular: http://127.0.0.1/wordpress/sample-page/

  2. Wir füllen das Formular mit den folgenden Daten aus
    "First Name": myName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  3. Die Daten werden gemäß der Plugin-Logik verarbeitet

  4. Die erhaltene Dankesnachricht enthält die von uns im Feld First Name eingegebene Zeichenfolge
    "Thank you myName, form has been successfully submitted."

alt text

Die von uns im Feld „First Name“ eingegebene Zeichenfolge wird in der Dankesnachricht zurückgegeben.
Insbesondere ist die Zeichenfolge in einem HTML-div-Tag enthalten.
Unsere Eingabe landet im HTML der Seite.
Bemerkung: „Gefällt uns. Wir haben einen Berührungspunkt.“

Machen wir einen Schritt vorwärts. Wie wird unsere Eingabe während der Phase, die wir „Verarbeitung“ (Punkt 2) genannt haben, behandelt? Insbesondere wollen wir wissen: Gibt es Einschränkungen bei den Zeichen (und deren Kombinationen), die wir verwenden können? Das Ziel ist natürlich, „Zeug“ injizieren zu können. Bei dem Versuch einer Injektion muss man im Hinterkopf behalten, wo unsere Eingabe landet, und die entsprechende „Sprache“ verwenden.

  • Wird unsere Eingabe von einem SQL-Interpreter verarbeitet? Dann müssen wir seine Sprache sprechen.
  • Wird unsere Eingabe von einem PHP-Skript verarbeitet? Dann müssen wir seine Sprache sprechen.
  • Unsere Eingabe landet auf einer HTML-Seite? ...

Daher interessiert uns, ob wir die typischen HTML-Zeichen und -Konstrukte verwenden können, und insbesondere, ob wir angesichts der Fähigkeit dieser Sprache, JavaScript zu enthalten/interpretieren, eine Strategie finden, um unseren Code in der „Landezone“, also dem zuvor bemerkten div-Tag, zu platzieren.

Dazu fügen wir im Feld „First Name“ ein einfaches HTML-Tag ein und beobachten, ob es „bereinigt“ (sanitized) wird, also so modifiziert, dass es harmlos/nicht interpretierbar gemacht wird, oder ob es uns unverändert zurückgegeben wird. Wir verwenden zu diesem Zweck ein <br>-Tag, das zum Einfügen eines Zeilenumbruchs im Text verwendet wird.

Unter Bezugnahme auf die vorherige Nummerierung:

  1. Wir füllen das Formular mit den folgenden Daten aus
    "First Name": m<br>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. Die Dankesnachricht enthält unser HTML-Tag, das nicht verändert wurde, und es wird korrekt interpretiert, indem ein Zeilenumbruch in der Mitte der Nachricht eingefügt wird

root@kitploit:~
"Thank you m  
yName, form has been successfully submitted."

alt text

Bemerkung: „Gefällt uns. Wir können die Zeichen < und > verwenden, wir können HTML-Tags einfügen, die nicht bereinigt und interpretiert werden.“

Schritt weiter. Ersetzen wir das Formatierungstag durch etwas Nützlicheres, wie ein <script>-Tag, mit dem wir JavaScript-Code innerhalb der Seite einfügen und ausführen können.

  1. Wir füllen das Formular mit den folgenden Daten aus
    "First Name": m<script>alert(1);</script>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. Die Dankesnachricht enthält unser HTML-Tag, das nicht verändert wurde und korrekt interpretiert wird, und zeigt uns eine Alert-Box an

alt text

Bemerkung 1: „Gefällt uns. Wir können beliebigen JavaScript-Code im Kontext des Benutzerbrowsers ausführen.“
Bemerkung 2: „Gefällt uns nicht. Der Benutzer, der das JavaScript ausführt, sind wir selbst.“


SPEICHERN UND ABRUFEN

Die Situation ist folgende: Wir können JavaScript über eine von uns nicht kontrollierte Website im Kontext des Browsers eines Benutzers ausführen, aber dieser Benutzer ist momentan derjenige, der die Werte in das Formular eingibt. Das ist ziemlich nutzlos.
Die Idee ist: Gibt es eine Möglichkeit, die Dankesnachricht, die unseren auszuführenden Code enthält, erneut aufzurufen?

Kehren wir zu unserem ersten Submit zurück, dem der „Erkundung“ (oder führen wir die ersten Schritte erneut aus).

Durch Analyse des Netzwerkverkehrs oder des Seitenquellcodes erkennen wir, dass das Formular eine POST-Anfrage an die folgende Adresse sendet:

http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4

(Der letzte Teil kann variieren; passen Sie ihn in allen folgenden Beispielen entsprechend an.)
also an die Adresse:

http://<target>/cf-api/<form-id>

und dass die Antwort auf diese Anfrage ein JSON ist, das einige Daten enthält, darunter die Dankesnachricht, und die folgende Struktur hat:

root@kitploit:~
{
      "data":
          {"cf_id":"48"},
      "html":"<div class=\" alert alert-success\">Thank you myName, form has been successfully submitted.<\/div>",
      "type":"complete",
      "form_id":"CF5ad9b3176c0f4",
      "form_name":"MyContactForm",
      "status":"complete"
}

Heben wir uns diese Information auf, wir werden gleich darauf zurückkommen; insbesondere beachten wir die Felder "form_id" und "cf_id".

Was befindet sich an der Adresse, an die die POST gesendet wird? Ohne viele Vermutungen: Sehen wir, was passiert, wenn wir eine GET ausführen, also die Seite unter http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4 besuchen, und finden nichts anderes als das HTML des betreffenden Formulars.

  1. Wir füllen das Formular mit den folgenden Daten aus
    "First Name": myRedirectedName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

und prüfen den vom Submit ausgehenden Netzwerkverkehr

alt text

Dieses Mal erhalten wir einen HTTP-Statuscode 302 (Redirect) auf die Location /wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=49, der uns nichts anderes als das HTML mit dem div-Tag der Dankesnachricht zurückgibt.

Beachten wir das Format dieser Adresse:

http://<target>/cf-api/<form-id>/?cf_su=1&cf_id=<cf-id>

wobei die Werte von <form-id> und <cf-id> genau diejenigen sind, die im zuvor analysierten JSON enthalten sind, nämlich "form_id" und "cf_id".

Haben wir die Ausgangsfrage beantwortet? Ja. Wir haben einen Weg gefunden, den Inhalt der Dankesnachricht erneut aufzurufen.
Bemerkung: „Gefällt uns. Wir können die Nachricht mit unseren Daten nach Bedarf abrufen.“


AUFBAU

Fassen wir alles zusammen, indem wir alle bisher gesammelten Informationen verknüpfen und einen Angriff schnüren.
1) Wir speichern unseren schädlichen Code auf dem Ziel.
2) Wir sammeln die notwendigen Daten, um diesen Code abzurufen.
3) Wir konstruieren die URL, um unseren Angriff auszulösen.

  1. Wir füllen das Formular (von einer der beiden Seiten, ist egal) mit den folgenden Daten aus
    "First Name": m<script>document.body.innerHTML=String.fromCodePoint(128046);</script>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. Durch Analyse des generierten Traffics, sei es das Lesen des empfangenen JSONs im Fall der Sample-Seite oder das Lesen des Redirects im Fall der Seite, die nur das Formular enthält, rufen wir die Identifikatoren form_id und cf_id ab

root@kitploit:~
{  
      "data":  
          {"cf_id":"69"},  
      "html":"...",  
      "type":"...",  
      "form_id":"CF5ad9b3176c0f4",  
      "form_name":"...",  
      "status":"..."  
}
  1. Wir konstruieren und verwenden die URL, um unseren Angriff auszuführen

http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=69

alt text


Einige Anmerkungen:

  • Beachten Sie, dass der Inhalt (oder allgemeiner das Verhalten) der zuletzt besuchten Seite von uns kontrolliert wird; lassen Sie Ihrer Fantasie freien Lauf.
  • Bedenken Sie, dass die Änderung der Seite durch unseren JavaScript-Code innerhalb des Browsers des Benutzers stattfindet: XSS ist eine clientseitige Angriffsart.
  • Warum war es notwendig, einen Weg zum erneuten Aufruf des Skripts zu finden?
    Weil die Idee hinter einem XSS-Angriff darin besteht, Code im Kontext des Browsers des Opfers auszuführen; während der ersten Tests haben wir JS-Code ausgeführt, aber flüchtig und im Kontext unseres eigenen Browsers.
  • Warum wurde eine Kuh verwendet? Weil sie niedlich ist.
  • Der GET-Parameter „cf_id“ ist eine (fortlaufende) Kennung des im Formular eingegebenen Datensatzes; durch Verringern dieses Werts kann man „in der Zeit zurückgehen“ und zuvor von anderen gesendete Informationen abrufen. Falls Jupiter im Skorpion stünde, Venus nicht gegen Saturn stünde und das Formular so eingestellt wäre, dass die Dankesnachricht auch die E-Mail-Adresse des Benutzers enthält, wäre es hypothetisch möglich, die Adressen früherer Besucher abzurufen.

Dem interessierten Leser wird vorgeschlagen:

  • Den Angriff wiederholen und einen geeigneten Payload erstellen, sodass das Opfer einen Alert mit der Zeichenkette „MUCCA“ sieht.
  • Die vorherige Übung wiederholen, ohne das Zeichen ' (einfaches Anführungszeichen), das Zeichen " (doppeltes Anführungszeichen) oder das Zeichen ` (Backtick, Gravis) zu verwenden, das auf italienischen Tastaturlayouts fehlt.
  • Ein Skript in einer beliebigen Sprache entwickeln, das, ausgehend von der Adresse der Seite mit dem Formular auf dem eigenen Portal, die folgenden Operationen ausführt:
    • Ausfüllen und Absenden des Formulars
    • Überprüfung, ob eines der eingegebenen Felder zurückgegeben wird
    • Erstellen und Senden eines schädlichen Payloads in das betreffende Feld
    • Rückgabe der Adresse der Seite, um den Angriff auszulösen
  • Die zu Beginn vorgenommene Formularkonfiguration ändern (die Dankesnachricht ändern) und das Skript aus dem vorherigen Punkt erneut testen.
Tool herunterladen