
OpenSIS SQLi Injection
OpenSIS 認証済みSQLインジェクション
Ajax.php、ForWindow.php、ForExport.php、Modules.php、functions/HackingLogFnc.php にSQLインジェクションの脆弱性が存在します。この問題は OpenSis Community Edition 9.1 から 8.0 に影響し、それ以前のバージョンにも影響する可能性があります。
例の1つである Ajax.php では、悪意のあるアクティビティが検出された場合、IP がログに記録され、データベースに挿入されることが確認できます。注意すべき点として、“X-Forwarded-For” ヘッダーが送信された場合、アプリケーションは $_SERVER['REMOTE_ADDR'] の値ではなく、その値を採用します。$ip はサニタイズなしでSQLステートメントに直接連結されるため、SQLインジェクションを実行することが可能です。

以下の概念実証では、ペイロード ' AND SLEEP(7) AND '1'='1 を注入することで、アプリケーションが7秒間スリープし、SQLインジェクションが成功したことを示しています。

データベースログを確認することで、この脆弱性がさらに証明されます。

最後に、自動SQLインジェクションツールである SQLMap を使用して、この脆弱性を確認しました。

影響を受けるコード行は、$_SERVER['HTTP_X_FORWARDED_FOR'] の値をSQLステートメントに直接追加していることが判明しました。
• Ajax.php (Line 260 to 275)
• Modules.php (Line 1005 to 1023)
• ForExport.php (Line 135 to 147)
• ForWindow.php (Line 124 to 136)
• functions/HackingLogFnc.php (Line 47 to 68)
• ユーザー入力をSQLステートメントに直接連結して動的にSQLクエリを構築するのではなく、パラメータ化クエリ(プリペアドステートメントとも呼ばれます)を使用してください。パラメータ化クエリはSQLコードをユーザー入力から分離し、SQLインジェクション攻撃のリスクを大幅に軽減します。
• ユーザーが提供するデータが期待される形式に準拠し、悪意のあるSQLコードを含まないようにするため、堅牢な入力検証とサニタイズ技術を実装してください。入力データの型、長さ、形式を検証し、特殊文字をエスケープしたり、特定の文字やパターンのみを許可するホワイトリストを使用して入力をサニタイズしてください。
• IPのログ記録に $_SERVER[‘HTTP_X_FORWARDED_FOR’] を使用しないでください。