Hello there, ('ω')ノ
記事:
https://siltonrenato02.medium.com/a-brief-summary-about-a-ssti-to-rce-in-bagisto-e900ac450490
ねらい
今回のケースは、LaravelベースのECフレームワークBagisto(v1.5.1)で発見されたSSTI(Server-Side Template Injection)が、どのようにしてRCE(リモートコード実行)に発展するのかを示した事例です。 攻撃者はまずカスタムページ機能を確認し、単なるXSSではなくテンプレートエンジンの評価が起きていることを突き止めます。そこからサーバ側でのコード実行へ到達する流れです。
全体像(ストーリー)
- Bagistoのページ編集機能で任意のHTMLを挿入できることを確認。
- まずXSSの可能性を確認するが、それだけでは限定的。
- テストとして{{7*7}}を入力 → サーバが計算して49を返す。 → SSTIが成立。
- さらにペイロードを投入し、/etc/passwdの読み取りに成功。 → RCEが成立。
- これにより、データベース認証情報やクラウドメタデータなども窃取可能になる。
実践:一手ずつ「なぜそうするか」
1) 機能を探す
- 操作:管理画面で「ページ作成」機能を開き、HTMLスニペットを挿入。
- 観察:任意のHTMLがそのままページに反映される。
- なぜ:開発者は「見た目のカスタマイズ」を想定しており、入力をサニタイズしていない。 → XSSを疑う入口となる。
2) XSSテスト
- 操作:
<script>alert(1)</script>を入力。 - 観察:ブラウザでアラートが出た。
- なぜ:典型的な反射型XSS。しかし攻撃者視点では「クライアント依存」なので、Red Team用途では弱い。
3) サーバサイド評価を疑う
- 操作:入力に
{{7*7}}を入れる。 - 観察:表示結果は49。
- なぜ:これはテンプレートエンジン(BladeやTwigに類似)がサーバ側で計算している証拠。 → SSTI(サーバサイドテンプレートインジェクション) 確定。
4) インパクトを調査(RCEテスト)
操作:既知のSSTI→RCEペイロードを試す。
例:
{{ system('cat /etc/passwd') }}
観察:レスポンスに/etc/passwdの内容が表示された。
なぜ:入力がサーバで直接評価され、任意のシェルコマンドが実行可能であることが確認できた。
5) 影響範囲を整理する
この脆弱性により攻撃者は:
- サーバ上の任意ファイル(DB認証情報、APIキーなど)を読み取れる
- OSコマンドを実行できる
- クラウド上であればインスタンスメタデータにアクセス可能 → 横展開が可能
ペイロードまとめ
- 確認用(SSTIテスト):
{{7*7}}
- 実行用(RCE例):
{{ system('cat /etc/passwd') }}
ベンダー対応とCVE
報告者がベンダーに通知したが、Bagisto側は「すでに管理者権限を持っているユーザーが利用する機能なので問題なし」と判断。 それでも深刻性を示すためにCVE-2023-33570が登録されました。
実務目線の防御策
テンプレートエンジンの安全設定 BladeやTwigなどでは式展開を無効化、あるいはエスケープを必須化。
入力サニタイズ 管理画面入力であっても、サーバサイド評価に渡さない。
権限分離 CMS管理者=サーバOS操作可能、にならないように、原則最小権限を徹底。
まとめ
今回の発見は以下の流れでした:
- HTML挿入機能を調査
- XSSを確認 → 限界を認識
- SSTIを発見({{7*7}} = 49)
- RCEペイロードで /etc/passwd を読み出し成功
- 攻撃のインパクトを整理(DB・APIキー流出、クラウド横展開)
ポイントは、「一見ただのXSSに見える機能でも、サーバサイドで評価されていないかを疑う」こと。 SSTIはXSSよりも遥かに深刻で、完全なサーバ乗っ取りの入り口になり得ます。
Best regards, (^^ゞ