Saltar a contenido

Code Injection

Inyección de código

Descripción

La inyección de código se refiere a una categoría de métodos de ataque que implican la inserción de código que la aplicación evalúa posteriormente. Esta forma de ataque aprovecha el manejo deficiente de datos no confiables. Tales vulnerabilidades a menudo surgen de una validación insuficiente de los datos proporcionados por el usuario de entrada/salida.

La inyección de código se distingue de la inyección de comandos por el hecho de que las capacidades de un atacante están limitadas únicamente por las funcionalidades inherentes al lenguaje de programación de destino. Por ejemplo, si un atacante inyecta con éxito código PHP en una aplicación y lo ejecuta, sus acciones están restringidas por las capacidades de PHP. Por otro lado, la inyección de comandos implica explotar el código preexistente para ejecutar comandos del sistema.

print "Enter math equation: "
user_input = gets.chomp

begin
  result = eval(user_input)
  puts "Result: #{result}"
rescue StandardError => e
  puts "Error: #{e.message}"
end
<?php
$userInput = $_POST['expression']; 

$result = null;
try {
    eval("\$result = $userInput;");
} catch (ParseError $e) {
    echo "Error: Invalid Expression";
}

echo "Result: " . $result;
?>
try:
    user_input = input("Enter a math expression: ")
    result = eval(user_input)
    print("Result:", result)
except Exception as e:
    print("Error:", e)

Recomendación

Para mitigar las vulnerabilidades de inyección de código, aquí hay algunas posibles mitigaciones:

  • Evitar evaluar la entrada del usuario: La mejor manera de protegerse contra la inyección de código es no evaluar la entrada del usuario en absoluto.

  • Validación y saneamiento de entradas: Si es necesario evaluar la entrada del usuario, primero debe sanearse para eliminar caracteres especiales que puedan permitir la ejecución del código, como paréntesis, por ejemplo.

  • Uso de un entorno sandbox: Una forma de mitigar el riesgo de inyección de código es evaluando la entrada del usuario en un entorno sandbox aislado y restringido.

  • Principio de privilegio mínimo: Aunque no está específicamente relacionado con la inyección de código, el principio de privilegio mínimo puede ayudar a reducir el impacto de las vulnerabilidades al reducir el privilegio que un atacante podría obtener si logra comprometer el sistema con éxito.

print "Enter math equation: "
user_input = gets.chomp

# Sanitizar la entrada del usuario
sanitized_input = user_input.gsub(/[^0-9+\-\/\*]/, '')

begin
result = eval(sanitized_input)
puts "Result: #{result}"
rescue StandardError => e
puts "Error: #{e.message}"
end
<?php
$userInput = $_POST['expression']; 

// Sanitize user input
$sanitizedInput = preg_replace("/[^0-9+\-\/\*]/", "", $userInput);

$result = null;
try {
    $result = eval("return $sanitizedInput;");
} catch (ParseError $e) {
    echo "Error: Invalid Expression";
}

echo "Result: " . $result;
?>
import re

try:
    user_input = input("Enter a Python expression: ")

    # Sanitizar la entrada del usuario
    sanitized_input = re.sub(r'[^0-9+\-*/]', '', user_input)

    result = eval(sanitized_input)
    print("Result:", result)
except Exception as e:
    print("Error:", e)

Enlaces

Estándares

  • CWE_TOP_25:
    • CWE_20
    • CWE_94
  • GDPR:
    • ART_5
    • ART_32
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213
    • SECURITY255