es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Falsificación de petición en el lado del servidor (SSRF) – escaneo de fortaleza

En mi aplicación C#, el siguiente método llama al servicio y devuelve datos. En la instrucción de retorno se ha presentado un problema de seguridad detectado por Fortify en la categoría de manipulación de solicitudes del lado del servidor (Server side request forgery). No se añade ningún parámetro a la URL en el método, simplemente se utiliza “uri” para obtener los datos. Soy completamente nuevo en esto.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Explicación de la vulnerabilidad de manipulación de solicitudes del servidor (SSRF)

    La vulnerabilidad de manipulación de solicitudes del servidor (SSRF, por sus siglas en inglés) permite a un atacante enviar solicitudes desde una aplicación web a servidores a los que no se debería acceder directamente. Los atacantes aprovechan esta vulnerabilidad para enviar solicitudes a recursos de la red interna mediante la manipulación de los parámetros URL que el servidor web utiliza para conectarse a otros servicios. Esto puede resultar en acceso no autorizado a datos sensibles o en la ejecución de código malicioso en el servidor.

    Posible solución para el problema

    Para mitigar la vulnerabilidad de manipulación de solicitudes del servidor en el código C# proporcionado, especifique los protocolos y dominios permitidos para la URI antes de utilizarla. Esto se puede hacer utilizando el método Uri.TryCreate() para validar la URI y comprobar si está permitida, y luego utilizando la clase HttpWebRequest para realizar la solicitud. Además, evite utilizar la entrada suministrada por el usuario para construir la URI y sanitize la entrada de fuentes de terceros y recursos internos.

    Aquí hay un ejemplo de cómo solucionar el problema:

    c#
    Uri requestUri;
    if (Uri.TryCreate(uri, UriKind.Absolute, out requestUri))
    {
    if (requestUri.Scheme.Equals("http") || requestUri.Scheme.Equals("https"))
    {
    if (!requestUri.Host.Equals("example.com"))
    {
    HttpWebRequest request = WebRequest.Create(requestUri) as HttpWebRequest;
    request.Proxy = null;
    request.Method = "GET";
    request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)";
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
    StreamReader reader = new StreamReader(response.GetResponseStream());
    string responseText = reader.ReadToEnd();
    return JsonObject.GetDynamicJsonObject(responseText);
    }
    }
    }
    }

    Este código modificado comprueba si el esquema es HTTP o HTTPS y si el nombre de dominio está autorizado antes de enviar la solicitud al servidor. También establece el UserAgent para evitar ser filtrado por algunos servidores.

Comments are closed.