Other Injection Operators
Antes de continuar, probemos algunos otros operadores de inyección y veamos cómo maneja la aplicación web de manera diferente.
AND Operator
Podemos empezar con el operador AND
(&&
), de modo que nuestro payload final sería (127.0.0.1 && whoami
), y el comando ejecutado final sería el siguiente:
ping -c 1 127.0.0.1 && whoami
Como siempre debemos hacerlo, vamos a intentar ejecutar el comando en nuestra máquina Linux primero para asegurarnos de que funcione:
21y4d@htb[/htb]$ ping -c 1 127.0.0.1 && whoami
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=1.03 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.034/1.034/1.034/0.000 ms
21y4d
Como podemos ver, el comando se ejecuta y obtenemos el mismo resultado que obtuvimos anteriormente. Intenta consultar la tabla de operadores de inyección de la sección anterior y ver cómo es diferente el operador &&
(si no escribimos una IP y comenzamos directamente con &&
, ¿seguiría funcionando el comando?).
Ahora, podemos hacer lo mismo que antes copiando nuestro payload, pegándolo en nuestra solicitud HTTP en Burp Suite
, codificándolo en URL y luego enviándolo:
Como podemos ver, inyectamos exitosamente nuestro comando y recibimos el resultado esperado de ambos comandos.
OR Operator
Finalmente, probemos el operador de inyección OR
(||
). El operador OR
solo ejecuta el segundo comando si el primer comando falla en ejecutarse. Esto puede ser útil en casos donde nuestra inyección rompería el comando original sin una forma sólida de hacer que ambos comandos funcionen. Entonces, usar el operador OR
haría que nuestro nuevo comando se ejecute si el primero falla.
Si intentamos usar nuestro payload habitual con el operador ||
(127.0.0.1 || whoami
), veremos que solo se ejecutaría el primer comando:
21y4d@htb[/htb]$ ping -c 1 127.0.0.1 || whoami
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.635 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.635/0.635/0.635/0.000 ms
Esto se debe a cómo funcionan los comandos en bash
. Como el primer comando devuelve el código de salida 0
indicando ejecución exitosa, el comando bash
se detiene y no intenta el otro comando. Solo intentaría ejecutar el otro comando si el primero falla y devuelve un código de salida 1
.
Intenta usar el payload anterior en la solicitud HTTP y ve cómo lo maneja la aplicación web.
Intentemos romper intencionalmente el primer comando al no proporcionar una IP y usar directamente el operador ||
(|| whoami
), de modo que el comando ping
falle y nuestro comando inyectado se ejecute:
21y4d@htb[/htb]$ ping -c 1 || whoami
ping: usage error: Destination address required
21y4d
Como podemos ver, esta vez el comando whoami
se ejecutó después de que el comando ping
fallara y nos dio un mensaje de error. Entonces, ahora intentemos el payload (|| whoami
) en nuestra solicitud HTTP:
Vemos que esta vez solo obtuvimos el resultado del segundo comando como se esperaba. Con esto, estamos usando un payload mucho más simple y obteniendo un resultado mucho más limpio.
Estos operadores pueden ser utilizados para varios tipos de inyección, como SQL injections, LDAP injections, XSS, SSRF, XML, etc. Hemos creado una lista de los operadores más comunes que pueden ser usados para inyecciones:
Injection Type | Operators |
---|---|
SQL Injection | ' , ; -- /* */ |
Command Injection | ; && |
LDAP Injection | * ( ) & \| |
XPath Injection | ' or and not substring concat count |
OS Command Injection | ; & \| |
Code Injection | ' ; -- /* */ $() ${} #{} %{} ^ |
Directory Traversal/File Path Traversal | ../ ..\\ %00 |
Object Injection | ; & \| |
XQuery Injection | ' ; -- /* */ |
Shellcode Injection | \x \u %u %n |
Header Injection | \n \r\n \t %0d %0a %09 |
Ten en cuenta que esta tabla está incompleta, y muchas otras opciones y operadores son posibles. También depende en gran medida del entorno en el que estamos trabajando y probando.
En este módulo, estamos tratando principalmente con inyecciones de comandos directos, en las cuales nuestra entrada va directamente al comando del sistema y estamos recibiendo el resultado del comando. Para más información sobre inyecciones avanzadas de comandos, como inyecciones indirectas o inyección ciega, puedes consultar el módulo Whitebox Pentesting 101: Command Injection, que cubre métodos avanzados de inyección y muchos otros temas.