IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Problème authentification login:pwd avec requête HTTP POST


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Problème authentification login:pwd avec requête HTTP POST
    Bonjour,

    J'essaye de m'authentifier via une requête POST sur une page login:pwd mais j'obtiens en retour le message : CSRF token is incorrect

    Pour ce faire j'avais tout d'abord vérifier ce qui était envoyer vers le serveur en mettant un proxy en local:
    POST /DVWA/login.php HTTP/1.1
    Host: 192.168.1.1
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Referer: http://192.168.1.1/DVWA/login.php
    Cookie: security=impossible; PHPSESSID=ts5ukkrqubipdpl78ikh0udgc2
    Connection: close
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 88
    username=admin&password=password&Login=Login&user_token=4b15ab58a05f70ec713bca21d807f0a6


    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
     
    mport requests
     
    URL='http://192.168.1.1/DVWA/login.php'
     
    session = requests.Session()
    session.get(URL)
     
    #cookie recovering
    cookies = session.cookies.get_dict()
     
    user_token = requests.get(URL).text
     
    print user_token
     
    #we look for the the position of the work 'token' in the string
    start_index = user_token.find('token')
    #I add +14 to parse at the beginning of the token value
    start_index=start_index+14
    #each character of the string is lined feeded
    #I use the line feed as separator to reaasemble the string
    #I use +32 because the token is 32 character long
    anti_csrf = user_token[start_index:start_index+32].split('\n')[0]
    #I encapsulate my value in quotes
    anti_csrf="'"+anti_csrf+"'"
    print "\nANTI-CSRF token recovered:"
    print anti_csrf
     
    #data to send via POST METHOD
    data = {'username':'admin','password':'password','user_token':anti_csrf,'Login':'Login'}
     
    #authenticate on the website
    auth = requests.post(URL, cookies=cookies, data=data)
    print auth.text
    Je comprend pas pq j'obtiens cette erreur alors que le token que je récupère est identique à celui envoyé par le serveur ?
    Peut-être je l'envois mal ?

    Cdlt

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Pourquoi "start_index=start_index+14" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> s = "username=admin&password=password&Login=Login&user_token=4b15ab58a05f70ec713bca21d807f0a6"
    >>> st = s.find('token')
    >>> s[st+14:]
    'a05f70ec713bca21d807f0a6'
    >>> s[st+6:]
    '4b15ab58a05f70ec713bca21d807f0a6'

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Pourquoi "start_index=start_index+14" ?
    Le PO doit récupérer cette info dans le HTML i.e. dans une balise qui pourrait s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type='hidden' name='user_token' value='....' />
    DVWA étant pour "Damn Vulnerable Web Application", le PO fait des exos de cracking de site Web.
    imho, il devrait commencer par apprendre à programmer...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par wiztricks Voir le message

    DVWA étant pour "Damn Vulnerable Web Application", le PO fait des exos de cracking de site Web.
    imho, il devrait commencer par apprendre à programmer...

    - W
    Ha oui, je comprend mieux là.

    Ben, le module HTMLParser est là pour ça, très simple à utiliser en plus.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Ha oui, je comprend mieux là.

    Ben, le module HTMLParser est là pour ça, très simple à utiliser en plus.
    Certes mais le bug est ailleurs... (et comme l'intérêt de ces exercices est de jouer avec les différents outils à sa disposition pour le trouver)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai
    Femme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    cracking web *Hacking web

    Concernant la récupération de l'anti-csrf token. Voici comment il apparaît dans le code source:
    <input type='hidden' name='user_token' value='8c4d56f9c562c6f9432f4adb65896650' />
    Du coup je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    start_index = user_token.find('token')
    start_index=start_index+14
    anti_csrf = user_token[start_index:start_index+32].split('\n')[0]
    anti_csrf="'"+anti_csrf+"'"
    print "\nANTI-CSRF token recovered:"
    print anti_csrf
    Ainsi je récupère exactement son contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    # python bruteforce.py 
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml">
     
    	<head>
     
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     
    		<title>Login :: Damn Vulnerable Web Application (DVWA) v1.9</title>
     
    		<link rel="stylesheet" type="text/css" href="dvwa/css/login.css" />
     
    	</head>
     
    	<body>
     
    	<div id="wrapper">
     
    	<div id="header">
     
    	<br />
     
    	<p><img src="dvwa/images/login_logo.png" /></p>
     
    	<br />
     
    	</div> <!--<div id="header">-->
     
    	<div id="content">
     
    	<form action="login.php" method="post">
     
    	<fieldset>
     
    			<label for="user">Username</label> <input type="text" class="loginInput" size="20" name="username"><br />
     
     
    			<label for="pass">Password</label> <input type="password" class="loginInput" AUTOCOMPLETE="off" size="20" name="password"><br />
     
    			<br />
     
    			<p class="submit"><input type="submit" value="Login" name="Login"></p>
     
    	</fieldset>
     
    	<input type='hidden' name='user_token' value='8c4d56f9c562c6f9432f4adb65896650' />
     
    	</form>
     
    	<br />
     
     
     
    	<br />
    	<br />
    	<br />
    	<br />
    	<br />
    	<br />
    	<br />
    	<br />
     
    	<!-- <img src="dvwa/images/RandomStorm.png" /> -->
    	</div > <!--<div id="content">-->
     
    	<div id="footer">
     
    	<p><a href="http://hiderefer.com/?http://www.dvwa.co.uk/" target="_blank">Damn Vulnerable Web Application (DVWA)</a> is a RandomStorm OpenSource project.</p>
     
    	</div> <!--<div id="footer"> -->
     
    	</div> <!--<div id="wrapper"> -->
     
    	</body>
     
    </html>
     
    ANTI-CSRF token recovered:
    '8c4d56f9c562c6f9432f4adb65896650'
    J'ai déjà réussi cete épreuve avec qqs ligne de commandes bash mais je voulais relevé le défi de la faire avec un script python
    Du coup vous pas pourquoi mon jeton n'est pas accepté ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par raydonovan Voir le message
    J'ai déjà réussi cette épreuve avec qqs ligne de commandes bash mais je voulais relevé le défi de la faire avec un script python
    Du coup vous pas pourquoi mon jeton n'est pas accepté ?
    Bash ou Python ne servent qu'à construire le message HTTP qui sera expédié via une requête POST.
    Ce message HTTP n'est qu'une suite de chaînes de caractères (comme celle que vous avez posté dans le premier message) qui se divise en commande, en-tête et corps du message.

    C'est sur qu'en écrivant "auth = requests.post(URL, cookies=cookies, data=data)", le module requests va fabriquer et expédier un message... et si çà ne fonctionne pas, c'est que vous avez oublié une en-tête ou mal renseigné certaines valeurs (ou que le module a appliqué un "par défaut" qu'il faut changer). Mais on ne peut pas regarder le contenu des messages à votre place, çà c'est à vous de le faire (et apprendre à utiliser les outils qui vont bien pour çà).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre à l'essai
    Femme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Bon c'est le code qui est bon mais pas le contenu de requête envoyée
    Je vais creuser

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #we look for the the position of the work 'token' in the string
    start_index = user_token.find('token')
    #I add +14 to parse at the beginning of the token value
    start_index=start_index+14
    #each character of the string is lined feeded
    #I use the line feed as separator to reaasemble the string
    #I use +32 because the token is 32 character long
    anti_csrf = user_token[start_index:start_index+32].split('\n')[0]
    #I encapsulate my value in quotes
    anti_csrf="'"+anti_csrf+"'"
    print "\nANTI-CSRF token recovered:"
    print anti_csrf
    Pour:
    <input type='hidden' name='user_token' value='8c4d56f9c562c6f9432f4adb65896650' />

    Pourrait probablement être remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    user_token.split("""'user_token' value='""")[1].split("""' />""")[0]
    Comme ça, si len(du token) change t'es sauvé

    Cdt.

Discussions similaires

  1. [Batch] Problème avec requête HTTP
    Par Cyanatide dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 11/09/2012, 13h34
  2. Authentification (login/pwd) avec Axis
    Par progamer54 dans le forum Services Web
    Réponses: 1
    Dernier message: 28/10/2009, 14h19
  3. Transmission des objets avec une requête HTTP POST
    Par handsome01 dans le forum Langage
    Réponses: 4
    Dernier message: 31/03/2009, 16h07
  4. Requête HTTP - POST avec socket
    Par kalylive dans le forum Réseau
    Réponses: 3
    Dernier message: 28/04/2008, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo