[PHP/CURL] Inloggen met CURL op beveiligde website

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • andydewit
  • Registratie: December 2013
  • Laatst online: 05-11-2024
Ik probeer door middel van CURL in te loggen op een bepaalde website (gebouwd op Django). Deze is echter beveiligd met een CSRF token.
Die heb ik in de cookies kunnen achterhalen, daar ligt dus niet de fout. Toch blijft de server een HTTP 403 code geven als ik een request stuur naar de server om in te loggen.

Onderstaande code gebruik ik:
PHP:
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
<?php
error_reporting(E_ALL);

function get_data($url, $post=''){
    $ch = curl_init($url);
    if(!empty($post)){
        curl_setopt($ch,CURLOPT_POST,true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
        
        $headers = array();     
        $headers[] = 'Host: gsraegir.nl';
        $headers[] = 'Connection: keep-alive';
        $headers[] = 'Content-Length: 120';
        $headers[] = 'Origin: http://gsraegir.nl';
        $headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36';
        $headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8';
        $headers[] = 'Accept: */*';
        $headers[] = 'X-Requested-With: XMLHttpRequest';
        $headers[] = 'X-CSRFToken: VENFR1tv32Ab9PKZEMC5bjMG2OP68lXk';
        $headers[] = 'Referer: http://gsraegir.nl/nl/';
        $headers[] = 'Accept-Encoding: gzip, deflate';
        $headers[] = 'Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4';
        $headers[] = 'Cookie: django_language=nl; sessionid=8s8ajcps6dzo57ngmchw7gnj4225n2p2; csrftoken=VENFR1tv32Ab9PKZEMC5bjMG2OP68lXk';
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    curl_setopt($ch,CURLOPT_COOKIEJAR,realpath('.').'/cookies.txt');
    curl_setopt($ch,CURLOPT_COOKIEFILE,realpath('.').'/cookies.txt');
    curl_setopt($ch,CURLOPT_URL,$url);
    //curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36');
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
    $result = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo $url.':'.$httpcode.'<br />';
    
    return $result;
}

$url = 'http://gsraegir.nl/nl/';

get_data($url);

$post = 'csrfmiddlewaretoken=VENFR1tv32Ab9PKZEMC5bjMG2OP68lXk&id_username=andydewit&id_password=mypassword&this_is_the_login_form=1&next=';
$url = 'http://gsraegir.nl/login/';

echo get_data($url, $post);


get_data('http://gsraegir.nl/nl/');

?>


Zie ik misschien iets over het hoofd? Ik hoop dat een van jullie mij hierbij kan helpen.


Groet,
Andy

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Er is niet "een" CRSF-token, je moet het token en de cookies vóór iedere login-request opvragen en in het volgende request meesturen.

Dus:

1. Vraag de loginpagina op. Bewaar de cookies en lees de benodigde data uit de HTML.
2. POST naar de volgende loginpagina met de waarden die je bij de vorige stap hebt opgevraagd.

[ Voor 49% gewijzigd door CodeCaster op 12-10-2015 12:47 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Die token veranderd telkens.

Je moet dus eerst het loging-form ophalen, daar de token van pakken en dan inloggen.

Acties:
  • 0 Henk 'm!

  • mbarie
  • Registratie: Mei 2011
  • Laatst online: 04-08-2021
CodeCaster schreef op maandag 12 oktober 2015 @ 12:42:
Er is niet "een" CRSF-token, moet het token vóór iedere request opvragen en in het volgende request meesturen.
Idem voor de sessie-variabele. Anders kunnen ze aan de andere kant de token waarschijnlijk niet matchen.

Storyteller @ soundcloud


Acties:
  • 0 Henk 'm!

  • andydewit
  • Registratie: December 2013
  • Laatst online: 05-11-2024
De bovenstaande CSRF token is uit het login formulier, welke overeen komt met die in de cookie. Deze token is niet bij elke visit anders, maar verandert pas na een aantal keer. Als ik de token fout invoer, krijg ik als response op http://gsraegir.nl/login/ dat de CSRF token niet matcht. Bovenstaande token is correct en geeft geen response in tekst, behalve dat er een 403 in de headers wordt teruggestuurd.

In de versie die uiteindelijk wordt gebruikt zal telkens de token (en de sessie variabele) worden uitgelezen, maar tijdens het testen doe ik het even zo.

De login op de originele website vind plaats door middel van een AJAX POST request.

[ Voor 10% gewijzigd door andydewit op 12-10-2015 13:02 ]


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 10-10 08:02
ja maar de session id van je CURL request kan toch nooit matchen met die van je browser? Tenzij ze sessies enkel op IP vast leggen en niet op andere eigenschappen van de browser/client.

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • andydewit
  • Registratie: December 2013
  • Laatst online: 05-11-2024
kwaakvaak_v2 schreef op maandag 12 oktober 2015 @ 13:17:
ja maar de session id van je CURL request kan toch nooit matchen met die van je browser? Tenzij ze sessies enkel op IP vast leggen en niet op andere eigenschappen van de browser/client.
De session id in de CURL request die ik meegeef is niet van mijn browser, maar van CURL. Deze stond in de cookies.txt die is gemaakt door CURL.

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Die cookie info hoef je helemaal niet in de headers te stoppen, dat doet curl wel voor je.

Verder is het wat lastig te helpen als je echte code blijkbaar iets anders doet dan wat je hier hebt gepost....

Acties:
  • 0 Henk 'm!

  • andydewit
  • Registratie: December 2013
  • Laatst online: 05-11-2024
Ik heb het opgelost! Bleek dat ik een typfout had gemaakt in de POST waardes (id_password & id_username i.p.v. password & username).

Voor de geïnteresseerden hieronder de werkende code. De CSRF token wordt nu ook automatisch uit de cookies.txt gehaald.

PHP:
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
<?php
// Function to start cURL session
function get_data($url, $post=''){
    $ch = curl_init($url);
    
    // If post fields are given
    if(!empty($post)) {
        curl_setopt($ch,CURLOPT_POST,true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
        
        $headers = array();     
        $headers[] = 'Host: gsraegir.nl';
        $headers[] = 'Connection: keep-alive';
        $headers[] = 'Content-Length: 120';
        $headers[] = 'Origin: http://gsraegir.nl';
        $headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8';
        $headers[] = 'Accept: */*';
        $headers[] = 'X-Requested-With: XMLHttpRequest';
        $headers[] = 'Referer: http://gsraegir.nl/nl/';
        $headers[] = 'Accept-Encoding: gzip, deflate';
        $headers[] = 'Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4';
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    
    curl_setopt($ch,CURLOPT_COOKIEJAR,realpath('.').'/cookies.txt');
    curl_setopt($ch,CURLOPT_COOKIEFILE,realpath('.').'/cookies.txt');
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36');
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
    return curl_exec($ch);
}

// Retrieve cookies from website
$url = 'http://gsraegir.nl/nl/';
get_data($url);

// Retrieve CSRF token from cookies file
$csrfmiddlewaretoken = explode('csrftoken',file_get_contents(realpath('.').'/cookies.txt'));
$csrfmiddlewaretoken = trim($csrfmiddlewaretoken[1]);
$csrfmiddlewaretoken = explode(PHP_EOL,$csrfmiddlewaretoken);
$csrfmiddlewaretoken = trim($csrfmiddlewaretoken[0]);

// Set login credentials and login page
$post = 'csrfmiddlewaretoken='.$csrfmiddlewaretoken.'&username=andydewit&password=mypassword&this_is_the_login_form=1&next=';
$url = 'http://gsraegir.nl/login/';

// Log in on website
get_data($url, $post);

// Retrieve BEER page
$beerPage = get_data('http://gsraegir.nl/nl/leden/mijn-aegir/beer/');
?>
Pagina: 1