Toegang krijgen tot een aspx pagina met behulp van Snoopy

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nick van Berg

Nick van Berg

14/04/2014 11:13:46
Quote Anchor link
Hallo, Ik ben recent begonnen met PHP en ik ben bezig met een script waarbij ik met behulp van snoopy mezelf door een 2 pagina's met formulieren probeer te loodsen, waarbij ik vervolgens terechtkom op de pagina waar ik wil zijn.

Het doel is om met mijn php class in een keer bij mijn rooster te komen, momenteel gaat dit als volgt:
-Je komt op de eerste pagina: default.aspx hier voer je de eerste 4 letter van je achternaam in en drukt op zoek
-Je komt op de tweede pagina: LogInWebForm.aspx hier kies je uit de lijst je naam en klikt op 'rooster'
-Je komt op de derde pagina: hier zie je je rooster

Het lastige is, dat je niet simpelweg een formuliertje kan doen en direct naar de roosterpagina, maar dat je je door de pagina's heen moet loodsen, en elke keer de _VIEWSTATE variable moet ophalen (waarbij de eerste "static" is).

Hieronder mij class, die in theorie zou moeten werkenin theorie zou moeten werken.

Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
include "Snoopy.class.php";
$snoopy = new Snoopy;

$submit_url = "http://walterbosch.cupweb6.nl";

$submit_vars["_nameTextBox"] = "jac";
$submit_vars["_zoekButton"] = "Zoek";
$submit_vars["numberOfLettersField"] = "3";
$submit_vars["__VIEWSTATE"] = "/wEPDwULLTE3NDM5MzMwMzRkZA==";
  
$snoopy->submit($submit_url,$submit_vars);
while(list($key,$val) = each($snoopy->headers)){
    if(stripos($val, "SessionId")!==false)
    {

        $v = explode("ASP.NET_SessionId=",$val);
        $w = explode(";",$v[1]);
        $sessionId = $w[0];
    }
}

  

$url = "http://walterbosch.cupweb6.nl/LogInWebForm.aspx";
$x = explode("__VIEWSTATE\" value=\"", $snoopy->results);
$y = explode("\"", $x[1]);
$viewstate = $y[0];

$name = "Berg  van den Nick (3H1)[150033]";
$vars["__VIEWSTATE"] = $viewstate;
$vars["_nameDropDownList"] =$name;
$vars["_pincodeTextBox"] = "";
$vars["_roosterbutton"] = "Rooster";

$snoopy->cookies["ASP.NET_SessionId"] = $sessionId;
$snoopy->submit($url,$vars);
print $snoopy->results;
?>


Echter, krijg ik bij het uitvoeren hiervan de volgende print terug:
Quote:
Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.


Waaruit blijkt dat zij een bepaalde instelling hebben gezet "to verify that arguments to postback or callback events originate from the server that originally rendered them".

Ik denk als volgt, als je het met je browser kan doen, moet het met PHP ook mogelijk zijn. Is er een mogelijkheid om mijn script hierop aan te passen, of is het wellicht beter om een geheel andere weg in te slaan?
Gewijzigd op 14/04/2014 11:17:51 door Nick van Berg
 
PHP hulp

PHP hulp

25/12/2024 05:29:27
 
- Ariën  -
Beheerder

- Ariën -

14/04/2014 11:18:35
Quote Anchor link
Het klinkt als een beveiliging die je probeert de omzeilen?

Kan je niet vragen of ze een API hebben, dat lijkt me doeltreffender dan een site proberen te scrapen die opeens van de ene op de andere dag na een update van hun kant weer anders werkt.
 
Michael -

Michael -

14/04/2014 11:41:43
Quote Anchor link
Het is vast wel mogelijk, maar hun proberen zich er juist voor te beschermen voor zulke acties. Dus het is niet gewenst. De vraag is dan ook of je er wel zoveel moeite in wil steken om je rooster kunnen zien zonder in te loggen. Hun krijgen waarschijnlijk wel meldingen van jou pogingen, dus je hebt ook nog de kans geblokkeerd te worden.
 
- Ariën  -
Beheerder

- Ariën -

14/04/2014 11:45:54
Quote Anchor link
En dat vind ik nu het leukste van ASP.NET, hoewel ik die taal niet ken.
In PHP moet je zoiets zelf nog eens schrijven :-P
 
Nick van Berg

Nick van Berg

14/04/2014 11:50:52
Quote Anchor link
Het is simpelweg een site van mijn school, die gebruik maakt van het programma contacturenplanner.

Probeert u gerust zelf mijn rooster te zien op http://walterbosch.cupweb6.nl (zoek op berg) er is ook geen pincode nodig als je alleen het rooster wil zien.

Bovendien is er een redelijk aantal apps doe werken met contacturenplanner (ook gemaakt door scholieren zelf).
 
- Ariën  -
Beheerder

- Ariën -

14/04/2014 11:54:23
Quote Anchor link
Ja, maar dan alsnog wil dat niet zeggen dat het zomaar gekopieerd mag worden. Dus loop eens langs de IT-afdeling van je school en leg je probleem eens uit. Of zoek of ze een API aanbieden waarmee je de data via alternatieve gestandaardiseerde wijze op halen, misschien gebruiken die andere app's dat ook?
Gewijzigd op 14/04/2014 11:59:28 door - Ariën -
 
Michael -

Michael -

14/04/2014 12:17:15
Quote Anchor link
>>> En dat vind ik nu het leukste van ASP.NET, hoewel ik die taal niet ken
De meldingen bedoel je? Geen idee. Ik ken de taal ook niet.

>>> Het is simpelweg een site van mijn school, die gebruik maakt van het programma contacturenplanner.
>>> Bovendien is er een redelijk aantal apps doe werken met contacturenplanner (ook gemaakt door scholieren zelf).

Dat zegt natuurlijk niet dat het is toegestaan.

>>> Of zoek of ze een API aanbieden
Als je op cupweb6.nl kijkt lijkt t op een script uit de vorige eeuw (met een update in 2007). Lijkt me dat er geen API voor is.
Gewijzigd op 14/04/2014 12:18:04 door Michael -
 
Ivo P

Ivo P

14/04/2014 12:24:41
Quote Anchor link
<option value="Berg van den Nick (3H1)[***]">Berg van den Nick (3H1)[***]</option>

Ik denk dat de value van die option steeds gelijk is voor jou?

Dan kun je de eerste stap dus al overslaan.
 
Nick van Berg

Nick van Berg

14/04/2014 14:12:30
Quote Anchor link
Ik heb het de informatica sectie op school voorgelegd, zij denken dat het geen probleem is als ik de informatie van cupweb haal. Het probleem is dat het programma/script extern gehost is, en dat zij er dus geen veranderingen in kunnen maken. Het is tevens een verouderd script, dat verder geen uitbreidingsmogelijkheden of communicatiemogelijkheden heeft betreffende de webinterface.

Quote:
@Ivo P
<option value="Berg van den Nick (3H1)[***]">Berg van den Nick (3H1)[***]</option>

Ik denk dat de value van die option steeds gelijk is voor jou?

Dan kun je de eerste stap dus al overslaan.

Hoe bedoel je precies? Om op de tweede pagina te komen zal je eerste door de eerste stap moeten lopen (session id).
Gewijzigd op 14/04/2014 14:13:29 door Nick van Berg
 
Michael -

Michael -

14/04/2014 14:17:59
Quote Anchor link
>> Hoe bedoel je precies? Om op de tweede pagina te komen zal je eerste door de eerste stap moeten lopen (session id).

Ja en nee. Je zou de pagina inderdaad eerst moet ophalen om te weten te komen wat de viewstate en evenvalidation zijn. En de session opslaan in een cookie.

Cookie ziet eruit als
Quote:
Cookie:ASP.NET_SessionId=0q5uabvzdlqow5ptqeaznhkv; __utma=158629288.685805783.1397470187.1397470187.1397470187.1; __utmc=158629288; __utmz=158629288.1397470187.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); walterbosch=14C277B7F1CA44138298BBCB4D09181B4C50E7ED4FEFECA3484AC058FCDF838142717E3E74CD28920E6AFA9F8A534D9CE99B2DCDDEBA5FA00E4692F6336F54CD1F5F4A5B1234AAB1BEDD9004CFE0019BC549DA0D598B2FDFA001CF3305F35471B9CD8E1A757FDC8E80AC37381EB754697C70FA78CDFD87E58390E083F16A29B7


En soort gelijke gegevens als de volgende moet je dan posten naar http://walterbosch.cupweb6.nl/LogInWebForm.aspx

Quote:
__EVENTTARGET:
__EVENTARGUMENT:
__VIEWSTATE:/wEPDwUJNDAxOTQ1MjQyZGQ=
__EVENTVALIDATION:/wEWEQLc4selBALV+7CaCAK61MapDwL19/+CDQKiyObxCQLI98qEDwKtvJL3BQLDmv/6CAL99sv/AgLCyenSDwK/6piPCwK86JPdCwLBkL6FCAKD/a/UCQKV0fvMDwK+j6zRAwKA1s+bCA==
_nameDropDownList:Berg van den Nick (3H1)[150033]
_pincodeTextBox:
_roosterbutton:Rooster


Dan hoef je dus niet eerst je naam op te halen, want die weet je al.

Toevoeging op 14/04/2014 14:31:42:

Ik kwam dit nog hier tegen.
Misschien heb je er wat aan.
Alle ** even aanpassingen naar je eigen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
include "snoopy.class.php";
$snoopy = new Snoopy;

$submit_url = "http://**.cupweb6.nl/";

$submit_vars["_nameTextBox"] = "jac";
$submit_vars["_zoekButton"] = "Zoek";
$submit_vars["numberOfLettersField"] = "3";
$submit_vars["__VIEWSTATE"] = "dDwtOTM4MzIzMjk0Ozs+";
  
$snoopy->submit($submit_url,$submit_vars);
while(list($key,$val) = each($snoopy->headers)){
    if(stripos($val, "SessionId")!==false)
    {

        $v = explode("ASP.NET_SessionId=",$val);
        $w = explode(";",$v[1]);
        $sessionId = $w[0];
    }
}

  

$url = "http://**.cupweb6.nl/LogInWebForm.aspx";
$x = explode("__VIEWSTATE\" value=\"", $snoopy->results);
$y = explode("\"", $x[1]);
$viewstate = $y[0];

$name = "**";
$vars["__VIEWSTATE"] = $viewstate;
$vars["_nameDropDownList"] =$name;
$vars["_pincodeTextBox"] = "0000";
$vars["_roosterbutton"] = "Rooster";

$snoopy->cookies["ASP.NET_SessionId"] = $sessionId;
$snoopy->submit($url,$vars);
print $snoopy->results;
?>
Gewijzigd op 14/04/2014 14:33:35 door Michael -
 
Nick van Berg

Nick van Berg

14/04/2014 14:57:48
Quote Anchor link
Beste Micheal, dit is inderdaad waar ik de code vandaan heb. Als je ziet is het ook vrijwel gelijk aan mijn code, alleen is mijn code aangepast op mijn school (tenzij je foute aanpassingen ziet). Ik kon trouwens ook die code niet aan de praat krijgen (rauwe copy, paste & run).

Naar aanleiding van jouw code had ik nog even dit gemaakt:

Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
function post_to_url($url, $data) {
   $fields = '';
   foreach($data as $key => $value) {
      $fields .= $key . '=' . $value . '&';
   }

   rtrim($fields, '&');

   $post = curl_init();

   curl_setopt($post, CURLOPT_URL, $url);
   curl_setopt($post, CURLOPT_POST, count($data));
   curl_setopt($post, CURLOPT_POSTFIELDS, $fields);
   curl_setopt($post, CURLOPT_RETURNTRANSFER, 1);

   $result = curl_exec($post);
   echo 'result:';
   echo $result;

   curl_close($post);
}


$data = array(
"__EVENTTARGET" => "",
"__EVENTARGUMENT" => "",
"__VIEWSTATE " => "/wEPDwUJNDAxOTQ1MjQyZGQ=",
"__EVENTVALIDATION " => "/wEWEQLc4selBALV+7CaCAK61MapDwL19/+CDQKiyObxCQLI98qEDwKtvJL3BQLDmv/6CAL99sv/AgLCyenSDwK/6piPCwK86JPdCwLBkL6FCAKD/a/UCQKV0fvMDwK+j6zRAwKA1s+bCA==",
"_nameDropDownList" => "Berg van den Nick (3H1)[150033]",
"_pincodeTextBox" => "",
"_roosterbutton" => "Rooster"

);

post_to_url("http://walterbosch.cupweb6.nl/LogInWebForm.aspx", $data);
?>



Maar die levert weer dezelfde print op:
Quote:
Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Gewijzigd op 14/04/2014 14:59:02 door Nick van Berg
 
Michael -

Michael -

14/04/2014 15:20:15
Quote Anchor link
Ik verwacht dat ASP intussen een update heeft gehad met een verbeterde beveiliging o.i.d.
Zal denk ik lastig worden om het werkend te krijgen.
 
- Ariën  -
Beheerder

- Ariën -

14/04/2014 16:12:04
Quote Anchor link
Vraag ze eens of die beveiliging uit kan worden gezet?
 
Nick van Berg

Nick van Berg

14/04/2014 17:11:29
Quote Anchor link
Ik denk niet dat dat mogelijk is, het geheel is extern gehost en geheel niet aanpasbaar. In het geval dat, dan zouden ze eerst contact op moeten nemen met het sofwarebedrijf, dat vervolgens de sourcecode van hun systeem moet aanpassen, waardoor de wijzigingen opgaan voor al hun klanten.

Anders moet ik misschien op zoek gaan naar een andere aanpak, zoals deze website bijvoorbeeld doet. http://cup.kevinalberts.nl/rooster.php?s=1 die communiceert met een Iframe.
 
Mega Cookie

Mega Cookie

16/05/2014 11:55:11
Quote Anchor link
Ik weet dat dit misschien een beetje oud is maar ik heb een eigen CUPWEB-API gemaakt voor PHP: https://github.com/MegaCookie/CUP-PHP
Hoef je niet te gebruiken maar kan als voorbeeld dienen om via CURL het rooster op te halen.
 
Nick van Berg

Nick van Berg

16/05/2014 16:58:58
Quote Anchor link
Mega Cookie op 16/05/2014 11:55:11:
Ik weet dat dit misschien een beetje oud is maar ik heb een eigen CUPWEB-API gemaakt voor PHP: https://github.com/MegaCookie/CUP-PHP
Hoef je niet te gebruiken maar kan als voorbeeld dienen om via CURL het rooster op te halen.


Geweldig! Bedankt voor je reactie! Ik had al even snel naar open source projecten gekeken (maar cup is helaas een algemene uitdrukking). Ik zal er meteen naar kijken.

EDIT: Het werkt, ik hoefde alleen nog de _VIEWSTATE in getTimeTable aan te passen, nogmaals bedankt!
Gewijzigd op 16/05/2014 17:14:58 door Nick van Berg
 
- Ariën  -
Beheerder

- Ariën -

16/05/2014 17:11:46
Quote Anchor link
Toch vrees ik dat het niet echt zal werken, gezien de ASPX-pagina een beveiliging heeft. maar het is het proberen waard. Ben benieuwd naar de bevindingen.
 
Mega Cookie

Mega Cookie

17/05/2014 16:27:01
Quote Anchor link
Mooi om te horen dat het werkt! Ik zal het in de documentatie zetten en de code een beetje aanpassen, dat de Viewstate veranderd moet worden omdat dit dus blijkbaar op elke andere CUPWEB-site anders is (logisch eigenlijk maar zonder het testen op een andere site dan van m'n eigen school zou ik hier nooit achter zijn gekomen).
Off-topic: wat ben je van plan te gaan maken? Ik ben wel benieuwd.
@-AAR-: De 'beveiliging' van ASPX is gewoon een fout in de Post-headers hierbij hebben ViewState en EventValidation een grote invloed en moet je goed bestuderen welke andere headers er allemaal worden verzonden (zelfs voor een paar stomme knopjes). Daarnaast zijn ViewState of EventValidation meestal dynamisch, en dus lastig om snel te implenteren via een CURL-request.
Gewijzigd op 17/05/2014 16:43:43 door Mega Cookie
 
Nick van Berg

Nick van Berg

18/05/2014 17:52:19
Quote Anchor link
Ik weet nog niet wat ik van plan ben, het was altijd al een opmerkelijke site (het werkte nooit helemaal lekker), toen ben ik eens in de broncode gaan kijken & experimenteren. Mijn uiteindelijke doel is om in 1 klik de lessen te bekijken (dus niet meer doorklikken & wachten) en daar ben ik nu aan toegekomen (ik parseer de broncode verder niet, ik laat hem gewoon direct zien).
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.