* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Si `==` est utilisé en PHP, il y a des cas inattendus où la comparaison ne se comporte pas comme prévu. Cela est dû au fait que "==" ne compare que les valeurs transformées en même type, si vous voulez également comparer que le type des données comparées est le même, vous devez utiliser `===`.
*`"string" == 0 -> True` Une chaîne qui ne commence pas par un nombre est égale à un nombre
*`"0xAAAA" == "43690" -> True` Les chaînes composées de nombres en format décimal ou hexadécimal peuvent être comparées à d'autres nombres/chaînes avec True comme résultat si les nombres étaient identiques (les nombres dans une chaîne sont interprétés comme des nombres)
*`"0e3264578" == 0 --> True` Une chaîne commençant par "0e" et suivie de n'importe quoi sera égale à 0
*`"0X3264578" == 0X --> True` Une chaîne commençant par "0" et suivie de n'importe quelle lettre (X peut être n'importe quelle lettre) et suivie de n'importe quoi sera égale à 0
*`"0e12334" == "0" --> True` C'est très intéressant car dans certains cas, vous pouvez contrôler l'entrée de chaîne de "0" et certains contenus qui sont hachés et comparés à celui-ci. Par conséquent, si vous pouvez fournir une valeur qui créera un hachage commençant par "0e" et sans aucune lettre, vous pourriez contourner la comparaison. Vous pouvez trouver des **chaînes déjà hachées** avec ce format ici: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
*`"X" == 0 --> True` Toute lettre dans une chaîne est égale à l'entier 0
Plus d'informations sur [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
**Type Juggling** affecte également la fonction `in_array()` par défaut (vous devez définir sur true le troisième argument pour faire une comparaison stricte):
Si cette fonction est utilisée pour **toute vérification d'authentification** (comme la vérification du mot de passe) et que l'utilisateur contrôle un côté de la comparaison, il peut envoyer un tableau vide au lieu d'une chaîne de caractères comme valeur du mot de passe (`https://example.com/login.php/?username=admin&password[]=`) et contourner cette vérification :
Même si `===` est **utilisé**, il peut y avoir des erreurs qui rendent la **comparaison vulnérable** à la **conversion de type**. Par exemple, si la comparaison **convertit les données en un type d'objet différent avant de les comparer** :
**`preg_match()`** peut être utilisé pour **valider l'entrée utilisateur** (il **vérifie** si un **mot/regex** de la **liste noire** est **présent** dans l'**entrée utilisateur** et si ce n'est pas le cas, le code peut continuer son exécution).
Cependant, lors de la délimitation du début de la regexp, `preg_match()`**ne vérifie que la première ligne de l'entrée utilisateur**, puis si vous pouvez **envoyer** l'entrée sur **plusieurs lignes**, vous pourriez être en mesure de contourner cette vérification. Exemple :
Pour contourner cette vérification, vous pouvez **envoyer la valeur avec des retours à la ligne urlencodés** (`%0A`) ou si vous pouvez envoyer des **données JSON**, envoyez-les sur **plusieurs lignes** :
(Ce bypass a apparemment été testé sur PHP 5.2.5 et je n'ai pas réussi à le faire fonctionner sur PHP 7.3.15)\
Si vous pouvez envoyer à `preg_match()` une **entrée très grande** valide, il **ne pourra pas la traiter** et vous pourrez **contourner** la vérification. Par exemple, si elle met une liste noire sur un JSON, vous pourriez envoyer :
Le type juggling est une technique couramment utilisée pour l'obscurcissement de code PHP. Il s'agit de manipuler les types de données pour tromper le programmeur et le faire croire que les données sont différentes de ce qu'elles sont réellement. Par exemple, en PHP, la chaîne "0e123" est considérée comme un nombre en notation scientifique, donc égale à zéro. Cela peut être utilisé pour contourner les vérifications de mot de passe, car si le hachage du mot de passe commence par "0e", PHP le considérera comme zéro et le mot de passe sera considéré comme valide.
Si PHP redirige vers une autre page mais qu'aucune fonction **`die`** ou **`exit`** n'est appelée après que l'en-tête `Location` soit défini, PHP continue d'exécuter et d'ajouter les données au corps de la réponse :
* **register\_globals**: Dans **PHP < 4.1.1.1** ou si mal configuré, **register\_globals** peut être actif (ou leur comportement est imité). Cela implique que dans les variables globales comme $\_GET si elles ont une valeur par exemple $\_GET\["param"]="1234", vous pouvez y accéder via **$param. Par conséquent, en envoyant des paramètres HTTP, vous pouvez écraser des variables** qui sont utilisées dans le code.
* Les **cookies PHPSESSION du même domaine sont stockés au même endroit**, donc si dans un domaine **différents cookies sont utilisés dans différents chemins** vous pouvez faire en sorte qu'un chemin **accède au cookie du chemin** en définissant la valeur du cookie de l'autre chemin.\
De cette façon, si **les deux chemins accèdent à une variable portant le même nom**, vous pouvez faire en sorte que **la valeur de cette variable dans le chemin1 s'applique au chemin2**. Et ensuite, le chemin2 considérera les variables du chemin1 comme valides (en donnant au cookie le nom qui lui correspond dans le chemin2).
* Lorsque vous avez les **noms d'utilisateur** des utilisateurs de la machine. Vérifiez l'adresse: **/\~\<USERNAME>** pour voir si les répertoires php sont activés.
* [**LFI et RCE en utilisant des wrappers php**](../../../pentesting-web/file-inclusion/)
Ces fonctions sont généralement utilisées en PHP pour **générer des hachages à partir de mots de passe** et pour **vérifier** si un mot de passe est correct par rapport à un hachage.\
Les algorithmes pris en charge sont: `PASSWORD_DEFAULT` et `PASSWORD_BCRYPT` (commence par `$2y$`). Notez que **PASSWORD\_DEFAULT est souvent identique à PASSWORD\_BCRYPT.** Et actuellement, **PASSWORD\_BCRYPT** a une **limite de taille dans l'entrée de 72 octets**. Par conséquent, lorsque vous essayez de hacher quelque chose de plus grand que 72 octets avec cet algorithme, seuls les premiers 72B seront utilisés:
Si une **page PHP imprime des erreurs et renvoie une entrée fournie par l'utilisateur**, l'utilisateur peut faire en sorte que le serveur PHP renvoie un **contenu suffisamment long** pour que lorsqu'il essaie d'**ajouter les en-têtes** dans la réponse, le serveur génère une erreur.\
Dans le scénario suivant, **l'attaquant a provoqué de grosses erreurs** sur le serveur, et comme vous pouvez le voir à l'écran, lorsque PHP a essayé de **modifier les informations d'en-tête, il n'a pas pu** (par exemple, l'en-tête CSP n'a pas été envoyé à l'utilisateur) :
Cette fonction de PHP vous permet d'**exécuter du code écrit dans une chaîne de caractères** afin de **renvoyer vrai ou faux** (et en fonction de cela, modifier l'exécution). Habituellement, la variable utilisateur sera insérée au milieu d'une chaîne de caractères. Par exemple:\
`assert("strpos($_GET['page']),'..') === false")` --> Dans ce cas, pour obtenir une **RCE**, vous pourriez faire:
Vous devrez **casser** la **syntaxe** du code, **ajouter** votre **charge utile**, puis la **réparer**. Vous pouvez utiliser des **opérations logiques** telles que "**and**" ou "%26%26" ou "|". Notez que "or" ou "||" ne fonctionne pas car si la première condition est vraie, notre charge utile ne sera pas exécutée. De même, ";" ne fonctionne pas car notre charge utile ne sera pas exécutée.
*`?order=id;}//` : nous obtenons un message d'erreur (`Parse error: syntax error, unexpected ';'`). Il nous manque probablement une ou plusieurs parenthèses.
*`?order=id);}//` : nous obtenons un **avertissement**. Cela semble correct.
*`?order=id));}//` : nous obtenons un message d'erreur (`Parse error: syntax error, unexpected ')' i`). Nous avons probablement trop de parenthèses fermantes.
Si vous pouvez **télécharger** un **.htaccess**, vous pouvez **configurer** plusieurs choses et même exécuter du code (en configurant les fichiers avec l'extension .htaccess pour qu'ils puissent être **exécutés**).
Vérifiez si vous pouvez insérer du code dans des appels à ces fonctions (à partir de [ici](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
Si vous déboguez une application PHP, vous pouvez activer l'affichage des erreurs globalement dans `/etc/php5/apache2/php.ini` en ajoutant `display_errors = On` et redémarrer Apache : `sudo systemctl restart apache2`.
Les enveloppes et protocoles PHP pourraient vous permettre de **contourner les protections d'écriture et de lecture** dans un système et de le compromettre. Pour [**plus d'informations, consultez cette page**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
Si vous voyez que **Xdebug** est **activé** dans une sortie `phpconfig()`, vous devriez essayer d'obtenir une RCE via [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit).
Si dans une page vous pouvez **créer un nouvel objet d'une classe arbitraire**, vous pourriez être en mesure d'obtenir une RCE, vérifiez la page suivante pour apprendre comment faire :
XOR est un opérateur binaire qui compare deux bits. Si les bits sont différents, le résultat est 1, sinon le résultat est 0. En PHP, l'opérateur XOR est représenté par le symbole `^`.
L'opérateur XOR peut être utilisé pour chiffrer et déchiffrer des données. Pour chiffrer des données, chaque octet est XORé avec une clé. Pour déchiffrer les données, la même clé est utilisée pour XORer les données chiffrées.
Voici un exemple de chiffrement XOR en PHP :
```php
function xor_encrypt($data, $key) {
$key_len = strlen($key);
$result = '';
for($i = 0; $i <strlen($data);++$i){
$result .= $data[$i] ^ $key[$i % $key_len];
}
return $result;
}
```
Dans cet exemple, la fonction `xor_encrypt` prend deux arguments : les données à chiffrer et la clé de chiffrement. La fonction itère sur chaque octet des données et le XOR avec l'octet correspondant de la clé. La clé est répétée jusqu'à ce qu'elle soit de la même longueur que les données.
Pour déchiffrer les données, la même fonction peut être utilisée avec la même clé de chiffrement :
```php
function xor_decrypt($data, $key) {
return xor_encrypt($data, $key);
}
```
Il est important de noter que le chiffrement XOR n'est pas considéré comme sûr car il est vulnérable à une attaque par force brute. Cependant, il peut être utilisé comme une mesure de sécurité supplémentaire pour protéger les données sensibles.
Donc, si vous pouvez **exécuter du PHP arbitraire sans chiffres ni lettres**, vous pouvez envoyer une requête comme celle-ci en abusant de cette charge utile pour exécuter du PHP arbitraire:
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"
* Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live).
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).