> For the complete documentation index, see [llms.txt](https://4lec4st.gitbook.io/4lec4st/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://4lec4st.gitbook.io/4lec4st/pt1-tryhackme/web-hacking/command-injection.md).

# Command Injection

### ¿Qué es la inyección de comandos?

La **inyección de comandos** es una vulnerabilidad que permite a un atacante ejecutar comandos arbitrarios del sistema operativo a través de una aplicación vulnerable, utilizando los mismos privilegios que dicha aplicación.\
Por ejemplo, si una aplicación web se ejecuta como el usuario `joe` y es vulnerable, los comandos inyectados se ejecutarán con los permisos del usuario `joe`.

Esta vulnerabilidad también se conoce comúnmente como **Ejecución Remota de Código (RCE)**, ya que permite ejecutar código remotamente en el sistema. Son vulnerabilidades altamente críticas porque brindan acceso directo al sistema afectado, permitiendo leer archivos, extraer datos y mucho más.

🔍 **Ejemplo:** Ejecutar el comando `whoami` a través de una aplicación vulnerable para ver con qué usuario se está ejecutando es un caso típico de inyección de comandos.

### Relevancia

* Fue una de las 10 principales vulnerabilidades reportadas por el informe AppSec de **Contrast Security en 2019**.
* OWASP también incluye vulnerabilidades de este tipo en su Top 10 de riesgos de seguridad.

***

### ¿Cómo ocurre?

Las aplicaciones web a menudo usan funciones de lenguajes como PHP, Python o Node.js para ejecutar comandos del sistema operativo. Un error común es pasar directamente entradas del usuario a funciones que ejecutan comandos.

#### 🧩 Ejemplo (PHP):

```php
<?php
$title = $_GET['title'];
$output = shell_exec("grep $title songtitle.txt");
echo $output;
?>
```

**¿Qué hace este código?**

1. La aplicación almacena archivos MP3 en un directorio.
2. El usuario ingresa el nombre de una canción.
3. El valor de `$title` se pasa directamente al comando `grep`.
4. Se busca en el archivo `songtitle.txt` si la canción existe.

⚠️ **Riesgo:** Un atacante podría modificar el campo de entrada para inyectar comandos adicionales que se ejecuten junto con `grep`, como por ejemplo `; cat /etc/passwd`.

***

### Ejemplo en Python (Flask):

```python
from flask import Flask
import subprocess

app = Flask(__name__)

@app.route('/<cmd>')
def execute(cmd):
    return subprocess.getoutput(cmd)
```

* Usa Flask para montar un servidor web.
* Ejecuta cualquier comando pasado en la URL.
* Acceder a `/whoami` ejecutará ese comando en el servidor.

***

### 🧪 Detección de Inyección de Comandos

#### Tipos:

| Tipo                          | Descripción                                                                 |
| ----------------------------- | --------------------------------------------------------------------------- |
| **Blind Command Injection**   | No hay salida visible. El comando se ejecuta, pero no se muestra respuesta. |
| **Verbose Command Injection** | Hay salida directa. El resultado del comando es visible en la app.          |

***

#### 🔍 Detección de Inyección a Ciegas (Blind)

Cuando no hay salida visible, se puede probar utilizando comandos que generen **retardo** o **efectos secundarios** observables.

**Payloads útiles:**

* `ping -c 10 127.0.0.1`
* `sleep 5`
* Redirección: `whoami > output.txt` → Luego acceder a `output.txt` para leer la salida.

📌 Requiere conocimiento de diferencias entre comandos en **Linux y Windows**.

**Uso de `curl`:**

```bash
curl "http://vulnerable.app/process.php?search=The%20Beatles;whoami"
```

***

#### 🔍 Detección de Inyección Verbosa (Verbose)

Este tipo es más sencillo de detectar ya que la aplicación muestra la salida del comando directamente.

**Ejemplos de comandos útiles:**

* `whoami`
* `ping -c 1 127.0.0.1`
* `id`
* `uname -a`

***

### 💡 Payloads útiles

#### Linux:

```bash
; whoami
&& id
| uname -a
`cat /etc/passwd`
```

#### Windows:

```cmd
& whoami
&& net user
| systeminfo
```

***

### 🛡️ Prevención de Inyección de Comandos

#### 1. Evitar funciones peligrosas

En PHP, las siguientes funciones son vulnerables si no se controlan adecuadamente:

* `exec()`
* `system()`
* `passthru()`
* `shell_exec()`

🔒 Estas funciones **no deben usarse con datos de entrada sin sanitizar**.

#### 2. Validación y saneamiento de entradas

Una de las defensas más efectivas es validar y limpiar cualquier dato proporcionado por el usuario.

**Ejemplo en PHP:**

```php
$input = filter_input(INPUT_GET, 'number', FILTER_VALIDATE_INT);
if ($input !== false) {
    echo shell_exec("echo $input");
}
```

* Solo permite datos numéricos.
* Rechaza cualquier entrada que contenga caracteres especiales como `&`, `;`, etc.

***

### 🕳️ Bypass de filtros

Incluso cuando una aplicación implementa filtros, es posible que se puedan evadir:

* Si se eliminan comillas, podemos usar sus equivalentes en hexadecimal.
* Si se filtran ciertos caracteres, se puede aprovechar la lógica del filtro para modificar el payload y lograr el mismo efecto.

💡 **Ejemplo:**\
Si `"whoami"` es bloqueado, se puede usar su representación hex como `\x77\x68\x6f\x61\x6d\x69`.
