POST-Daten eines Formulars ermitteln

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

POST-Daten eines Formulars ermitteln

Beitragvon droptix » Montag 8. Januar 2007, 23:32

Habe ein HTML-Formular mit einem Eingabefeld für einen Gutschein. Ich will spaßenshalber mal per Bruteforce-Methode ein paar Gutschein-Codes generieren und auf deren Gültigkeit prüfen. Also muss ich das Formular nachbauen, bevor ich es mit `urlopen()` abschicke. Hier mal schnell die Funktion dazu:

Code: Alles auswählen

def get_page(self, url, data=None):
   request = urllib2.Request(url)
   if data is not None:
      data = urllib.urlencode(data)
   try:
      handle = urllib2.urlopen(request, data)
      content = handle.read()
      handle.close()
      return content
   except urllib2.HTTPError:
      print "error 404: %s" % url


Ich schaue also in den Quelltext meiner HTML-Ausgangsdatei und suche die action-URL des Formulars raus. Dann übernehme ich jedes <input>-Feld mit Name und Wert in ein Dictionary und übergebe beides an meine Funktion (s.o.):

Code: Alles auswählen

url = "http://domain.tld/formaction.php"
fields = {
   'field1': "value1",
   'field2': "value2",
   # …
   'fieldN': "valueN"
}


Ein JavaScript habe ich noch entdecken können, welches das Formular schließlich abschickt. Der Absende-Button ist kein <input type="submit" /> oder <button/> Element, sondern ein <a>-Link. Das JS setzt vor dem form.submit() noch zwei hidden-fields. Die neu gesetzten Werte habe ich natürlich in mein Dictionary übernommen.

Das Ergebnis schreibe ich in eine HTML-Datei auf die Festplatte. Dummerweise entspricht das nicht demselben Ergebnis wie als wenn ich das Formular im Browser abschicke. Es kommt quasi eine Fehlerseite. Vielleicht fehlt mir noch ein Cookie oder so...

Gibt's eine Möglichkeit, einfach ALLES was ein Formular aus dem Browser heraus per HTTP-Request überträgt, mal abzufangen und in ein Python-Dictionary zu übertragen? Das lästige Abtippen kann ganz schön mühsam sein. Einfach um nichts zu vergessen?
Zuletzt geändert von droptix am Montag 8. Januar 2007, 23:39, insgesamt 1-mal geändert.
r2d2
User
Beiträge: 43
Registriert: Donnerstag 2. März 2006, 23:05
Wohnort: Bielefeld

Beitragvon r2d2 » Montag 8. Januar 2007, 23:37

anfragen per link (<a href ...) sind anfragen per GET und werden mit http://domain.tld/formaction.php?feld=bla&feld2=blub aufgerufen.

r2d2
äh, nimm diese schlange von meinem hals.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: POST-Daten eines Formulars ermitteln

Beitragvon Leonidas » Montag 8. Januar 2007, 23:38

droptix hat geschrieben:Gibt's eine Möglichkeit, einfach ALLES was ein Formular aus dem Browser heraus per HTTP-Request überträgt, mal abzufangen und in ein Python-Dictionary zu übertragen? Das lästige Abtippen kann ganz schön mühsam sein.

Das nicht, aber du kannst problemlos mit Wireshark oder Packetyzer den HTTP-Verkehr ansehen, entschlüsseln und dann analysieren.Den Python-Code musst du allerdings noch selbst machen ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: POST-Daten eines Formulars ermitteln

Beitragvon gerold » Montag 8. Januar 2007, 23:43

droptix hat geschrieben:Ich will spaßenshalber mal per Bruteforce-Methode ein paar Gutschein-Codes generieren und auf deren Gültigkeit prüfen.

Hi droptix!

Irgendwie werde ich bei solchen Aussagen immer ein wenig misstrauisch. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Montag 8. Januar 2007, 23:46

r2d2 hat geschrieben:anfragen per link (<a href ...) sind anfragen per GET und werden mit http://domain.tld/formaction.php?feld=bla&feld2=blub aufgerufen.


Normalerweise. Aber mein Abschicken-Link sieht ungefähr so aus:

Code: Alles auswählen

<a href="#" onclick="doSomething('hiddenValue1', 'hiddenValue2')">Gutschein prüfen</a>


Die JS-Funktion setzt die beiden Parameter als Werte zweier hidden-fields im Formular und am Ende schickt es das Formular per `form.submit()` ab.

Leonidas hat geschrieben:du kannst problemlos mit Wireshark oder Packetyzer den HTTP-Verkehr ansehen


Dubdidum… was es alles gibt :D Danke!
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Re: POST-Daten eines Formulars ermitteln

Beitragvon droptix » Montag 8. Januar 2007, 23:47

gerold hat geschrieben:irgendwie werde ich bei solchen Aussagen immer ein wenig misstrauisch. ;-)


Na Programmieren soll doch Spaß machen! :twisted: Ich hätte es auch anders formulieren können: "Ich habe hier einen Haufen alter Gutschein-Codes und möchte prüfen, welche davon noch gültig sind…". Besser so?

EDIT: Die Seite benutzt einige Cookies. Erkennt die so ein Netzwerk-Sniffer auch oder muss ich die mir einzeln aus dem Browser ziehen?
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Cookies anhängen

Beitragvon droptix » Dienstag 9. Januar 2007, 08:57

So, ich habe dann mal die Seite mit dem Formular im Browser geöffnet. Dann den Packetyzer angeworfen, das Formular abgeschickt und anschließend das Sniffen beendet. Siehe da, jede Menge Information… zuviel eigentlich :)

Was interessant war: ich kann da nach "http and http.request" filtern. Dabei bekomme ich tatsächlich einen Eintrag beginnend mit "HTTP: POST …". Dort gibt's nen Eintrag "http = Hypertext Transfer Protocol" und "data-text-lines = Line-based text data: application/x-www-form-urlencoded". Darin scheinen meine gewünschten Informationen zu stehen. Ich sehe beim ersten alle gesendeten HTTP-Header inklusive Cookies. Beim zweiten sehe ich alle Felder und Werte des Formulars.

Dummerweise lassen sich nicht alle Zeilen aus dem Programm kopieren.… und die sind manchmal ganz schön lang! Gerade der Eintrag für die Formularfelder wäre wichtig. Aber auch einige Header können nicht kopiert werden (z.B. "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"). Daher weiß ich nicht, ob ein Abtippen der Zeile korrekt wäre. Es gibt noch ein paar Zeilen, die ich nicht rauskopieren kann. Die Cookies gehen aber wiederum und sehen so aus:

Code: Alles auswählen

http.cookie = Cookie: StormPCookie=penv=elas_beta_control|de|dhs|8c90973e62f1680&bandwidth=NA&perzationProfile=default&pl=de&pc=de&js=1&cprofle=200701071x0002020X02&rpo_features=notebooks_good; RBI=debsddebsdt1=features:notebooks_good/N01131:8c901aa8d1a


Wie kriege ich die wichtigen Zeilen aus dem Programm raus? Man kann nicht in eine .txt exportieren. Man kann zwar speichern, aber da kommt nur kryptisches unverwertbares Zeugs raus. Ich kann jetzt nicht jedes Dateiformat durchtesten -> gibt's eins wo strukturierte Plaintext-Informationen drin stehen?

Wie übermittle ich Cookies beim Öffnen der URL? Nach Leonidas' Beispiel hab ich sowas gesehen:

Code: Alles auswählen

request = urllib2.Request(url)
request.add_header('Cookie', 'MOIN_ID=%s' % moin_id)


Ist das Zufall oder werden Cookies per Header mit dem Namen 'Cookie' übermittelt? Der Wert des Cookies ist dann bereits im Format "Name=Value".
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Re: Cookies anhängen

Beitragvon droptix » Dienstag 9. Januar 2007, 09:44

droptix hat geschrieben:Dummerweise lassen sich nicht alle Zeilen aus dem Programm kopieren.


Man nehme Wireshark, dort geht's problemlos.

Nachdem ich also alle Werte habe, stellt sich mir die Frage, ob ich die nicht gleich alle als Header und Data abschicken kann. Somit erspare ich mir ein lästiges Umwandeln.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Cookies anhängen

Beitragvon Leonidas » Dienstag 9. Januar 2007, 19:17

droptix hat geschrieben:Wie übermittle ich Cookies beim Öffnen der URL? Nach Leonidas' Beispiel hab ich sowas gesehen:

Code: Alles auswählen

request = urllib2.Request(url)
request.add_header('Cookie', 'MOIN_ID=%s' % moin_id)


Ist das Zufall oder werden Cookies per Header mit dem Namen 'Cookie' übermittelt? Der Wert des Cookies ist dann bereits im Format "Name=Value".

Ja, Cookies werden mit dem Cookie-Header vom Client geschickt, der Client bekommt Cookies mit dem Set-Cookie-Header vom Server. Allerdings ist meine Methode ziemlich "low-level", weil ich einfach eine sehr simple Methode benötigt habe. Python bringt allerdings auch die Module Cookie und cookielib in der Stdlib schon mit.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Mittwoch 10. Januar 2007, 00:18

Für reines HTTP-Sniffing empfehle ich die "Live HTTP Headers"-Extension für Firefox.
lunas
User
Beiträge: 87
Registriert: Samstag 2. Dezember 2006, 10:56

Beitragvon lunas » Sonntag 28. Januar 2007, 03:52

Den Http Analyzer von http://www.ieinspector.com/ kann ich zum Http sniffing sehr empfehlen.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder