¿Reemplazar todos los apóstrofes con dos apóstrofes es suficiente para evitar la inyección de SQL en MSSQL?

3

Estoy trabajando en un sitio web que no usa parámetros en consultas SQL. Todas las consultas son ad hoc y la forma en que están haciendo la validación de entrada me parece buena, no puedo dividirla para hacer Inyección SQL.

Están validando la entrada numérica y si es una cadena están haciendo esto (por ejemplo):

sanitizedInput = "'" & Replace(input, "'", "''") & "'"

En otros SGBD es fácil de romper, pero en MSSQL no encuentro la manera de hacerlo. ¿Cómo puedo romper esto? Solo quiero mostrarles que esto no es suficiente.

    
pregunta Bruno Costa 28.09.2011 - 12:20
fuente

4 respuestas

5

No. Esto ciertamente no manejará la concatenación de cadenas que no esté delimitada por comillas. p.ej. un campo numérico.

Considera

sql= "select username from users where id=" + id

si id se proporciona como 1 or 1=1 , entonces se pueden devolver todas las filas de la base de datos. Obviamente, este ejemplo podría extenderse a union select ataques o incluso a consultas anidadas completas.

Simplemente use parámetros enlazados y evite todo el problema de SQLi.

    
respondido por el Cheekysoft 28.09.2011 - 15:02
fuente
4
  

No puedo romperlo

Solo porque usted no puede romperlo, no garantiza que nadie más pueda romperlo. He visto ataques de inyección SQL informados en el diario SANS que ni siquiera puedo empezar a entender (sobre todo porque no tengo tiempo para averiguar qué están haciendo).

enlace
enlace
enlace

    
respondido por el Tangurena 29.09.2011 - 02:07
fuente
4

Si desea una seguridad garantizada contra los ataques de inyección, use los parámetros enlazados.

En la práctica, su método puede ser realmente seguro para un RDBMS en particular, pero no tiene ninguna garantía de esto; todo lo que puede hacer es verificar los tipos de ataques de inyección de código en los que se puede comparar (mientras que los parámetros están relacionados) simplemente no permitir que se inyecte el código).

¿Está seguro de que MSSQL no asigna ningún carácter de conjuntos de caracteres alternativos (por ejemplo, unicode) a una comilla simple (o un carácter de escape como \), que haría posible un ataque de inyección contra su defensa? ¿Está seguro de que el procesamiento posterior de su entrada desinfectada no rompe inadvertidamente (o intencionalmente por un administrador malicioso) su procedimiento de saneamiento? ¿Está seguro de que una actualización de MSSQL no incluirá más tarde un nuevo soporte de idioma / conjunto de caracteres que le permita a alguien realizar este ataque de estilo Unicode para inyectar secretamente un carácter de cita o escape? ¿Está seguro de que su aplicación nunca se moverá a otro RDBMS que sea vulnerable a este tipo de ataques (por ejemplo, dentro de unos años, si MSSQL está abandonado o es claramente inferior a otro producto)?

    
respondido por el dr jimbob 28.09.2011 - 21:27
fuente
-1

No.

Si debe interpolar, siempre debe usar el código del formulario:

sql = "select * from table where param = " + quote_sql_value(value)

Donde quote_sql_value reemplaza a ' con '' y rodea el resultado con ' a cada lado.

Tenga en cuenta que MySQL y otras bases de datos tienen secuencias de escape que pueden ser difíciles de detectar y codificar correctamente. Por lo que puedo decir, parece que MSSQL no lo tiene, por lo que la codificación de un valor debería ser bastante simple. Sin embargo, debes investigar más sobre la codificación MSSQL; No confíes en mi palabra.

    
respondido por el yfeldblum 28.09.2011 - 23:06
fuente

Lea otras preguntas en las etiquetas