PDA

Ver la versión completa : SQL injection con ACCESS



__BoKeN__
15-01-2004, 00:31
Hola a todos!!

He programado en ASP lo siguiente:

...
set con = server.createObject("ADODB.Connection")
con.open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" &
server.MapPath("bd.mdb")
set rs = server.CreateObject("ADODB.Recordset")
sql = "Select * From Usuarios Where (usuario = '" &
request.form("txtnombre") & "' AND " &_
"password = '" & request.form("txtpass") & "')"
rs.open sql,con,1,2
...

Esto evidentemente es vulnerable a una SQL injection porque no verifica las
' simples.

Es facil validarse aciendo un simple ' OR 'a'='a.
El problema viene cuando quiero mostrar algun valor de un campo, ya que si
intento multiplicar al campo usuario*5 me da un error de tipos no coinciden,
pero no me dice que 'pepe' no es un integer. Es decir que no puedo usar esto
para que me muestre el valor de los campos a partir de un error.

He visto que en SQLServer se crea una variable para luego hacer que esta
falle y que el error vuelque el contenido de la variable.

Pero en ACCESS no se pueden crear variables, para poder volcar todo ahi.

Tampoco se puede poner ;-- para que no interprete lo que añade despues, ya
que dice que despues de ; no debe haber nada.

¿Alguien me puede decir si en ACCESS hay algun caracter que lo tome como
comentario como el -- en SQLServer?

¿Alguien me puede decir como declarar una variable en ACCESS?

¿Como haria para que el contenido de la variable fuera una consulta?
Es decir se podria hacer algo asi:
¿Set @variable = (SELECT usuarios+'/'+password FROM usuarios)?

Otra cuestion seria si desde Access mediante uns SQL se puede crear una
consulta y exsportarla a un fichero de texto o incluso a otra .MDB. Ya que
la consulta CREATE DATABASE no la acepta el access, con lo cual no puedo
crear ningun fichero.

¿Se pueden crear ficheros desde una consulta SLQ con Access?

EN GENERAL sabeis donde puedo documentarme a cerca de como atacar una base
de datos en ACCESS.

Muchas gracias a todos por adelantado.

Y un saludo.

UniRing
20-01-2004, 16:07
A ver, sobre lo de la variable nunca me lo he planteado, siempre he usado MySQL con PHP que para mi gusto va mejor (ACCESS es demasiado lento cuando le pones un milion de registros...)

Pero respecto a lo de sacar un fichero puedes usar SELECT * INTO OUTFILE 'file.txt'

No se si te servira para ACCESS, espero que si xD

eXcalibur
21-01-2004, 08:35
¿y si no le permites meter comillas simples?

unholy
21-01-2004, 09:25
Esa solucion no es fiable, lo unico que haces es retrasar cinco minutos el que te entren.. no es una forma fiable de evitar que te hagan SQLInjection

eXcalibur
21-01-2004, 11:30
Yo no lo creo. Si no les permites meter comillas o simbolos como el '=', creo que es suficiente

unholy
21-01-2004, 11:37
No estoy de acuerdo eXcalibur, es posible que le limites la entrada de comillas desde javascript o desde ASP, pero quien te dice a ti que el tio no se va a poder saltar las protecciones establecidas por ti y enviar las comillas en un formato distinto al que tu esperas, o de otra forma distinta, es decir, si las esperas llegadas desde un formulario, te las pasa por cabecera, por poner un ejemplo muy sencillo.....


La solucion buena no es el eliminar las comillas mediante un replace, esa es , con todos mis respetos una solucion que no da garantias......, se sigue pudiendo entrar , te lo digo por experiencia, mas de un sitio y ma de dos han optado por la solucion que tu has comentado, y siguen cayendo...

eXcalibur
21-01-2004, 14:43
Yo digo que te monto una página en ASP que no permite comillas, las envies desde donde las envies. El filtro se realizaría internamente, con vbscript por ejemplo, utilizando el "instr". Otra cosa es que quien lo montase lo hiciera mal, y por eso te puedas saltar la seguridad.

unholy
21-01-2004, 15:44
Pero esas formas no son del todo fiables , en serio, la mejor forma de evitar esto es parametrizando la conexion con la base de datos.

De la forma que tu coments, tarde o temprano se te escapa algo......., o eso o controlas todas las comillas, secuencias de escape, formatos de las instrucciones que te pasen, tipo de los parametros.......

Me parece demasidas cosas a tener en cuenta.....

eXcalibur
21-01-2004, 16:13
Plateatelo al revés, y verás que no son tantos. Es decir, solo permites valores alfanumericos (letras y numeros). El resto, no lo aceptas.
Sabiendo entre que keycodes están estos valores ya está ;)

unholy
21-01-2004, 16:53
COn que sean dos me valen, has de controlar esto en todas las partes del sistema que conecten con la base de datos, y hay mil formas de romper la sentencia.

Ademas, yo soy de la opinion de que las cosas de datos en la capa de datos, quye para eso esta, y si puedes parametrizar la abse de datos, ganaras en seguridad y flexibilidad del sistema, y perderas en tener un sistema mediocre que pouede ser reventado en cualquier momento....


Ya han habido varios administradores de sistemas que se creeen que por quitar las comillas ya estan seguros..

Creeme , la unica ley infalible que hay es la de Murphy, en alghun sitio te dejaras una query sin comprpobar, o bien no comprobaras las querys tanto como crees y te dejaras una posible entrada.


De la forma que yo te comento, simplemente, te evitas tener que pensar en estas cosas y puedes dedicarte a generar un entorno robusto, seguro y fiable.

eXcalibur
21-01-2004, 17:02
Pues sí.
Venga, cierro el tema por mi parte. Un saludo

unholy
21-01-2004, 17:05
ok, yo tambien cierro eXcalibur, un saludo, no te lo tomes a mal, me gustan la conversaciones deportivas, siempre y cuando la otra persona implicada en el debate sepa de que habla, como es tu caso..-

Un saludo tio

__BoKeN__
22-01-2004, 00:41
Me ha gustado bastante la conversacion pero me hubiera gustado mas que os hubierais centrado en mi pregunta. Aunque repito que ha sido interesante.

Respecto a lo que dices, UniRing, no consigo utilizar SELECT * INTO OUTFILE, porque segun he estado leyendo, no sirve para MS Access.

Debido a que Access solo tiene unos cuantos comandos de SQL es muy complicado volcar el contenido de una tabla de validacion Usuarios, mediante SQL injection.

Al final y despues de mucho probar va a resultar que ACCESS ES SEGURO!! Ya que no tiene comandos para exportar tablas, ejecutar comandos, etc...

Sin embargo dudo mucho que esto sea asi, debe haber alguna manera de poder vulnerar una base de datos en Access.

Espero vuestras contestaciones.

Un saludo.

unholy
22-01-2004, 09:29
En el momento en el que pueda hacer SQL Injection, la base de datos es vulnerable... ten en cuenta que no necesitas volcar el contenido de la tabla en ningun sitio, con una sentencia UNION encadenada a la tuya puedes ver el contenido de las tablas que desees...


Si que es verdad que tiene una cosa buena Access, y es que el usuario que conecta por defecto a la base de datos no tiene permiso de lectura sobre las tablas de sistema.... una cosa que si se tiene en SQL....

__BoKeN__
22-01-2004, 10:43
Pero de que me sirve que el Server ejecute SELECT * FROM Usuarios si el .ASP solo verifica que ha devuelto un registro para dar paso. Es decir que no tiene ningun codigo programado para que muestre el contenido.

No es como una pagina que hace busquedas y puedas por SQLInjection mostrar tablas del sistema, usuarios, etc... En una autenticacion solo puedes sacar informacion de campos mediante errores. Pero con Access debido a su funcionalidad es complicado.

¿Por cierto a que tablas del sistema te refieres? msysqueries,etc.. ¿Cuales existen mas?

Segun estoy viendo, para una autenticacion, el ACCESS es el unico que soporta una SQLInjection sin problemas de seguridad.

Un saludo.

unholy
22-01-2004, 11:40
Pero bueno, lo que nos interesa es un usuario para poder acceder al sistema, eso es lo unico que necesitamos para tener el acceso garantizado al sistema......

En cualquier caso, tenemos que tener en cuenta que en una autenticacion no solo podemos sacar informacion mediante errores, sino simplemente podemos colarnos sin necesitar saber ningun datos de la tabla en cuestion, y en access es exactamente igual a como lo hariamos en el resto de SGBD que soporten SQLInjection.....


En cuanto a las tablas de sistema, hay varias que son utiles , como msysqueries, msysobjects, msysusers(creo que es asi)...... que nos dan informacion acerca de las tablas del sistema, columnas, usuarios...... es decir, lo que queramos....

Y como te digo, si una autenticacion esta mal implementada, todos los sistemas soportan una SQLInjection sin problemas de seguridad, puedes hacer lo que quieras....

UniRing
22-01-2004, 20:34
Un apunte sobre la frase "ACCESS ES SEGURO!". Seguro quizas (ya te digo yo que no xD) pero esa seguridad viene de su falta de funcionalidad, con lo que para mi gusto es el camino facil del programador. Para que te vas a complicar para dar un servicio seguro, simplemente no lo des. Es como tener un servidor sin ningun servicio.

Ya se que eso no tiene nada que ver pero bueno, es un apunte.

Respecto al tema, queria decir que yo para evitar el SQL injection en PHP con MySQL monte una funcion la cual llamo siempre cuando paso variables a una sentencia SQL. Esta funcion 'parsea' el string y elimina todo caracter no alfanumerico. Despues de probarle muchos tipos de sql injection llegue a la conclusion de que es un metodo viable ya que le entres lo que le entres lo elimina y con letras y numeros es imposible 'escribir' una comilla, aparte de eso la sentencia UNION esta desactivada en los nuevos MySQL por defecto (y sino lo desactivas a mano) ya que hay metodos mas seguros de hacer un UNION no es necesario tenerlo activado.

Bueno, decir que al respecto de la disputa unholy VS eXcalibur yo estoy un poco mas a favor de eXcalibur, no del todo, dado que como dice unholy es un metodo un poco rudimentario y te puedes despistar, pero si la eliminacion de caracteres esta bien echa y siempre que uses una sentencia SQL no te olvidas de verificar los datos que le entras, para mi gusto, es un sistema valido.

Estariamos horas discutiendo cual es la mejor manera de programar una cosa, pero la cuestion es que si las dos versiones funcionan, pues la resta va a gusto del programador xD.

Y como dice un buen libro, "ningun sistema es seguro, solo podemos hablar de fiabilidad."

Bueno, ya esta, tenia que decir la mia xD No os canseis.

__BoKeN__
23-01-2004, 00:52
Bueno yo sinceramente queria poner al Access encima de la camilla y destriparlo para ver sus "posibilidades" y por eso pedia ayuda de alguien que hubiera encontrado maneras de vulnerar Servidores por utilizar bases de datos en Access.

Veo que las posibilidades son limitadas y que lo unico que ponemos en juego es el modificar o borrar valores de las tablas, pero a CIEGAS. Es decir no podemos ni revelar contraseñas ni verificar que los nuevos valores se han introducido correctamente.

En cuanto al sistema del propio servidor, tambien veo que es casi imposible manipularlo.

¿Alguien ha tenido otras experiencias al respecto con Access?

Un saludo a todos.

unholy
23-01-2004, 10:20
Buenas de nuevo, creo que no has entendido del todo bien una cosa....

No es que puedas borrar los datos a ciegas, puedes alterarlos, borrarlos, insertarlos... es decir, hacer lo que quieras, pero no a ciegas......

Cuando hemos dicho que lo haces a ciegas, significa que por ejemplo en un login, no ves los datos devueltos en caso de hacer SQLInjection, pero sin embargo tienes acceso al sistema. Una vez dentro , seguramente que podras usar esta tecnica en otro lugar , romper una sql e ir haciendo la Injection viendo los datos devueltos en todo momento....


Las posibilidades de acceso son muchisimas, de echo Access es uno de los sistemas menos seguros que hay...., lo unico es que por defecto no puedes ver las tablas de sistema, pero si rompes la sql el mensaje de error correspondiente te da el nombre de la tabla que estas atacando si sabes ahcerlo.....

__BoKeN__
23-01-2004, 10:58
Por supuesto, claro que consigues conocer nombre de tablas, campos, tipos de datos de las tablas, numero de campos de tablas,...

Pero hay dos cosas que no consigo obtener:
- El contenido de un campo(no el que yo pueda modificarlo sino, saber que tiene en un principio, por ejemplo para saber los usuarios y sus contraseñas). Aunque como tu dices, primero te autentificas y despues dentro con paginas de busqueda y tal podemos volcar valores. Pero....

- Si usan distintos ficheros .MDB, como hago una consulta de un fichero que no se como se llama. ¿Se puede obtener el nombre del fichero de base de datos? ( En este caso el fichero.MDB que contenga los usuarios )

Un saludo.

unholy
23-01-2004, 11:02
Ten en cuenta que si usan varios ficheros MDB, en Access si no me equivoco no puedes usar bases de datos distribuidas como en SQl, por lo que tendras que buscar otro lugar en la pagina en el cual se realize la conexion con otro de los ficheros MDB (bases de datos)....

REspecto a lo del contenido de un campo, no se porque te extraña , ten en cuenta que esta forma de acturar para conseguir datos no es propia de access, sino que es propia de SQLInjection en si, es decir, porque ataques a un sistema que este gestionado por SQL no vas a hacerlo distinto, la base de esta forma de ataque es siempre la misma, cambian las tablas a las que atacar, nada mas.....

__BoKeN__
23-01-2004, 12:26
Para seguir tu orden.

Se puede meter dentro de una consulta
UNION SELECT * FROM[c:\base_datos.mdb].usuarios;
Por eso me interesa saber si se puede obtener el nombre de la base de datos. Porque teniendolo se podria ir a la tipica seccion de busqueda de comentarios (tambien vulnerable) e introducir la cadena anterior.

En cuanto a lo otro decir que en SQLServer o MySQL puedes crear una variable con SET @variable o recursos parecidos para almacenar todos los valores ahi y despues por otro metodos de error hacer que vuelque el contenido de la variable como explicaba en mi primer Post. Pero eso en Access no se puede hacer, por eso digo que teniendo en cuenta la limitada funcionalidad de Access(me refiero a que no tiene esas posibilidades) no se puede obtener los valores de los campos.

Un saludo.

unholy
23-01-2004, 13:47
Ya si entiendo a lo que te referias,por supuesto que la funcionalidad del Access es limitada, pero da igual no poder declarar variables emdiante sl injection..... te vas a una pagina que liste un recordset con mas de un valor, haces la inyeccion alli, y listo, tienes todos los campos que quieras listados en pantalla sin tener que recurrir al SET

__BoKeN__
23-01-2004, 21:22
Eso lo he entendido y lo he escrito en mi anterior post. Pero si la tabla esta en otra base de datos. No puedo acceder a ella porque no conozco su nombre.

En la pantalla de validacion me da = saber su nombre, porque la conexion ya dice cual es, pero si me voy a otra (como busqueda) necesito saber el nombre del fichero. ¿Sabrias como obtenerlo?

Un saludo

unholy
23-01-2004, 21:39
Has de diferenciar, si lo que quieres es acceder a los datos de la base de datos, te valdra solamente con SQlInjection, pero si lo que quieres es e fichero en si, deberas de lograr tener acceso fisico al servidor que la aloja...

__BoKeN__
24-01-2004, 19:38
No, solo quiero conocer el nombre del fichero, para poder hacer referencia a el desde otra pagina de consulta de comentarios por ejemplo. No quiero copiarme el fichero ni nada de eso. Solo poder ejecutarle consultas desde la otra pagina conociendo su nombre.

unholy
25-01-2004, 00:28
A traves de sql injection no vas a poder saber el nombre del fichero de base de datos. Para conseguirlo tendrias qeu acceder al acadena de conexion de la aplicacion con la base de datos, que se encontrara almacenda en las fuentes de datos ODBC (DSN), o bien teniendo acceso fisico al disco en el cual se encuentra alojada la aplicacion.