Avatar billede SimonBStoevring Nybegynder
18. januar 2011 - 15:05 Der er 18 kommentarer

Log ind på Fronter med cURL

Hej,

Tidligere fik jeg hjælp fra Experterne herinde til at lave et script, som kunne logge på Lectio. Det fungerer upåklageligt og jeg har været rigtig glad for det. Nu har jeg fået blod på tanden og er ved at lave et script, som kan logge ind på Fronter. Jeg har taget udgangspunkt i Lectio-scriptet, men det virker desværre ikke. Jeg synes ellers, at jeg har været hele vejen omkring og prøvet at tage højde for det hele. Er der nogen, som kan hjælpe mig videre?

Det lader ikke til at Fronter sætter nogle cookies før man faktisk er logget ind. Tilgengæld sender den nogle "hidden inputs" med nogle tokens. Dem synes jeg, at jeg har hentet.

Her er min kode:

define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)" );

$loginUrl = 'https://fronter.com/randersts/index.phtml';

// First request (saving cookies and logging in)
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $loginUrl );
curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
$cnt = curl_exec( $ch );
curl_close( $ch );

// getting fronter_request_token
preg_match( "/fronter_request_token.*?value=\"(.*?)\"/i", $cnt, $m );
$token = urlencode( $m[1] );

preg_match( "/SSO_COMMAND_SECHASH.*?value=\"(.*?)\"/i", $cnt, $m );
$sechash = urlencode( $m[1] );

// Building POST
$post = 'username=**BRUGERNAVN**&password=**KODEORD**&fronter_request_token=' . $token . '&SSO_COMMAND_SECHASH=' . $sechash;
     
// Logging in
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $loginUrl );
curl_setopt( $ch, CURLOPT_REFERER, $loginUrl );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ($ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookies.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookies.txt" );
$cnt = curl_exec( $ch );
curl_close( $ch );

// Second request, getting student information and downloading images
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, 'http://fronter.com/randersts/main.phtml');
curl_setopt( $ch, CURLOPT_REFERER, 'https://fronter.com/randersts/index.phtml' );
curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEFILE, 'cookies.txt' );
curl_setopt( $ch, CURLOPT_COOKIEJAR, 'cookies.txt' );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_ENCODING , 'gzip' );
$cnt = curl_exec( $ch );
curl_close( $ch );

echo htmlentities($cnt);

Et eksempel kan ses på
http://snuzzer.dk/v-caltio/fronter-login.php

Jeg håber, at I kan hjælpe mig videre.
Avatar billede repox Seniormester
18. januar 2011 - 16:20 #1
De tokens er jo netop til for at undgå hvad du forsøger at opnå. Men at hente de tokens i kildekoden hjælper dig næppe når du mellem dine cURL kald lukker forbindelsen; det medfører jo at dine tokens ikke længere er gyldige.
Avatar billede coderdk Praktikant
18. januar 2011 - 21:28 #2
Ah, jeg tror nu nok det kan lade sig gøre, også selvom forbindelsen lukkes. Jeg ville prøve med firefox og Live HTTP Headers for at se præcist hvad der foregår, og så efterligne det med cURL-scriptet...
Avatar billede repox Seniormester
18. januar 2011 - 21:47 #3
Det må jo være logik for perlehøns CSRF implementeringen umuliggør ovenstående forsøg hvis din session lukkes og åbnes på ny - det er jo hele pointen med det.

Det er en utrolig simpel, men yderst effektiv, sikkerhedsforanstaltning, som sikrer Fronter imod brute-force angreb. Du vil heller ikke kunne logge ind i mit system med ovenstående fremgangsmåde.

Og med en smule sund fornuft vil du også kunne sige dig selv at forsøgte du det samme gennem en almindelig browser, vil du ikke kunne åbne login siden - hente tokens ud af kildekoden og lukke browseren, åbne den igen og sende den gamle token med på den indlæst side...
Avatar billede coderdk Praktikant
18. januar 2011 - 22:17 #4
En session er en bare form for cookie jo. Modsat en browser, kan du med cURL sige at den skal gemme session cookies som det var alm cookies - Jeg har endnu ikke oplevet et site jeg ikke kunne logge ind på vha cURL og lidt regex.
Det er rigtigt at nogle sites kan være sindssygt besværlige med sådan noget - Nogle tilmed ikke besværet værd ;) Men umuligt? Jeg tvivler.
Jeg er ikke helt sikker på hvor du synes CSRF er med i det :) Vi prøver jo ikke hijacke en session, men at agere en bruger/browser på sitet vha cURL.
Avatar billede repox Seniormester
18. januar 2011 - 22:28 #5
#4
Jeg kan godt se hvor du vil hen med dit indlæg ;) det er slet session hijacking jeg taler om. problematikken består jo i at hans eget eksempel ovenfor lukker sessionen efter første kald, hvor den token bliver genereret. Selvom cURLs cookie-jar er i brug her, er den session cookie kun for den pågældende session og forbliver jo ikke i det jar. Så ingen tvivl om at det kan lade sig gøre, bare ikke hvis sessionen lukkes mellem de to trin.
Avatar billede coderdk Praktikant
18. januar 2011 - 22:34 #6
repox, Yep, jeg tror vi snakker samme sprog :)
Avatar billede SimonBStoevring Nybegynder
20. januar 2011 - 09:12 #7
Det er interessant at læse :-) Jeg vil lige prøve at bruge det Firefox plugin du snakker om coderdk og se, om der er noget, jeg glemmer at sende.
Jeg prøver også at lade være med at lukker efter hver forespørgsel.

Jeg havde egentlig troet, at det ikke ville være et problem, fordi jeg brugte cookie-jar, men det giver meget mening, når du skriver det på den måde, repox.

Jeg vender lige tilbage med svar.
Avatar billede SimonBStoevring Nybegynder
20. januar 2011 - 16:08 #8
Hej,

Det virkede med Live HTTP Headers. Jeg fandt frem til, at der var nogle parametre, jeg skulle sende med. Mange tak for det.

Jeg har dog et spørgsmål i samme dur. Nu logger mit script ind, det går til den rigtige side og forsøger at gå til elevens skema. Her bliver den så vidresendt til en helt anden side, så fra siden som viderestiller, snupper jeg linket, som der viderestilles til og vil udskrive kildekoden af denne, men jeg får beskeden "Object moved".
Har I et bud på, hvad der kan være galt? Hvis jeg kopierer linket og forsøger at besøge siden "manuelt", så virker det fint.
Avatar billede coderdk Praktikant
20. januar 2011 - 16:26 #9
Den gør det, selv med CURLOPT_FOLLOWLOCATION sat til 1/true og SSL-variablene sat til 0/false?
Avatar billede SimonBStoevring Nybegynder
20. januar 2011 - 16:48 #10
coderdk, ja, og det er også det, der undre mig.

Dette er min kode:

define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)" );

$loginUrl = 'https://fronter.com/randersts/index.phtml';

// First request (saving cookies and logging in)
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $loginUrl );
curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
$cnt = curl_exec( $ch );

// getting fronter_request_token
preg_match( "/fronter_request_token.*?value=\"(.*?)\"/i", $cnt, $m );
$token = urlencode( $m[1] );

preg_match( "/SSO_COMMAND_SECHASH.*?value=\"(.*?)\"/i", $cnt, $m );
$sechash = urlencode( $m[1] );

// Building POST
$post = 'fronter_request_token=' . $token . '&username=****BRUGERNAVN****&password=****KODE****&newlang=dk&saveid=-1&mainurl=main.phtml&chp=&USER_SCREEN_SIZE=&USER_INITIAL_WINDOW_WIDTH=1280&USER_INITIAL_WINDOW_HEIGHT=581&SSO_COMMAND=&SSO_COMMAND_SECHASH=' . $sechash;
// $post = 'username=Rasm5191&password=Ilovekris!1&fronter_request_token=' . $token . '&SSO_COMMAND_SECHASH=' . $sechash;

// Logging in
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $loginUrl );
curl_setopt( $ch, CURLOPT_REFERER, $loginUrl );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookies.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookies.txt" );
$cnt = curl_exec( $ch );

// Redirceting to account

curl_setopt( $ch, CURLOPT_URL, 'http://fronter.com/randersts/links/url_redirect.phtml?id=26464l');
curl_setopt( $ch, CURLOPT_REFERER, 'https://fronter.com/randersts/main.phtml' );
curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEFILE, 'cookies.txt' );
curl_setopt( $ch, CURLOPT_COOKIEJAR, 'cookies.txt' );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_ENCODING , 'gzip' );
$cnt = curl_exec( $ch );

// Getting timetable

$link = explode(\'location.replace(\'', htmlentities($cnt));
$link = explode('\'', $link['2']);

curl_setopt( $ch, CURLOPT_URL, $link['0']);
curl_setopt( $ch, CURLOPT_REFERER, 'http://fronter.com/randersts/links/url_redirect.phtml?id=26464' );
curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEFILE, 'cookies.txt' );
curl_setopt( $ch, CURLOPT_COOKIEJAR, 'cookies.txt' );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_ENCODING , 'gzip' );
$cnt = curl_exec( $ch );
curl_close( $ch );

echo htmlentities($cnt);

Outputtet er, som det ses på http://snuzzer.dk/fronter/
Avatar billede coderdk Praktikant
20. januar 2011 - 18:17 #11
Ah, du skal nok ændre dit kodeord nu :(
Avatar billede coderdk Praktikant
20. januar 2011 - 18:25 #12
Det giver dog ingen mening - Jeg har lige logget ind som dig for at se headers - Og der kommer bare en 302 og en Location, så FOLLOWLOCATION burde virke!

Hvis alt fejler, kunne du ikke bare scrape koden og hente indholdet?

preg_match( '/href="(.*?)"/', $cnt, $m );
$nyurl = 'http://fronter.com' . $m[1];

Og så hente $nyurl ?

Alternativt sæt CURL_HEADER til 1 og led efter Location: i headers ;)
Avatar billede SimonBStoevring Nybegynder
20. januar 2011 - 19:02 #13
Pis!

Jeg synes da bare, at hvis FOLLOWLOCATION virkede, så skulle den fortsætte til den "endelige URL" og hente indholdet fra den - og så skulle dét bare spille!

Men hvad mener du helt præcist med at "scrape koden"? Kan jeg måske få dig til at give et eksempel? :-$
Avatar billede SimonBStoevring Nybegynder
20. januar 2011 - 19:05 #14
Jeg har forsøgt mig med at blive ved med at hente links fra "Object moved" indtil det ikke kom længere (jeg lagde mærke til, at det var nye links hele tiden) og til sidst fik jeg beske dom, at der manglede eller at der var ugyldige parametre. Så det virkede ikke helt rigtigt... For linket burde jo være godt nok.
Avatar billede coderdk Praktikant
20. januar 2011 - 19:09 #15
Jeg gav et eksempel på en scraping i min sidste kommentar - men det var på "Object moved" siden - Du kan scrape location også:

preg_match( "/^location: (.*)$/mi", $cnt, $m );

Den kræver dig CURLOPT_HEADER er 1 :)
Avatar billede coderdk Praktikant
20. januar 2011 - 19:10 #16
Men ja, det burde bare også virke med FOLLOWLOCATION?!...
Avatar billede SimonBStoevring Nybegynder
20. januar 2011 - 19:56 #17
Aha, jeg tror, at jeg er med, men jeg er ikke sikker på, at hverken FOLLOWLOCATION eller CURLOPT_HEADER vil virke i det her tilfælde (..men jeg er ikke sikker), for det lader til, at når jeg kører siden uden htmlentities() så redirecter den mig rigtig nok til skemaet (fører mig til en underside på www.easytools.dk) og det er dennes kildekode, jeg er interesseret i, men når jeg udskriver kildekoden med htmlentities() så får jeg en masse JavaScript kode, hvor jeg kan se, at det er denne JS-kode, som sender mig videre.

Når jeg så kopierer linket i den JS-kode ind i min browser, så går den til en side, som redirecter mig til en helt ny underside hvor skemaet (som er mit mål) bliver vist.

Spørgsmålet er bare at få scriptet til at gå fra linket på det første JS-kode, foretage et redirect og komme hen til den rigtige side.

Der kan jeg simpelthen ikke gennemskue strukturen.

Jeg håber ikke, at vi taler forbi hinanden.

http://snuzzer.dk/fronter/

Der ryger man hen på skemaet nu og det er dets kildekode, jeg er interesseret i.
Avatar billede SimonBStoevring Nybegynder
21. januar 2011 - 19:16 #18
Hej,

Nu fik jeg den til at hente headers med preg_match() Så laver jeg en forespørgsel på den, men får "Bad request" tilbage. Det forstår jeg virkelig ikke, for hvis jeg kopierer linket, som jeg laver en forespørgsel på, ind i min browser, så får jeg skemaet som output.

Prøv at se http://snuzzer.dk/fronter/test.php
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester