Estoy probando la resistencia contra ataques de inyección en una base de datos de SQL Server.
Todos los nombres de tablas en la base de datos son minúsculas y la intercalación distingue entre mayúsculas y minúsculas, Latin1_General_CS_AS .
La cadena que puedo enviar se fuerza a mayúsculas y puede tener un máximo de 26 caracteres de longitud. Por lo tanto, no puedo enviar una TABLA DE GOTAS porque el nombre de la tabla estaría en mayúsculas y, por lo tanto, la declaración fallará debido a la intercalación.
Entonces, ¿cuál es el daño máximo que podría hacer en 26 caracteres?
EDITAR
Sé todo sobre consultas parametrizadas, etc., imaginemos que la persona que desarrolló el front-end que construye la consulta para enviar no utilizó parámetros en este caso.
Tampoco estoy tratando de hacer nada nefasto, este es un sistema construido por alguien más en la misma organización.
fuente
Respuestas:
Fácil:
O, supongo que en este caso sería
Elija su selección de variaciones sobre esto.
Con toda probabilidad, puede probar esto ahora en su sistema actual, pero cualquier cantidad de pequeños cambios en la base de datos a lo largo del tiempo podría invalidar su prueba. La cadena de caracteres podría cambiar, alguien podría crear un procedimiento almacenado en minúsculas que tenga potencial destructivo, cualquier cosa. Nunca se puede decir con un 100% de confianza que no hay un ataque destructivo de 26 personajes que alguien pueda construir.
Le sugiero que encuentre una manera de hacer que el desarrollador siga las mejores prácticas de seguridad estándar de la industria básica , aunque solo sea por su propio bien, ya que supongo que es al menos parcialmente responsable en caso de que se produzcan violaciones de seguridad.
Editar:
Y por malicia / diversión, puede intentar habilitar cada indicador de rastreo. Esto sería interesante de observar. Se siente como una publicación de blog que Brent Ozar haría ...
fuente
SET LOCK_TIMEOUT 0;
,SET LANGUAGE Malaysian;
,SET ANSI_NULLS OFF:
...SET
(sólo afecta a la configuración de sesión, cómo se cambian los ajustes satabase y servidorALTER DATABASE ...;
?)DROP DATABASE ..;
Sería infligir más daño, entonces, si tenía éxito;)El
SHUTDOWN
comando oKILL
Comando (elija un número aleatorio de más de 50) toman significativamente menos de 26 caracteres, aunque es de esperar que la cuenta que ejecuta las consultas de la aplicación no tenga permisos suficientes para ejecutarlos.fuente
Puede crear una tabla que luego llene hasta el final del tiempo o se agote el espacio en disco, lo que ocurra primero.
fuente
while 1=1 insert t values('')
es 30 ...create table x(i int)
=>while 1=1 insert t select 0
es 27x:insert t select 0 GOTO x
embargo, @WernerCD tiene exactamente 26 años.Dependiendo de su definición de daño, podría ejecutar esto: WAITFOR DELAY '23: 59 'Para ser verdaderamente malvado, podría usar una herramienta de prueba de carga para ejecutar eso desde 32,768 clientes.
fuente
Variación basada en la respuesta de @ MikaelEriksson y la respuesta de @ MartinSmith a mi comentario inicial:
Inicialmente intenté hacer una declaración WHILE, pero lo mejor que pude hacer fue 27 caracteres:
Pero Martin señaló GOTO:
GOTO ... la raíz de todo mal y creador de una declaración de inserción de bucle infinito en 26 caracteres.
Dicho esto ... podría ser ventajoso quedarse con CHAR (99) en lugar de int ya que eso usaría más espacio. Otras opciones usan nombres más largos y romperían el límite de 26 caracteres ... o usarían menos espacio de almacenamiento por fila.
Código de prueba completo:
fuente
set @S = 'x:insert t;select 0;GOTO x';
para compatibilidad futura de su ataque de inyección;);
s ... la segunda está bien - reemplaza un espacio y es funcional si no es necesario. El primero interrumpe la consulta: separa la instrucción INSERT de la instrucción SELECT.Dependiendo de cuán dañino considere que es un apagado. :-)
Esto requiere que xp_cmdshell esté habilitado en el servidor, algo que no es el caso para las últimas versiones de SQL Server. También requiere que la cuenta de servicio tenga el derecho de cierre correcto, que puede o no tener.
Habilitar xp_cmdshell probablemente va más allá de tu límite de 26 caracteres. ¿Permitirías múltiples inyecciones?
fuente