Obtención de una inyección SQL más allá de una expresión regular dada [duplicado]

1

Se me ha mostrado una expresión regular que, según la persona que la escribió, debería protegerse contra las inyecciones SQL en el servidor SQL Server 2008. Realmente no lo parece, pero me pregunto exactamente qué código puedo superar. para demostrar que no protege.

value = Regex.Replace(userInput, "[\n\r\t\']", " ");
sqlCmd = "Select names from mytable where mycolumn like '%" + value + %'";
SQLDataAdapter results = new SQLDataAdapter(sqlCmd, connString);

Ahora, me he dado cuenta de que si puedo obtener una sola cita pasada, puedo hacer algo como

a' union all select passwords as names from myusertable;--

El problema es que la expresión regular captura la comilla simple y no tengo ni idea de cómo escapar / codificar / ect. para que pase la expresión regular. He estado buscando algo, pero todo parece suponer que puede obtener una sola cita pasada. Obviamente, no puede ser tan sencillo detener todos los ataques de inyección de SQL, pero personalmente no sé qué poner para superarlo. ¿Alguna ayuda?

Editar:

Para ser un poco más específico, he oído que se pueden usar caracteres Unicode para pasar una sola cita más allá de un cheque en muchos idiomas, ya que el lenguaje de programación los trata como tales, pero cuando se ponen a la base de datos, sólo se tratan como una cita. Pero no he encontrado nada más que teoría sobre esto. Cuando trato de explicarlo, suena como "Bueno, la gente piensa que esto podría suceder, pero nunca se ha demostrado que sea realmente una vulnerabilidad" y eso no convence a la persona mayor que lo programó.

    
pregunta Lawtonfogle 23.08.2013 - 23:10
fuente

2 respuestas

3

Para expresiones regulares complejas, debe usar un regex debugger . Sin embargo, este regex es muerto simple. En resumen, debe encontrar una consulta que sea susceptible de inyección sin utilizar comillas simples. asumamos la siguiente consulta:

value = Regex.Replace(userInput, "[\n\r\t\']", " ");
sqlCmd = "Select names from mytable where mycolumn = '" + value1 + ' and yourcolumn= '"+value2+"';

ahora esto puede ser explotado usando el siguiente PoC:

let value1 = \
let value2 = union select password from myusertable-- 1

Esto producirá la siguiente consulta:

Select names from mytable where mycolumn = '\' and yourcolumn=' union select password from myusertable-- 1'

Un par de modificaciones, la mayoría de los administradores de conexión no permiten el apilamiento de consultas, por lo que ; es simplemente basura, el comentario -- es en realidad un comentario de tres caracteres que termina con un espacio para que -- 1 se asegure de que el comentario Respetado incluso si el espacio en blanco está truncado. Al reemplazar las comillas simples, este método de saneamiento es mejor que las barras de adición, ya que no es vulnerable a los ataques de múltiples bytes. Vea: addedlashes vs mysql_real_escape_string

    
respondido por el rook 24.08.2013 - 00:31
fuente
1

En algunos contextos, es posible que exista otra manipulación de cadenas o cosas con la codificación de entidad html o la codificación url que permitirá que la comilla simple aparezca más adelante.

Sin embargo, si lo último que hace es eliminar la comilla simple, se eliminará. Si elimina primero las comillas simples y luego realiza algún tipo de decodificación, existe la posibilidad de que se pueda realizar. También puede considerar la codificación de sus datos en la base de datos para que la coincidencia se realice en cadenas codificadas y no en el inglés simple.

En algunos casos, hay sistemas que hacen cosas extrañas con caracteres especiales o caracteres UTF no ASCII que pueden causar problemas con la inyección. Las técnicas en esta área a menudo se denominan contrabando de SQL y transformación homogénea.

Puede haber otros escenarios de casos de uso. Consulte esta pregunta relacionada en SO: Inyección SQL después de eliminar todo comillas simples y caracteres de guión .

Otras referencias:

respondido por el Eric G 24.08.2013 - 00:16
fuente

Lea otras preguntas en las etiquetas