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
  • Err ≠ nil
  • La interfaz error()
  • Err se pasa como parametro o como es que se maneja el error para pasar de segundo?
  1. Aprender Go

Errores en Go - Uso de err ≠ nil

No, en Go, nil no es interpretado como 0. El valor nil en Go representa la ausencia de valor o la falta de inicialización para ciertos tipos, como pointers, slices, maps, channels, interfaces, funcs..

Cuando ves una comparación como != nil, no significa que se esté comparando con el número 0, sino que se está verificando si la variable ha sido inicializada o no. Si una variable de alguno de estos tipos tiene el valor nil, significa que no ha sido inicializada correctamente y, por lo tanto, intentar operar con ella causaría un error en tiempo de ejecución.

Ejemplo para map:

var m map[string]int
if m == nil {
    fmt.Println("El mapa no ha sido inicializado.")
}

En este caso, el mapa m está en su estado cero, que es nil, porque no ha sido inicializado con make. Si intentas agregar un valor a m sin inicializarlo, obtendrás un panic.

Err ≠ nil

Cuando ves la expresión err != nil en Go, significa que el programa está verificando si ha ocurrido un error.

En Go, muchas funciones devuelven un valor de error (error), que es una interfaz predefinida en el lenguaje. Si no ha ocurrido ningún error, la función devolverá nil como valor para el error, lo que indica que todo salió bien. Sin embargo, si ocurre un error, la función devolverá un valor que no es nil, y este valor contendrá información sobre el tipo de error que ocurrió.

Por eso, la verificación err != nil es una forma de comprobar si existe un error (si el valor de err no es nil, significa que algo salió mal).

Ejemplo típico:

file, err := os.Open("archivo.txt")
if err != nil {
    fmt.Println("Error al abrir el archivo:", err)
    return // Maneja el error, como devolviendo o terminando la función
}
defer file.Close()

// Si no hubo error, continúa el programa

Resumen:

  • err == nil → No hay error, todo está bien.

  • err != nil → Ocurrió un error, y deberías manejarlo.

La interfaz error()

El tipo error en Go es una interfaz predefinida en el lenguaje, y su definición es la siguiente:

type error interface {
    Error() string
}

Esto significa que cualquier valor que implemente el método Error() que retorne una cadena (string) es considerado un valor de tipo error. Cuando una función devuelve un error, puede ser nil (si no hubo errores) o un valor que implemente Error() (si hubo algún error).

Así que, en resumen:

  • err es solo una convención común para nombrar variables de error.

  • El tipo de err es error, que es una interfaz predefinida en Go.

Err se pasa como parametro o como es que se maneja el error para pasar de segundo?

Ejemplo

file, err := os.Open("archivo.txt")

En este caso, os.Open no recibe dos parámetros. La función Open solo recibe un parámetro: el nombre del archivo como una cadena (string). Lo que pasa es que devuelve dos valores: un descriptor de archivo (file) y un valor de error (err).

En Go, no se pasa un parámetro adicional de tipo error para el manejo de errores, sino que las funciones que pueden fallar devuelven un valor de tipo error como parte de sus retornos. El patrón común es que una función retorne tanto el resultado deseado como un valor de error, y luego tú como desarrollador verificas ese valor de error.

Ejemplo:

func hacerAlgoComplejo() (int, error) {
    // Lógica de la función
    if algoSalioMal {
        return 0, fmt.Errorf("algo salió mal")
    }
    return 42, nil
}
  • Aquí, la función hacerAlgoComplejo devuelve un entero (int) y un error (error).

  • Si algo sale mal dentro de la función, se devuelve un error usando fmt.Errorf, pero no se recibe un parámetro de tipo error.

  • Al llamar a la función, verificas si el error ocurrió:

resultado, err := hacerAlgoComplejo()
if err != nil {
    fmt.Println("Error:", err)
} else {
    fmt.Println("Resultado:", resultado)
}

Conclusión:

Cuando creas funciones complejas, no necesitas pasar un parámetro de tipo error a la función, sino que deberías hacer que la función devuelva un valor de tipo error cuando algo falle. Luego, al usar la función, verificas ese valor de error (err) para asegurarte de que todo esté funcionando correctamente.

Es una buena práctica que tus funciones retornen un valor de tipo error cuando sea necesario y que manejes esos errores de forma explícita en el código que llama a la función.

Preguntas para practicar:

  1. ¿Cuál es la diferencia entre la longitud y la capacidad de un slice?

  2. ¿Qué ocurre cuando modificas un slice que proviene de un array?

  3. Si creas un slice desde un array, ¿modificar el slice afecta el array original? Explica por qué.

  4. Escribe una función que acepte un slice de enteros y devuelva el promedio de esos enteros.

  5. ¿Qué hace la función append() internamente si se excede la capacidad del slice?

Mis respuestas:

1. la longotud es el tamaño total del slice mientras que la capacidad es la capacidad del slice añadir nuevos elementos antes de que necesite redimensionarse de nuevo
2. cuando se modifica un slice que proviene de un array no sucede nada malo ya que el slice es dinamico y puede modificarse a diferencia de un array que no se puede.
3. no lo afecta porque el slice es una nueva copia del array transformado a slice el cual si puede modificar su propia estructura sin probelma alguno, el array seguira tal cual.
4. func main() int{
 slice := []int{1,2,3,4}
leng = len(slice)
for i:=0; i<len(slice); i++{
suma := slice[i-1]+slice[1]
}
return suma/leng
}
5. la funcion append agrega nuevos elementos a un slice y si se excede de la capacidad del slice se retorna un error panic. 
  • Correcto. La longitud (len) es el número de elementos que actualmente contiene el slice, mientras que la capacidad (cap) es el número de elementos que puede contener antes de que Go redimensione el slice.

  • Parcialmente correcto. Modificar un slice afecta al array original si el slice aún está basado en el array subyacente. Los slices no son independientes del array; al contrario, comparten memoria. Así que, si modificas un slice, esos cambios se reflejan en el array original.

  • Incorrecto. Los slices no son copias del array original. Si creas un slice a partir de un array, ambos compartirán la misma memoria. Modificar el slice también modifica el array original, ya que ambos están referenciando la misma región de memoria.

  • Código incorrecto. En tu función, hay algunos problemas:

    • No has inicializado la variable suma.

    • Estás usando índices incorrectos dentro del loop.

    • Además, la función debería devolver float64 porque estamos calculando un promedio.

    Aquí te dejo la corrección:

func promedio(slice []int) float64 {
    suma := 0
    for _, valor := range slice {
        suma += valor
    }
    return float64(suma) / float64(len(slice))
}
  • Incorrecto. Cuando append() excede la capacidad del slice, no retorna un error ni un panic. En lugar de eso, Go crea un nuevo array con mayor capacidad, copia los elementos del array original a este nuevo array, y luego agrega el nuevo elemento. El slice devuelto apunta a este nuevo array.

PreviousEl uso de Make en channels, slices, mapsNextGO Defer

Last updated 6 months ago

🧛‍♀️