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/rvermeulen/codeql-workshop-cve-2021-21380
Statische AnalyseSchwachstellenanalyseCode-AnalyseWebsicherheitLernen & BildungLabs & Praxis
GitHubrvermeulen/codeql-workshop-cve-2021-21380

codeql-workshop-cve-2021-21380

Ein CodeQL-Workshop zu CVE-2021-21380

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
125vor 1 JahrNoch nicht geprüft

CodeQL-Workshop für Java: Finden einer SQL-Injection

In diesem Workshop werden wir syntaktische und semantische Schlussfolgerungen verwenden, um eine SQL-Injection in der Rating-Komponente der XWiki-Plattform zu finden, die durch CVE-2021-21380 dokumentiert ist.

Inhalt

  • CodeQL-Workshop für Java: Finden einer SQL-Injection
    • Inhalt
    • Voraussetzungen und Einrichtungsanweisungen
      • Auf Ihrem lokalen Rechner
        • Installation
        • Einrichtungsschritte
    • Workshop
      • Lernziele
      • Problemstellung
      • Übungen
        • Übung 1
        • Intermezzo 1
        • Übung 2
        • Übung 3
        • Intermezzo 2
        • Übung 4
        • Übung 5
        • Intermezzo 3
        • Übung 6
        • Übung 7
        • Übung 8
    • Wie geht es weiter?

Voraussetzungen und Einrichtungsanweisungen

Auf Ihrem lokalen Rechner

Bitte arbeiten Sie diesen Abschnitt, wenn möglich, vor dem Workshop durch.

Installation

  • Installieren Sie Visual Studio Code.

  • Installieren Sie die CodeQL-Erweiterung für Visual Studio Code.

  • Sie müssen die CodeQL-CLI nicht installieren: Die Erweiterung übernimmt dies für Sie.

  • Klonen Sie dieses Repository:

    root@kitploit:~
    git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
    

Einrichtungsschritte

  • Importieren Sie die CodeQL-Datenbank, die im Workshop verwendet werden soll:
    • Klicken Sie mit der rechten Maustaste auf die Datei xwiki-platform-CVE-2021-21380.zip in der Explorer-Ansicht und wählen Sie den Befehl CodeQL: Set Current Database.
    • Die Datenbank wird in der CodeQL-Datenbankansicht angezeigt, die über das QL-Symbol in der Aktivitätsleiste erreichbar ist.
  • Installieren Sie die Abhängigkeiten für die Analyse von Java-Code und zum Ausführen der Tests für die Übungen und Lösungen.
    • Suchen Sie in der Befehlspalette (Cmd/Ctrl+Shift+P) nach dem Befehl CodeQL: Install Pack Dependencies und führen Sie ihn aus.
    • Geben Sie oben in Ihrem VS-Code-Fenster github in das Feld ein, um die Liste zu filtern.
    • Aktivieren Sie das Kontrollkästchen neben cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions und cve-2021-21380-solutions-tests.
    • Klicken Sie auf OK/.

Workshop

Lernziele

Der Workshop ist in mehrere Übungen unterteilt, die die QL-Sprachunterstützung für Java vorstellen, und endet mit einer abschließenden Abfrage, um die bekannte SQL-Injection zu finden. In diesen Übungen lernen Sie:

  • Wie Sie über syntaktische Informationen schlussfolgern.
  • Wie Sie über semantische Informationen schlussfolgern.
  • Erkunden Sie die QL-Sprachunterstützung für Java, um Muster auszudrücken.
  • Entdecken Sie, wie Sie vorhandene Modellierung wiederverwenden und erweitern.
  • Nutzen Sie mehrere Bausteine, um die endgültige Abfrage zusammenzustellen.

Problemstellung

In diesem Workshop suchen wir nach bekannten SQL-Injection-Schwachstellen in der Rating-API-Komponente der XWiki Platform. Solche Schwachstellen können in Anwendungen auftreten, wenn Informationen, die von einem externen Benutzer kontrolliert werden, in Anwendungscode gelangen, der auf unsichere Weise eine SQL-Abfrage erstellt und ausführt.

Die in diesem Workshop behandelte bekannte SQL-Injection wird in GHSA-79rg-7mv3-jrr5 in der GitHub Advisory Database überprüft. Um die SQL-Injection und mögliche Varianten zu finden, gehen wir die folgenden Teilprobleme an:

  • Identifizieren Sie die Quelle nicht vertrauenswürdiger Informationen und modellieren Sie sie in QL.
  • Identifizieren Sie die Senke, also die Methode, die SQL-Abfragen ausführt, und modellieren Sie sie in QL.
  • Kombinieren Sie die obigen Lösungen, um mithilfe von Taint-Tracking festzustellen, ob ein Informationsfluss zwischen Quelle und Senke besteht.

Übungen

In den ersten Übungen werden wir mithilfe des abstrakten Syntaxbaums (AST) über syntaktische Informationen schlussfolgern, um Folgendes zu identifizieren:

  • die in der Sicherheitsempfehlung beschriebene Methode, um ein Verständnis für die Schwachstelle zu entwickeln
  • Parameter, die nicht vertrauenswürdige Daten enthalten, unsere Quellen
  • Methodenaufrufe, die SQL-Anweisungen akzeptieren, unsere Senken

Übung 1

Finden Sie alle Methoden mit dem Namen getAverageRating und ihrem deklarierenden Typ im Programm, indem Sie die Abfrage exercise1.ql vervollständigen.

Hinweise
  • Das java-Modul stellt eine Klasse Method bereit, um über Methoden in einem Programm zu schlussfolgern.
  • Die Klasse Method stellt die Member-Prädikate getName und hasName bereit, um über den Namen einer Methode zu schlussfolgern.
  • Die Klasse Method stellt das Member getDeclaringType bereit, um über den Typ zu schlussfolgern, der die Methode deklariert.

Eine Lösung finden Sie in der Abfrage exercise1.ql

Intermezzo 1

Eine Lösung zu Übung 1 gibt eine Liste von Methoden zurück. Einige davon sind in einem Interface namens RatingsManager definiert, andere in den Klassen AbstractRatingsManager und RatingsScriptService.

Aus den von der Abfrage zurückgegebenen Informationen und der XWiki-Komponentendokumentation können wir ableiten:

  • XWiki verwendet ein komponentenorientiertes Design, um Erweiterungen und Anpassungen zu ermöglichen.
  • Die verwundbare Methode ist Teil einer Komponente.
  • Eine Komponente besteht aus einem Interface, das mit Role annotiert ist, und einer Implementierung, die mit Component annotiert ist.
  • Eine Komponente, die ScriptService erweitert, wird Wiki-Seiten über Scripting zugänglich gemacht.

Übung 2

Finden Sie alle Klassen, die mit der Annotation Component annotiert sind, indem Sie die Abfrage exercise2.ql vervollständigen. Beachten Sie, dass der voll qualifizierte Name des Typs der Annotation org.xwiki.component.annotation.Component ist.

Hinweise
  • Der /Klassen-Domänentyp/, also die Schnittmenge seiner Supertypen, kann mit dem Schlüsselwort this im /charakteristischen Prädikat/ abgerufen werden.
  • Die Klasse Class stellt eine Methode getAnAnnotation bereit, um zugehörige Annotationen zu erhalten.
  • Die Klasse Annotation stellt das Member-Prädikat getType bereit, um über ihren Typ zu schlussfolgern.
  • Die Klasse Type stellt die Member-Prädikate getName und hasName bereit, um über den Namen eines Typs zu schlussfolgern.
  • Die Klasse RefType, die Klassen und Interfaces repräsentiert, stellt die Member-Prädikate getQualifiedName und hasQualifiedName bereit, um über den voll qualifizierten Namen des RefType zu schlussfolgern.

Eine Lösung finden Sie in der Abfrage exercise2.ql

Übung 3

Finden Sie alle Komponenten, die das ScriptService-Interface implementieren, indem Sie die Abfrage excercise3.ql vervollständigen.

Hinweise
  • Der Typ Class stellt das Member-Prädikat getASuperType bereit, um über die Supertypen einer Klasse zu schlussfolgern, also Typen, die sie extends oder implements.

Eine Lösung finden Sie in der Abfrage exercise3.ql

Intermezzo 2

An diesem Punkt haben wir syntaktisch die Methoden identifiziert, die von einem Benutzer aufgerufen werden können und deren Parameter wir später im Workshop als Quellen nicht vertrauenswürdiger Daten betrachten werden.

In der nächsten Übung werden wir mögliche Senken untersuchen und identifizieren. Aus den Ergebnissen von Übung 1 können wir ableiten, dass eine der Implementierungen die Methode getAverageRatingFromQuery aufruft. Mit einer ähnlichen Abfrage können wir die deklarierenden Typen von getAverageRatingFromQuery finden, wodurch wir feststellen können, dass die Implementierung in der Klasse AbstractRatingsManager eine SQL-Anweisung erstellt, die an die Methode search übergeben wird.

Die Methode search ist in einer Abhängigkeit implementiert, daher ist ihre Implementierung nicht verfügbar. In den nächsten Übungen werden wir die verfügbaren Typinformationen verwenden, um diesen search-Methodenaufruf und seinen deklarierenden Typ zu identifizieren.

Übung 4

Finden Sie alle Methodenaufrufe an die Methode search und identifizieren Sie ihren deklarierenden Typ, indem Sie die Abfrage exercise4.ql vervollständigen.

Hinweise
  • Der Typ MethodCall bietet uns die Möglichkeit, über Methodenaufrufe zu schlussfolgern.
  • Der Typ MethodAcccess stellt das Member-Prädikat getMethod bereit, um über das Ziel eines Methodenaufrufs zu schlussfolgern.

Eine Lösung finden Sie in der Abfrage exercise4.ql

Übung 5

Finden Sie alle Methodenaufrufe an Methoden, die vom Interface XWikiStorageInterface deklariert werden (mit dem qualifizierten Namen com.xpn.xwiki.store.XWikiStoreInterface), indem Sie die Abfrage exercise5.ql vervollständigen.

Hinweise
  • Das Schlüsselwort instanceof kann verwendet werden, um auszudrücken, dass ein Wert zur Menge der Werte gehört, die durch einen Typ repräsentiert werden. Um beispielsweise alle Aufrufe von Interface-Methoden zu identifizieren:

    root@kitploit:~
    import java
    
    from MethodCall ma
    where ma.getMethod.getDeclaringType() instanceof Interface
    select ma
    

Eine Lösung finden Sie in der Abfrage exercise5.ql

Intermezzo 3

An diesem Punkt haben wir mögliche Quellen und Senken mithilfe von QL syntaktisch beschrieben. Um festzustellen, ob Informationen zwischen diesen Punkten im Programm fließen, werden wir das Programm mithilfe von Taint-Tracking semantisch analysieren. Die Standardbibliotheken der von uns unterstützten Sprachen bieten zwei Datenflussmechanismen:

  1. Das Modul DataFlow unterstützt wert-erhaltenden Informationsfluss.
  2. Das Modul TaintTracking unterstützt Informationsfluss, selbst wenn Werte verändert werden.

Letzteres ist von Interesse, da bei Injektionsschwachstellen wie SQL-Injection nicht vertrauenswürdige Daten häufig Teil einer größeren Anweisung werden, die ausgeführt wird.

In diesem Workshop werden wir eine bestehende Taint-Tracking-Konfiguration für SQL-Injection wiederverwenden und sie mit unseren modellierten Quellen und Senken erweitern, um die SQL-Injection zu finden. Um zu verstehen, wie wir die Konfiguration erweitern können, beginnen wir damit, uns die Definition der Konfiguration unten anzusehen.

root@kitploit:~
class QueryInjectionFlowConfig extends TaintTracking::Configuration {
  QueryInjectionFlowConfig() { this = "SqlInjectionLib::QueryInjectionFlowConfig" }

  override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }

  override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink }

  override predicate isSanitizer(DataFlow::Node node) {
    node.getType() instanceof PrimitiveType or
    node.getType() instanceof BoxedType or
    node.getType() instanceof NumberType
  }

  override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
    any(AdditionalQueryInjectionTaintStep s).step(node1, node2)
  }
}

Sowohl das isSource- als auch das isSink-Prädikat, die von der Konfiguration verwendet werden, um diese Programmpunkte zu identifizieren, verwenden das Schlüsselwort instanceof, das wir bereits gesehen haben. Sowohl die Klasse RemoteFlowSource als auch die Klasse QueryInjectionSink sind abstract-Klassen. Dies ist ein häufiges Muster, das Ihnen in den Standardbibliotheken begegnen wird, und dieses Muster ermöglicht es uns, die Menge der Werte zu erweitern, die durch die Klassen RemoteFlowSource und QueryInjectionSink repräsentiert werden.

Eine QL-class, die eine abstract class erweitert, verfeinert nicht die Menge der Werte, die durch die Oberklasse repräsentiert wird, sondern fügt der Oberklasse die Werte hinzu, die durch die Unterklasse repräsentiert werden. In den nächsten Übungen werden wir diese Unterklassen implementieren und unsere endgültige Abfrage konstruieren.

Übung 6

Erweitern Sie die Wertemenge von RemoteFlowSource um die Parameter der öffentlichen Methoden der in Übung 3 identifizierten Komponentenklassen, indem Sie die Abfrage exercise6.ql vervollständigen.

Hinweise
  • Das Schlüsselwort instanceof kann verwendet werden, um auszudrücken, dass ein Wert zur Menge der Werte gehört, die durch einen Typ repräsentiert werden. Um beispielsweise alle Aufrufe von Interface-Methoden zu identifizieren:

    root@kitploit:~
    import java
    
    from MethodCall ma
    where ma.getMethod.getDeclaringType() instanceof Interface
    select ma
    

Eine Lösung finden Sie in der Abfrage exercise6.ql

Übung 7

Erweitern Sie die Wertemenge von QueryInjectionSink um die Argumente von Aufrufen an die Methoden des in Übung 5 identifizierten Storage-Interfaces, indem Sie die Abfrage exercise7.ql vervollständigen.

Hinweise
  • Die exists-Formel ermöglicht die Einführung temporärer Variablen, über die im Gültigkeitsbereich von exists Schlussfolgerungen angestellt werden können.

    Das folgende Beispiel verwendet den exists-Ausdruck, um die Menge der Methoden auf die Methoden zu reduzieren, die aufgerufen werden.

    root@kitploit:~
    from Method m
    where m.hasName("foo") and exists(MethodCall ma | ma.getMethod() = m)
    select m
    
  • Die Klasse MethodCall stellt das Member-Prädikat getQualifer bereit, um über den Qualifier des Methodenzugriffs zu schlussfolgern.

Eine Lösung finden Sie in der Abfrage exercise7.ql

Übung 8

Kombinieren Sie Ihre Lösungen aus der vorherigen Übung zu einer endgültigen Lösung, indem Sie die Abfrage exercise8.ql vervollständigen.

Eine Lösung finden Sie in der Abfrage exercise8.ql

Wie geht es weiter?

  • Die Abfrage enthält ein Modul zur Modellierung von Teilen des XWiki-Frameworks. Lagern Sie dies in eine eigene Moduldatei aus und verwenden Sie es in Ihrer Abfrage.
  • Wir haben unsere Quelle nicht vertrauenswürdiger Daten auf Script-Service-Komponenten beschränkt. Überlegen Sie, wie Sie dies um weitere Quellen erweitern können.
  • Für die Senke haben wir uns auf die direkte Verwendung des XWikiStoreInterface beschränkt. Erweitern Sie die Senke um direkte Verwendungen von Implementierungen des Interfaces. Die Klasse Class stellt das Member-Prädikat extendsOrImplements und die Klasse Method das Member-Prädikat overridesOrInstantiates bereit, die hilfreich sein könnten.
  • Verwenden Sie die Definition von Quellen, um interessante Verwendungen nicht vertrauenswürdiger Daten mit der Abfrage 'Untrusted data passed to external API '
Tool herunterladen
Enter
  • Überprüfen Sie, dass alles wie erwartet funktioniert, indem Sie die Tests für die Lösungen ausführen.
    • Öffnen Sie die Testansicht und klicken Sie neben dem Lösungselement im Baum auf „run tests“ (das Wiedergabesymbol wird angezeigt, wenn Sie mit der Maus über Lösungen fahren).