<summary><strong>Aprende a hackear AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
Si se usa `==` en PHP, entonces hay casos inesperados donde la comparación no se comporta como se espera. Esto se debe a que "==" solo compara valores transformados al mismo tipo, si también quieres comparar que el tipo de los datos comparados sea el mismo necesitas usar `===`.
*`"0xAAAA" == "43690" -> True` Cadenas compuestas por números en formato dec o hex pueden compararse con otros números/cadenas con True como resultado si los números fueran iguales (los números en una cadena se interpretan como números)
*`"0e3264578" == 0 --> True` Una cadena que comienza con "0e" y seguida de cualquier cosa será igual a 0
*`"0X3264578" == 0X --> True` Una cadena que comienza con "0" y seguida de cualquier letra (X puede ser cualquier letra) y seguida de cualquier cosa será igual a 0
*`"0e12334" == "0" --> True` Esto es muy interesante porque en algunos casos puedes controlar la entrada de cadena de "0" y algún contenido que está siendo hasheado y comparado con él. Por lo tanto, si puedes proporcionar un valor que creará un hash que comience con "0e" y sin ninguna letra, podrías eludir la comparación. Puedes encontrar **cadenas ya hasheadas** con este formato aquí: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
Más información en [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
**Manipulación de tipos** también afecta a la función `in_array()` por defecto (necesitas establecer en true el tercer argumento para hacer una comparación estricta):
Si esta función se utiliza para **cualquier verificación de autenticación** (como la comprobación de la contraseña) y el usuario controla un lado de la comparación, puede enviar un arreglo vacío en lugar de una cadena como valor de la contraseña (`https://example.com/login.php/?username=admin&password[]=`) y eludir esta verificación:
Incluso si se utiliza `===` podrían haber errores que hacen la **comparación vulnerable** a la **manipulación de tipos**. Por ejemplo, si la comparación **convierte los datos a un tipo de objeto diferente antes de comparar**:
**`preg_match()`** podría usarse para **validar la entrada del usuario** (verifica si alguna **palabra/expresión regular** de una **lista negra** está **presente** en la **entrada del usuario** y si no está, el código puede continuar su ejecución).
Sin embargo, al delimitar el inicio de la expresión regular `preg_match()`**solo verifica la primera línea de la entrada del usuario**, entonces, si de alguna manera puedes **enviar** la entrada en **varias líneas**, podrías ser capaz de omitir esta verificación. Ejemplo:
Para eludir esta comprobación podrías **enviar el valor con nuevas líneas codificadas en URL** (`%0A`) o si puedes enviar **datos JSON**, envíalos en **varias líneas**:
Si puedes enviar a `preg_match()` una entrada válida muy **grande**, **no podrá procesarla** y podrás **bypass** la verificación. Por ejemplo, si está en la lista negra un JSON, podrías enviar:
En resumen, el problema ocurre porque las funciones `preg_*` en PHP se basan en la [biblioteca PCRE](http://www.pcre.org/). En PCRE, ciertas expresiones regulares se emparejan utilizando una gran cantidad de llamadas recursivas, lo que consume mucho espacio de pila. Es posible establecer un límite en la cantidad de recursiones permitidas, pero en PHP este límite [por defecto es de 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), lo cual es más de lo que cabe en la pila.
[Este hilo de Stackoverflow](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) también fue vinculado en la publicación donde se habla más en profundidad sobre este problema. Nuestra tarea ahora era clara:\
**Enviar una entrada que hiciera que la regex realizara 100\_000+ recursiones, causando SIGSEGV, haciendo que la función `preg_match()` devuelva `false` y así hacer que la aplicación piense que nuestra entrada no es maliciosa, lanzando la sorpresa al final del payload algo como `{system(<verybadcommand>)}` para obtener SSTI --> RCE --> flag :)**.
Bueno, en términos de regex, en realidad no estamos haciendo 100k "recursiones", sino que estamos contando "pasos de retroceso", que como indica la [documentación de PHP](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), por defecto es de 1\_000\_000 (1M) en la variable `pcre.backtrack_limit`.\
Para alcanzar eso, `'X'*500_001` resultará en 1 millón de pasos de retroceso (500k hacia adelante y 500k hacia atrás):
Si PHP está redirigiendo a otra página pero no se llama a la función **`die`** o **`exit`** **después de que se establece el encabezado `Location`**, PHP continúa ejecutando y añadiendo los datos al cuerpo:
* **register_globals**: En **PHP < 4.1.1.1** o si está mal configurado, **register_globals** puede estar activo (o su comportamiento está siendo imitado). Esto implica que en variables globales como $\_GET si tienen un valor, por ejemplo, $\_GET\["param"]="1234", puedes acceder a él a través de **$param. Por lo tanto, al enviar parámetros HTTP puedes sobrescribir variables** que se utilizan dentro del código.
* Las **cookies PHPSESSION del mismo dominio se almacenan en el mismo lugar**, por lo tanto, si dentro de un dominio **se utilizan diferentes cookies en diferentes rutas**, puedes hacer que una ruta **acceda a la cookie de la otra ruta** estableciendo el valor de la cookie de la otra ruta.\
De esta manera, si **ambas rutas acceden a una variable con el mismo nombre**, puedes hacer que el **valor de esa variable en la ruta1 se aplique a la ruta2**. Y entonces la ruta2 tomará como válidas las variables de la ruta1 (dándole a la cookie el nombre que le corresponde en la ruta2).
* Cuando tienes los **nombres de usuario** de los usuarios de la máquina. Comprueba la dirección: **/\~\<USERNAME>** para ver si los directorios php están activados.
* [**LFI y RCE usando envoltorios de php**](../../../pentesting-web/file-inclusion/)
Estas funciones se utilizan típicamente en PHP para **generar hashes a partir de contraseñas** y para **verificar** si una contraseña es correcta en comparación con un hash.\
Los algoritmos compatibles son: `PASSWORD_DEFAULT` y `PASSWORD_BCRYPT` (comienza con `$2y$`). Ten en cuenta que **PASSWORD_DEFAULT es frecuentemente lo mismo que PASSWORD_BCRYPT.** Y actualmente, **PASSWORD_BCRYPT** tiene una **limitación de tamaño en la entrada de 72bytes**. Por lo tanto, cuando intentas hashear algo más grande que 72bytes con este algoritmo, solo se utilizarán los primeros 72B:
Si una **página PHP está mostrando errores y devolviendo algún input proporcionado por el usuario**, el usuario puede hacer que el servidor PHP imprima de vuelta un **contenido lo suficientemente largo** para que, cuando intente **añadir las cabeceras** a la respuesta, el servidor arroje un error.\
En el siguiente escenario, el **atacante hizo que el servidor lanzara algunos errores grandes**, y como puedes ver en la pantalla cuando PHP intentó **modificar la información de la cabecera, no pudo** (así que, por ejemplo, la cabecera CSP no fue enviada al usuario):
Esta función dentro de php te permite **ejecutar código que está escrito en una cadena** para **devolver verdadero o falso** (y dependiendo de esto alterar la ejecución). Normalmente la variable de usuario se insertará en medio de una cadena. Por ejemplo:\
Necesitarás **romper** la sintaxis del código, **añadir** tu **payload** y luego **repararlo**. Puedes usar **operaciones lógicas** como "**and" o "%26%26" o "|"**. Ten en cuenta que "or", "||" no funciona porque si la primera condición es verdadera, nuestro payload no se ejecutará. De la misma manera, ";" no funciona ya que nuestro payload no se ejecutará.
Si puedes **subir** un **.htaccess**, entonces puedes **configurar** varias cosas e incluso ejecutar código (configurando que archivos con extensión .htaccess puedan ser **ejecutados**).
Si encuentras una vulnerabilidad que te permite **modificar variables de entorno en PHP** (y otra para subir archivos, aunque con más investigación quizás se pueda evitar), podrías abusar de este comportamiento para obtener **RCE**.
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Esta variable de entorno te permite cargar bibliotecas arbitrarias al ejecutar otros binarios (aunque en este caso podría no funcionar).
* **`PHPRC`** : Indica a PHP **dónde localizar su archivo de configuración**, usualmente llamado `php.ini`. Si puedes subir tu propio archivo de configuración, entonces, usa `PHPRC` para dirigir a PHP hacia él. Añade una entrada de **`auto_prepend_file`** especificando un segundo archivo subido. Este segundo archivo contiene código **PHP normal, que luego es ejecutado** por el tiempo de ejecución de PHP antes de cualquier otro código.
1. Sube un archivo PHP que contenga nuestro shellcode
2. Sube un segundo archivo, que contenga una directiva de **`auto_prepend_file`** instruyendo al preprocesador de PHP para ejecutar el archivo que subimos en el paso 1
3. Establece la variable `PHPRC` al archivo que subimos en el paso 2.
* Obtén más información sobre cómo ejecutar esta cadena [**desde el informe original**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
* Si **no puedes subir archivos**, podrías usar en FreeBSD el archivo `/dev/fd/0` que contiene el **`stdin`**, siendo el **cuerpo** de la solicitud enviada al `stdin`:
Si estás depurando una aplicación PHP puedes habilitar globalmente la impresión de errores en `/etc/php5/apache2/php.ini` agregando `display_errors = On` y reiniciar apache: `sudo systemctl restart apache2`
Los envoltorios y protocolos de PHP podrían permitirte **burlar las protecciones de escritura y lectura** en un sistema y comprometerlo. Para [**más información consulta esta página**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
Si ves que **Xdebug** está **habilitado** en un resultado de `phpconfig()` deberías intentar obtener RCE a través de [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
Si en una página puedes **crear un nuevo objeto de una clase arbitraria** podrías ser capaz de obtener RCE, consulta la siguiente página para aprender cómo:
Entonces, si puedes **ejecutar PHP arbitrario sin números ni letras** puedes enviar una solicitud como la siguiente abusando de ese payload para ejecutar PHP arbitrario:
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"
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si quieres ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de github** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).