Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
codeql-workshop-cve-2021-21380 — Un workshop CodeQL che copre CVE-2021-21380 | Kitploit
Strumenti/GitHubGitHub/rvermeulen/codeql-workshop-cve-2021-21380
Analisi StaticaAnalisi delle VulnerabilitàAnalisi del CodiceSicurezza WebApprendimento e FormazioneLab e Pratica
GitHubrvermeulen/codeql-workshop-cve-2021-21380

codeql-workshop-cve-2021-21380

Un workshop CodeQL che copre CVE-2021-21380

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Vedi Repository
1251 anno faNon ancora revisionato

Workshop di CodeQL per Java: trovare una SQL injection

In questo workshop useremo il ragionamento sintattico e semantico per trovare una SQL injection nel componente di valutazione della piattaforma XWiki documentata da CVE-2021-21380.

Sommario

  • Workshop di CodeQL per Java: trovare una SQL injection
    • Sommario
    • Prerequisiti e istruzioni di configurazione
      • Sul tuo computer locale
        • Installazione
        • Passaggi di configurazione
    • Workshop
      • Cosa imparerai
      • Definizione del problema
      • Esercizi
        • Esercizio 1
        • Intermezzo 1
        • Esercizio 2
        • Esercizio 3
        • Intermezzo 2
        • Esercizio 4
        • Esercizio 5
        • Intermezzo 3
        • Esercizio 6
        • Esercizio 7
        • Esercizio 8
    • E adesso?

Prerequisiti e istruzioni di configurazione

Sul tuo computer locale

Ti preghiamo di completare questa sezione prima del workshop, se possibile.

Installazione

  • Installa Visual Studio Code.

  • Installa l'estensione CodeQL per Visual Studio Code.

  • Non è necessario installare il CodeQL CLI: l'estensione lo gestirà per te.

  • Clona questo repository:

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

Passaggi di configurazione

  • Importa il database CodeQL da utilizzare nel workshop:
    • Fai clic con il pulsante destro del mouse sul file xwiki-platform-CVE-2021-21380.zip nella vista Explorer e seleziona il comando CodeQL: Set Current Database.
    • Il database apparirà nella vista dei database CodeQL raggiungibile dall'icona QL sulla barra delle attività.
  • Installa le dipendenze per analizzare il codice Java e per eseguire i test degli esercizi e delle soluzioni.
    • Dalla Command Palette (Cmd/Ctrl+Shift+P), cerca ed esegui il comando CodeQL: Install Pack Dependencies.
    • Nella parte superiore della finestra di VS Code, digita github nella casella per filtrare l'elenco.
    • Seleziona la casella accanto a cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions e cve-2021-21380-solutions-tests.
    • Fai clic su OK/Invio.
  • Verifica che tutto funzioni come previsto eseguendo i test per le soluzioni.

Workshop

Cosa imparerai

Il workshop è suddiviso in diversi esercizi che introducono il supporto del linguaggio QL per Java e termina con una query finale per trovare la SQL injection nota. In questi esercizi imparerai:

  • Come ragionare sulle informazioni sintattiche.
  • Come ragionare sulle informazioni semantiche.
  • Esplorare il supporto del linguaggio QL per Java per esprimere pattern.
  • Esplorare come riutilizzare ed estendere la modellazione esistente.
  • Usare più blocchi funzionali per comporre la query finale.

Definizione del problema

In questo workshop cercheremo delle vulnerabilità di SQL injection note nel componente API di valutazione della XWiki Platform. Tali vulnerabilità possono verificarsi nelle applicazioni quando informazioni controllate da un utente esterno raggiungono codice applicativo che costruisce in modo non sicuro una query SQL e la esegue.

La SQL injection nota discussa in questo workshop è recensita in GHSA-79rg-7mv3-jrr5 nel GitHub Advisory Database. Per trovare la SQL injection, e le possibili varianti, ci occuperemo dei seguenti sottoproblemi:

  • Identificare la fonte delle informazioni non fidate e modellarla in QL.
  • Identificare il sink, il metodo che esegue query SQL, e modellarlo in QL.
  • Combinare le soluzioni precedenti per determinare se esiste un flusso di informazioni tra la sorgente e il sink utilizzando il taint tracking.

Esercizi

Nei primi esercizi ragioneremo sulle informazioni sintattiche, usando l'Abstract Syntax Tree (AST), per identificare:

  • il metodo descritto nell'avviso di sicurezza per comprendere la vulnerabilità
  • i parametri che contengono dati non fidati, le nostre sorgenti
  • le chiamate a metodi che accettano istruzioni SQL, i nostri sink

Esercizio 1

Trova tutti i metodi con nome getAverageRating e il loro tipo dichiarante nel programma completando la query exercise1.ql

Suggerimenti
  • Il modulo java fornisce una classe Method per ragionare sui metodi di un programma.
  • La classe Method fornisce i predicati membro getName e hasName per ragionare sul nome di un metodo.
  • La classe Method fornisce il membro getDeclaringType per ragionare sul tipo che dichiara il metodo.

Una soluzione si trova nella query exercise1.ql

Intermezzo 1

Una soluzione all'esercizio 1 restituisce un elenco di metodi. Alcuni di essi sono definiti in un'interfaccia chiamata RatingsManager, altri sono definiti nelle classi AbstractRatingsManager e RatingsScriptService.

Dalle informazioni restituite dalla query e dalla documentazione dei componenti XWiki possiamo dedurre che:

  • XWiki utilizza un design orientato ai componenti per consentire estensioni e personalizzazioni.
  • Il metodo vulnerabile fa parte di un componente.
  • Un componente è costituito da un'interfaccia, annotata con Role, e da un'implementazione annotata con Component.
  • Un componente che estende ScriptService viene reso accessibile alle pagine wiki tramite scripting.

Esercizio 2

Trova tutte le classi annotate con l'annotazione Component completando la query exercise2.ql. Nota che il nome completo del tipo dell'annotazione è org.xwiki.component.annotation.Component.

Suggerimenti
  • Il /tipo di dominio della classe/, l'intersezione dei suoi super tipi, può essere accesso usando la parola chiave this nel /predicato caratteristico/.
  • La classe Class fornisce un metodo getAnAnnotation per ottenere le annotazioni associate.
  • La classe Annotation fornisce il predicato membro getType per ragionare sul suo tipo.
  • La classe Type fornisce i predicati membro getName e hasName per ragionare sul nome di un tipo.
  • La classe RefType, che rappresenta classi e interfacce, fornisce i predicati membro getQualifiedName e hasQualifiedName per ragionare sul nome completo del reftype.

Una soluzione si trova nella query exercise2.ql

Esercizio 3

Trova tutti i componenti che implementano l'interfaccia ScriptService completando la query excercise3.ql

Suggerimenti
  • Il tipo Class fornisce il predicato membro getASuperType per ragionare sui super tipi di una classe, cioè i tipi che essa extends o implements.

Una soluzione si trova nella query exercise3.ql

Intermezzo 2

A questo punto abbiamo identificato sintatticamente i metodi che possono essere chiamati da un utente e i cui parametri considereremo fonti di dati non fidati più avanti nel workshop.

Nell'esercizio successivo andremo a indagare e identificare possibili sink. Dai risultati dell'esercizio 1 possiamo dedurre che una delle implementazioni chiama il metodo getAverageRatingFromQuery. Usando una query simile possiamo trovare i tipi dichiaranti di getAverageRatingFromQuery, il che ci consente di stabilire che l'implementazione nella classe AbstractRatingsManager costruisce un'istruzione SQL passata al metodo search.

Il metodo search è implementato in una dipendenza e quindi la sua implementazione non è disponibile. Nei prossimi esercizi useremo le informazioni sui tipi disponibili per identificare questa chiamata al metodo search e il suo tipo dichiarante.

Esercizio 4

Trova tutte le chiamate al metodo search e identifica il suo tipo dichiarante completando la query exercise4.ql

Suggerimenti
  • Il tipo MethodCall ci fornisce i mezzi per ragionare sulle chiamate di metodo.
  • Il tipo MethodAcccess fornisce il predicato membro getMethod per ragionare sul target di una chiamata di metodo.

Una soluzione si trova nella query exercise4.ql

Esercizio 5

Trova tutte le chiamate a metodi dichiarati dall'interfaccia XWikiStorageInterface (con nome completo com.xpn.xwiki.store.XWikiStoreInterface) completando la query exercise5.ql

Suggerimenti
  • La parola chiave instanceof può essere usata per affermare che un valore appartiene all'insieme di valori rappresentati da un tipo. Ad esempio, per identificare tutte le chiamate ai metodi di interfaccia:

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

Una soluzione si trova nella query exercise5.ql

Intermezzo 3

A questo punto abbiamo descritto sintatticamente possibili sorgenti e sink usando QL. Per determinare se le informazioni fluiscono tra questi punti nel programma, analizzeremo semanticamente il programma usando il taint tracking. Le librerie standard dei linguaggi che supportiamo forniscono due meccanismi di flusso dati:

  1. Il modulo DataFlow supporta il flusso di informazioni che preserva il valore.
  2. Il modulo TaintTracking supporta il flusso di informazioni anche se i valori vengono modificati.

Quest'ultimo è interessante, perché nelle vulnerabilità di injection come la SQL injection è comune che dati non fidati diventino parte di un'istruzione più ampia su cui viene eseguita un'azione.

In questo workshop riutilizzeremo una configurazione esistente di taint tracking per SQL injection e la estenderemo con le nostre sorgenti e i nostri sink modellati per trovare la SQL injection. Per capire come possiamo estendere la configurazione, iniziamo osservando la definizione della configurazione qui sotto.

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)
  }
}

Sia il predicato isSource che il predicato isSink usati dalla configurazione per identificare quelle posizioni del programma usano la parola chiave instanceof che abbiamo visto prima. Sia la classe RemoteFlowSource che la classe QueryInjectionSink sono classi abstract. Questo è un pattern comune che si incontra nelle librerie standard e questo pattern ci consente di estendere l'insieme di valori rappresentati dalle classi RemoteFlowSource e QueryInjectionSink.

Una class QL che estende una abstract class non perfeziona l'insieme di valori rappresentato dalla superclasse, ma aggiunge i valori rappresentati dalla sottoclasse alla superclasse. Nei prossimi esercizi implementeremo queste sottoclassi e costruiremo la nostra query finale.

Esercizio 6

Estendi l'insieme di valori di RemoteFlowSource con i parametri dei metodi pubblici delle classi dei componenti identificate nell'esercizio 3 completando la query exercise6.ql.

Suggerimenti
  • La parola chiave instanceof può essere usata per affermare che un valore appartiene all'insieme di valori rappresentati da un tipo. Ad esempio, per identificare tutte le chiamate ai metodi di interfaccia:

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

Una soluzione si trova nella query exercise6.ql

Esercizio 7

Estendi l'insieme di valori di QueryInjectionSink con gli argomenti delle chiamate ai metodi dell'interfaccia di storage identificata nell'esercizio 5 completando la query exercise7.ql

Suggerimenti
  • La formula exists consente di introdurre una variabile temporanea di cui è possibile ragionare nello scope dell'exists.

    Il seguente esempio usa l'espressione exists per ridurre l'insieme di metodi ai metodi che vengono chiamati.

    root@kitploit:~
    from Method m
    where m.hasName("foo") and exists(MethodCall ma | ma.getMethod() = m)
    select m
    
  • La classe MethodCall fornisce il predicato membro getQualifer per ragionare sul qualificatore dell'accesso al metodo.

Una soluzione si trova nella query exercise7.ql

Esercizio 8

Combina le tue soluzioni degli esercizi precedenti in una soluzione finale completando la query exercise8.ql.

Una soluzione si trova nella query exercise8.ql

E adesso?

  • La query include un modulo per modellare parti del framework XWiki. Rifattorizzalo in un file di modulo separato e usalo nella tua query.
  • Abbiamo limitato la nostra fonte di dati non fidati ai componenti dello script service. Valuta come espandere questo aspetto con altre fonti.
  • Per il sink ci siamo limitati all'uso diretto di XWikiStoreInterface. Espandi il sink per includere gli usi diretti delle implementazioni dell'interfaccia. La classe Class fornisce il predicato membro extendsOrImplements e la classe Method fornisce il predicato membro overridesOrInstantiates che potrebbero essere utili.
  • Usa la definizione delle fonti per trovare usi interessanti di dati non fidati con la query 'Untrusted data passed to external API'
Scarica lo strumento
  • Apri la vista testing e premi Run Tests (l'icona di riproduzione viene mostrata quando passi il mouse sulle soluzioni) accanto all'elemento delle soluzioni nell'albero.