
Fortinet FortiWeb の重大な SQLi 脆弱性に関する概念実証(Proof-of-concept)のエクスプロイトが公開され、脆弱なサーバー上で事前に認証されたリモートコードの実行が可能になりました。
FortiWebはWebアプリケーションファイアウォール(WAF)で、悪意のあるHTTPトラフィックや脅威からWebアプリケーションを保護するために使用されます。
FortiWebの脆弱性の深刻度は9.8/10で、CVE-2025-25257として追跡されています。フォーティネットは先週、FortiWeb 7.6.4、7.4.8、7.2.11、7.0.11およびそれ以降のバージョンでこの脆弱性を修正しました。
FortiWebのSQLコマンドで使用される特殊要素の不適切な無効化(”SQLインジェクション”)の脆弱性[CWE-89]により、認証されていない攻撃者が細工したHTTPまたはHTTPsリクエストを経由して、認証されていないSQLコードまたはコマンドを実行する可能性があります」と、フォーティネットのアドバイザリは述べています。
この欠陥はGMOサイバーセキュリティの川根健太郎氏によって発見されたもので、川根氏は先月、Cisco ISEにおける静的なハードコードされたパスワードの脆弱性も公表している。
FortiWebの事前認証SQLiから事前認証RCEへ
本日、サイバーセキュリティ企業WatchTowrと “faulty *ptrrr“として知られるセキュリティ研究者が、リバースシェルまたはWebシェルを開く技術的な記述と概念実証のエクスプロイトを公開した。
この欠陥はFortiWebのFabric Connectorに発見されたもので、Fortinet製品間で認証とポリシーのデータを同期するソフトウェアである。
このソフトウェアには、以下のコードを使用して MySQL クエリを発行するget_fabric_user_by_token()関数に、認証されていない SQL インジェクションの欠陥があります:
snprintf(s, 0x400u, "select id from fabric_user.user_table where token='%s'", a1);
このコードでは、HTTPリクエストヘッダで送信されるベアラートークンが適切にサニタイズされないため、攻撃者はカスタムSQLをヘッダに注入してSQLiを実行することができます。
攻撃者は、/api/fabric/device/statusエンドポイントへのHTTPリクエストを通じて、AuthorizationヘッダーにSQLを注入することで(例えば、Bearer AAAAA'または'1'='1)、この欠陥を誘発することができ、攻撃者は認証チェックをバイパスすることができます。
研究者は、SQLiの欠陥を介してMySQLのSELECT … INTO OUTFILEクエリを実行し、デバイス上に任意のファイルを作成することで、SQLインジェクションをリモートコード実行にエスカレートさせることができました。これにより、彼らは Python .pth ファイルを site-packages ディレクトリに書き込むことができました。
.pthファイルは、Pythonが実行されると自動的に読み込まれて実行されるため、研究者は、.pthファイル内の悪意のあるコードを起動し、リモートでコードを実行するために使用できる正規のFortiWeb CGI Pythonスクリプト(/cgi-bin/ml-draw.py)を発見しました。
エクスプロイトが公開され、広く利用可能になっているため、管理者は、サーバーが侵害されるのを防ぐために、パッチを優先的にインストールすることを強くお勧めします。
現時点では、この脆弱性が積極的に悪用されているという兆候はありませんが、近い将来、この状況は変わるでしょう。
.ia_ad { background-color:#width: 95%; max-width: 800px; margin: 15px auto; border-radius: 8px; border:1px solid #d6ddee; display: flex; align-items: stretch; padding: 0; overflow: hidden; }:0; overflow: hidden; } .ia_lef { flex: 1; max-width: 200px; height: auto; display: flex; align-items: stretch; } .ia_lef a { display: flex; width: 100%; height: 100%; } .ia_lef a img { width: 100%; height: 100%; object-fit: cover; border-radius: 8px 0 0 8px; margin: 0; display: block; } .ia_rig { flex: 2; padding:display: flex; flex-direction: column; justify-content: center; } .ia_rig h2 { font-size: 17px !important; font-weight: 700; color:#line-height: 1.4; font-family:margin: 0 0 14px 0; } .ia_rig p { font-weight: bold; font-size: 14px; margin: 0 0 clamp(6px, 2vw, 14px) 0; } .ia_button { background-color:#border:1px solid #3b59aa; color: black; text-align: center; text-decoration: none; border-radius: 8px; display: inline-block; font-size: 16px; font-weight: bold; cursor: pointer; padding:10px 20px; width: fit-content; } .ia_button a { text-decoration: none; color: inherit; display: block; } @media (max-width: 600px) { .ia_ad { flex-direction: column; align-items: center; text-align: center; } .ia_lef { max-width: 100%; } .ia_lef a img { border-radius: 8px 8px 0 0; } .ia_rig { padding:15px;
width: 100%;
}
.ia_button {
width: 100%;
margin: 0px auto;
}
}




Comments