Inyección de SQL ASP.NET

3

Tengo un sistema de autenticación personalizado en mi sitio web ASP.NET que me puede ayudar a registrar usuarios desde mis aplicaciones de Windows (Escritorio) y móviles (Android). Esto significa que no uso la Configuración de ASP.NET.

Tengo este código cuando el usuario presiona el botón de inicio de sesión.

    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    SqlCommand com = new SqlCommand();
    con.Open();
    com.Connection = con;
    com.CommandText = "SELECT * FROM [Users-Users] WHERE (Password=@Password) AND (Username=@Username) ";
    com.Parameters.AddWithValue("Password", System.Web.HttpUtility.HtmlEncode(PasswordTextBox.Text));
    com.Parameters.AddWithValue("Username", System.Web.HttpUtility.HtmlEncode(UsernameTextBox.Text));
    SqlDataReader data = com.ExecuteReader();
    if (data.Read())
    {
        //Logged in successfully here I have redirect options
    }

Puedes ver que tengo una codificación HTML que puede hacer esto:

    &  → & (ampersand, U+0026)
    &lt;   → < (less-than sign, U+003C)
    &gt;   → > (greater-than sign, U+003E)
    &quot; → " (quotation mark, U+0022)
    &apos; → ' (apostrophe, U+0027)

Entonces, ¿podemos iniciar sesión sin contraseña usando Sql Injection? por ejemplo →

username textbox :admin
password textbox :pass" OR 1=1
    
pregunta 06.08.2013 - 12:08
fuente

2 respuestas

4

Está utilizando consultas parametrizadas de forma coherente para todos los valores variables, por lo que no hay un ataque de inyección SQL.

Sin embargo, almacenar los valores de la base de datos en formato codificado en HTML es un antipattern. Hará difícil procesar los datos a nivel SQL (ya que 1 carácter de db ya no es igual a un carácter en la página), producirá resultados codificados de forma inadecuada para formatos no HTML (por ejemplo, envío de correo), y No podré codificar correctamente los datos que ingresen a la base de datos por otros medios (o que no toquen la base de datos, por ejemplo, una salida de Parámetro directamente en la página).

El tiempo para codificar HTML es cuando se está colocando algo de texto en una página HTML. En las plantillas ASP.NET, obtiene la etiqueta <%: ... %> para hacer esto automáticamente, así como los atributos de WebForms que hacen lo correcto (precaución: no siempre ). La codificación HTML no debe hacerse como un paso de procesamiento de entrada o de creación de consulta de base de datos porque esos lugares no tienen nada que ver con HTML.

También debería, por supuesto, almacenar contraseñas usando un hash salado (idealmente uno fuerte como bcrypt) y no en el claro como lo indica la comparación Password=@Password .

    
respondido por el bobince 07.08.2013 - 01:05
fuente
2
  

Al acceder a un proveedor de contenido, use métodos de consulta parametrizados como query (), update () y delete () para evitar la posible inyección de SQL de fuentes no confiables. Tenga en cuenta que el uso de métodos parametrizados no es suficiente si el argumento de selección se construye concatenando los datos del usuario antes de enviarlos al método. ( Sugerencias de seguridad de Android )

Para evitar la inyección de SQL:

All queries should be parametrized.
All dynamic data should be explicitly bound to parametrized queries.
String concatenation should never be used to create dynamic SQL. 

mediante el uso de sentencias parametrizadas, la base de datos puede distinguir entre lo que se entiende por datos y lo que se entiende por comando, por lo que incluso si un atacante inserta una entrada maliciosa, esta entrada se tratará como información y no se interpretará como una comando.

    
respondido por el enigma 06.08.2013 - 13:57
fuente

Lea otras preguntas en las etiquetas