
【知識の泉】テンプレートインジェクション
別の記事で玲奈が問題にしてたののの解説です。
🌟「SSTIってなに?」 by リナちゃん🌟
「ねえねえ、リナちゃん!SSTIって何〜?🤔」
綾香が首をかしげながら聞いてくる。
「SSTI!?💡 それはね〜、サーバーサイド・テンプレート・インジェクション(Server-Side Template Injection)の略で!✨ 簡単に言うと、ユーザーが入力したデータが、サーバー側で“そのまま”コードとして実行されちゃうヤバい脆弱性なのだー!!💀⚡」
「えぇー!?😱 なんかもう聞いただけでヤバそう!」
「でしょ!?🔥💻 じゃあ、まずは簡単な例からいってみよ〜!🎶」
🌟SSTIの簡単な例💡
リナちゃんはノートPCを開いて、画面を見せる💻✨
「例えばね!PythonのFlaskっていうWebフレームワークで、こんなコードを書いたとするよ!📜💻」
from flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/greet")
def greet():
name = request.args.get("name", "Guest")
template = Template("Hello, {{ name }}!")
return template.render(name=name)
if __name__ == "__main__":
app.run()
「これ、?name=リナ って入力すると Hello, リナ! って表示される普通のコードに見えるでしょ〜?🤗✨」
「うんうん!🙆♀️ これなら大丈夫そう!」
「でもね…… ?name={{ 7*7 }} って入力すると……」
Hello, 49!
「えっ!?🤯 なんで計算されたの!?」
「それがSSTIのヤバさ!!😎🔥 つまり、このサーバーは {{ }} の中に書かれたコードを勝手に実行しちゃうってこと!!⚠️💥」
「えええーっ!?😱 それってやばくない!?」
「やばいよ!!!😤💢 しかも、これだけじゃ済まないんだよ〜?💀✨」
💀 さらにやばいSSTIの使い方 💀
「この状態だとね、もっと強力なコードも実行できちゃうの!😈✨ 例えば、こんなの👇」
{{ config.__class__.__mro__[1].__subclasses__() }}
「これを入力すると、Pythonで動いてるサーバーの すべてのクラス が見えちゃうの!!😲💥」
「えっ!?それって……やばいやつ?😨」
「超ヤバいやつ!!😎✨ 例えば、 subprocess.Popen っていうのを見つけたら……」
{{ self.__init__.__globals__['os'].system('ls -la') }}
「こうやって入力するだけで……サーバーのファイルが丸見え!!📂👀✨」
「うわぁぁぁぁ!!😱💦💦」
「しかも、 os.system('rm -rf /') なんて打ったら、サーバーが全部消える😈🔥💀」
「ひええええ!!😱💦💦💦」
「だから、SSTIは超危険!💀⚡💢 ちゃんと対策しないと、サーバーが攻撃者のオモチャになっちゃうんだよ〜!!😤💢💢」
✨SSTIを防ぐには!?🔒
「じゃあ、どうすればSSTIを防げるの?😣💦」
「良い質問!🎶💖 じゃあ、SSTI対策 4つのポイント いくよー!!💪✨」
✅ 1. ユーザーの入力を直接テンプレートに渡さない!
→ 変数として使うだけ!評価させない!🙅♀️❌
✅ 2. テンプレートエンジンの設定を見直す!
→ Jinja2なら autoescape=True を設定!✨
✅ 3. WAF(Web Application Firewall)を導入する!
→ 攻撃っぽいリクエストをブロックする!🚧🔐
✅ 4. {{ }} を無効化する!
→ エスケープ処理をしっかり入れる!🛑✨
「この4つをやれば、SSTIの被害はほぼ防げる!💪🔥」
「なるほど〜!!💡✨ でも、実際にSSTIでやられた例ってあるの?」
「あるよ!!😎💥 例えば、2016年にGitHub Enterprise の脆弱性!あれはSSTIを利用してサーバーを乗っ取れる っていうヤバいやつだった!」
「えっ!?😨💦 そんな大手でもやられるの!?」
「そう!だから、開発者はSSTIにめっちゃ気をつけないといけないのだー!!⚠️🔥🔥」
🌟まとめ🌟
✅ SSTIは、テンプレートエンジンが悪用される脆弱性!⚠️
✅ コードを勝手に実行されると、サーバー乗っ取りも可能💀
✅ 対策は、エスケープ処理&適切な設定!✨🔒
「これで、SSTIのヤバさと対策はバッチリだね!!💪✨」
💡 クライアントサイド・テンプレート・インジェクション(CSTI)ってなに? 🤔💭
そうそう、「テンプレートインジェクション」 にはSSTI(サーバーサイド・テンプレート・インジェクション)だけじゃなくて、クライアントサイド(CSTI, Client-Side Template Injection) っていうのもあるよ!💡💻🔥
「SSTIはサーバー側でコードが実行されるやつだったけど、CSTIはクライアント(つまりブラウザ)で発生するやつ!💻⚠️」
「えっ!?😳 じゃあ、JavaScriptのコードが勝手に実行されるってこと?」
「その通り〜!✨🎯 例えば、最近のフロントエンド開発でよく使われるMustache.js とか AngularJS みたいなクライアントサイドのテンプレートエンジンがあるでしょ?」
「うんうん!👀✨ それがどうしたの?」
「もし、それらのテンプレートエンジンにユーザー入力をそのままぶち込んじゃうと、JavaScriptのコードが勝手に実行される ようになっちゃうのだ〜!!💥🔥」
💀 CSTIの危険な例 💀
「例えばね!💻✨ Webアプリの中で、こんなコードがあったとするよ!👇」
var template = "{{user}} さん、こんにちは!";
var compiled = Mustache.render(template, { user: input });
document.getElementById("greeting").innerHTML = compiled;
「このコードは、本来なら input にユーザーの名前を入れて、「○○さん、こんにちは!」 って表示するだけのつもりだったんだけど……」
「だけど?🤔💦」
「もし攻撃者が input に {{7*7}} って入れたら……」
「49 さん、こんにちは!」
「……えっ!?🤯 まさか、これも計算されちゃうの!?💦」
「そーなの!😱💥 これはまだ可愛いほうで、もし {{alert('ハッキング成功!')}} なんて入れたら……」
「えっ、まさか……!?😨💦」
🚨 「ハッキング成功!」っていうアラートが表示される!!💥💻⚠️
「うわぁぁぁ!!😱💦💦💦」
「つまり、CSTIを利用すると、Webページ内で好きなJavaScriptコードを実行できちゃうの!💀✨」
「……ってことは、XSS(クロスサイトスクリプティング)と同じ感じ?🤔」
「おっ!いい質問!💡✨ CSTIは、「テンプレートエンジンを悪用する形のXSS」 って考えると分かりやすいかも!🎯」
🛑 CSTIの対策! 🔒✨
「じゃあ、どうすればCSTIを防げるの?🥺💦」
「ふふふ、リナちゃんに任せるのだ〜!💪✨ 対策ポイントはこれ!👇」
✅ 1. ユーザーの入力をテンプレートエンジンに直接渡さない!
→ 「データバインド」は慎重にすること!🛑⚠️
✅ 2. {{ }} を無効化する or サニタイズする!
→ AngularJSなら $sce.trustAsHtml() を慎重に使う!
✅ 3. クライアントサイドテンプレートを使うなら、WAFを導入!
→ 危険な入力をフィルタリングする!🚧🔐
✅ 4. 必要ないなら、クライアントサイドのテンプレートエンジンを使わない!
→ そもそもリスクを減らすのが一番!😎✨
「この4つをやれば、CSTIの危険はグッと減るのだー!!🎯✨💖」
🌟 CSTIとSSTIの違い! 👀💡
🔹 SSTI(サーバーサイド・テンプレート・インジェクション)
実行場所:サーバー側 🏢💻
影響範囲:サーバー全体が乗っ取られる可能性大!💀
具体的なリスク:データ漏洩、システムコマンド実行、サーバー破壊😨
対策:エスケープ処理を徹底、テンプレートの設定変更、WAF導入 🔒🚧
危険度:超ヤバい(サーバー破壊や全データ流出もありえる!)💥💀⚠️
🔹 CSTI(クライアントサイド・テンプレート・インジェクション)
実行場所:ブラウザ側 🌐💻
影響範囲:ページ改ざんやXSS攻撃のリスク⚠️
具体的なリスク:JavaScriptの実行、Cookie盗難、フィッシング詐欺😨
対策:エスケープ処理を徹底、クライアントサイドのテンプレートエンジンの設定変更、WAF導入 🔒🚧
危険度:XSSレベル(情報漏洩やページ改ざんのリスクあり)⚡
「✨ こんな感じで、SSTIはサーバーを攻撃される超ヤバいやつ、CSTIはブラウザ側のXSSみたいなやつ! ってことが分かればOKだよ〜!!💡🔥💖」
「うわぁ……😨💦 どっちもちゃんと対策しないと大変なことになるんだね!」
「そーなの!😎💡 だから開発するときは、「テンプレートエンジンって入力を勝手に処理するんだ!」 って意識するのが大事!!🔥💪💻」
🌟 まとめ 🌟
✅ SSTI(サーバーサイド) → サーバーが乗っ取られる危険💀⚠️
✅ CSTI(クライアントサイド) → XSS攻撃みたいにJavaScript実行される!⚡
✅ どっちもエスケープ処理をしっかりするのが大事!✨🔒
「これで、SSTIとCSTIの違いはバッチリだね!🎯✨」
「リナちゃん、ありがと〜!!」
「えへへ〜🎶 リナちゃん、頑張ったもんね!!😆💖✨ みんなも、SSTIには気をつけてねー!!🚀🔥💻✨」