Open Source im professionellen Einsatz

Die Besten zuerst

Ein typisches Plugin zeigt Listing 2 mit dem Modul »ClickAllLinks«. Wenn das Hauptskript das Plugin lädt, ruft es dessen »register()«-Methode auf, die den Namen der implementierten Taktik und eine Prioritätszahl zurückliefert. Das Hauptskript sortiert die Plugins numerisch nach den von ihnen mitgeteilten Prioritätszahlen, ruft also Plugins mit niedrigen Werten zuerst auf. So können die Plugins untereinander auskarteln, wer wann an die Reihe kommt. Üblicherweise sollte das mit den besten Erfolgsaussichten den Anfang machen, das verkürzt den Skriptlauf. Die beiden hier vorgestellten Plugins definieren die Prioritäten 10 beziehungsweise 50, sodass das Skript immer zuerst »ClickAllLinks« versucht, bevor das weiter unten gezeigte »CheckBoxFill«-Verfahren zum Zug kommt.

Listing 2:
»ClickAllLinks.pm«

01 ###########################################
02 package
03   SplashJumper::Plugin::ClickAllLinks;
04 ###########################################
05 use Log::Log4perl qw(:easy);
06 
07 ###########################################
08 sub register {
09 ###########################################
10     return "click-all-links", 10;
11 }
12 
13 ###########################################
14 sub process {
15 ###########################################
16   my($self, $mech) = @_;
17 
18   for my $link ( $mech->links() ) {
19 
20       INFO "Clicking on ", $link->url();
21       my $resp = $mech->get( $link );
22 
23       INFO "Got ",
24            length( $resp->content() ),
25            " bytes back";
26 
27       $mech->back();
28   }
29 }
30 
31 1;

Kommt ein Plugin zum Überwinden der Splash-Page zum Einsatz, ruft das Skript dessen »process()«-Methode auf und übergibt ihr den Browser-Simulator »$mech«, ein Objekt der Klasse WWW::Mechanize. Dieses CPAN-Modul eignet sich hervorragend dazu, Webseiten einzuholen, deren Inhalt zu analysieren und zu tiefer liegenden Links vorzudringen. Es kommt häufig bei der Implementierung von Screenscrapern zum Einsatz, da es beinahe alle Browser-Funktionen beherrscht (abgesehen von Javascript-Code oder Flash-Plugins) und Cookies automatisch empfängt und korrekt wieder an den Server zurückschickt.

Im Plugin »ClickAllLinks« findet zunächst die Methode »links()« alle auf der eingeholten Splash-Seite vorhandenen Links in Form von WWW::Mechanize::Link-Objekten und iteriert über die Liste mittels einer For-Schleife. Die Funktion »INFO()« aus dem Log4perl-Fundus zeigt dann dem neugierigen User an, welchen Link das Plugin gerade anklickt. Die Methode »get()« des Browser-Simulators führt den Webrequest anschließend durch.

Mechanize mit Autocheck

Eine explizite Fehlerprüfung findet dabei nicht statt, da WWW::Mechanize sich standardmäßig im »autocheck«-Modus befindet, in dem es sowieso bei jedem auftretenden Fehler eine Exception wirft, die ein im Hauptskript um den Plugin-Aufruf gewickelter Eval-Block abfängt. Anschließend behandelt das Hauptprogramm den Fehler.

In Zeile 23 zeigt das Plugin dann mit einer weiteren Info-Anweisung an, wie viele Bytes über den geklickten Link zurückkamen, und die Methode »back()« in Zeile 27 drückt den Back-Button des virtuellen Browsers, damit dieser wieder zur Splash-Page zurück rudert.

Eine weitere Taktik zeigt das Plugin »CheckBoxFill« in Listing 3. Es sucht im HTML der Splash-Seite das erste Webformular und setzt dieses mit der Anweisung »form_number(1)« als »current_form«. Die Methode »find_input()« extrahiert daraus alle Eingabefelder vom Typ »checkbox« und die For-Schleife ab Zeile 22 klickt sie alle an, indem sie deren »check()«-Methode aufruft.

Listing 3:
»CheckBoxFill.pm«

01 ###########################################
02 package SplashJumper::Plugin::CheckBoxFill;
03 ###########################################
04 use Log::Log4perl qw(:easy);
05
06 ###########################################
07 sub register {
08 ###########################################
09     return "checkbox-fill", 50;
10 }
11
12 ###########################################
13 sub process {
14 ###########################################
15   my($self, $mech) = @_;
16
17   $mech->form_number(1);
18
19   my @inputs = $mech->current_form->
20            find_input( undef, "checkbox" );
21
22   for my $input ( @inputs ) {
23       $input->check();
24   }
25
26   INFO "Submitting form 1";
27   $mech->submit_form( form_number => 1 );
28   $mech->back();
29 }
30
31 1;

Zeile 27 schickt das Webformular dann mit »submit_form()« an den Server zurück, bevor Zeile 28 wieder auf die Splash-Seite zurückkehrt, damit das eventuell gleich folgende Plugin wieder normale Ausgangsbedingungen vorfindet. Mit dieser Methode lassen sich Splash-Pages wie in den Abbildungen 5 und 6 knacken, die beide dem User abverlangen, eine Checkbox zu aktivieren und dann den Submit-Button anzuklicken.

Abbildung 5: Das kostenlose Wifi am Flughafen von San Diego verlangt eine Checkbox anzuklicken und das Webformular abzuschicken.

Abbildung 5: Das kostenlose Wifi am Flughafen von San Diego verlangt eine Checkbox anzuklicken und das Webformular abzuschicken.

Abbildung 6: Das kostenlose Wifi am Flughafen von San Francisco, ebenfalls mit einer Checkbox.

Abbildung 6: Das kostenlose Wifi am Flughafen von San Francisco, ebenfalls mit einer Checkbox.

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook