WriteUp
問題のインスタンスを立ち上げてアクセスすると下記の画面が表示される
適当な文字をテキストボックスに入力してOKを押下すると
画面遷移し入力したテキストがh1タグで囲まれて表示される
SSTIはServer Side Templete Injectionの略でテンプレート構文の脆弱性をついてコードをインジェクションする攻撃手法。
問題のWebサイトが一体どんなWebフレームワークを使っているのかがわかれば
対象に応じたコードをテキストボックスからインジェクションすることでフラグを取得できるはず。
開発者ツールからNetworkタブをみると
ResponseヘッダーのServerにPythonの文字があるのでおそらくテンプレートエンジンはJinja2あたりと検討をつける
PythonフレームワークへのSSTI手法をググってみると下記のサイトが見つかった
https://behradtaher.dev/2021/12/02/SSTI-In-Python-Frameworks/#Abusing-Jinja2-to-call-built-in-Python-methods
Pythonの継承階層をたどって、"subprocess.Popen"までたどり着ければ
外部コマンド等を実行することでサーバの情報を取得することができるはず
"".__class__.__base__.__subclasses__()
でstrのベースクラス(object)のサブクラスを取得するとPopenが見つかる
{{"".__class__.__base__.__subclasses__()[356](["ls"],stdout=-1).stdout.read()}}
subprocess.Popenは357個目の要素なので配列のインデックスに356を指定してlsコマンドを発行する。
Popenの標準出力をとるためにstdout=-1(subprocess.PIPE)を指定してreadする。
"flag"というファイルがみつかるので同様にcatコマンドでファイルの中身をみるとフラグが手に入る
下記のサイトにはテンプレートエンジンを判別するチャートが載っていた
また、Flaskアプリケーションの場合、requestなどのオブジェクトを経由することでビルトインオブジェクトにアクセスしosモジュールからpopenを実行する方法もあるらしい