Seite 1 von 1

POST-Daten eines Formulars ermitteln

Verfasst: Montag 8. Januar 2007, 23:32
von droptix
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?

Verfasst: Montag 8. Januar 2007, 23:37
von r2d2
anfragen per link (<a href ...) sind anfragen per GET und werden mit http://domain.tld/formaction.php?feld=bla&feld2=blub aufgerufen.

r2d2

Re: POST-Daten eines Formulars ermitteln

Verfasst: Montag 8. Januar 2007, 23:38
von Leonidas
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 ;)

Re: POST-Daten eines Formulars ermitteln

Verfasst: Montag 8. Januar 2007, 23:43
von gerold
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
:-)

Verfasst: Montag 8. Januar 2007, 23:46
von droptix
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!

Re: POST-Daten eines Formulars ermitteln

Verfasst: Montag 8. Januar 2007, 23:47
von droptix
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?

Cookies anhängen

Verfasst: Dienstag 9. Januar 2007, 08:57
von droptix
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".

Re: Cookies anhängen

Verfasst: Dienstag 9. Januar 2007, 09:44
von droptix
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.

Re: Cookies anhängen

Verfasst: Dienstag 9. Januar 2007, 19:17
von Leonidas
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.

Verfasst: Mittwoch 10. Januar 2007, 00:18
von Y0Gi
Für reines HTTP-Sniffing empfehle ich die "Live HTTP Headers"-Extension für Firefox.

Verfasst: Sonntag 28. Januar 2007, 03:52
von lunas
Den Http Analyzer von http://www.ieinspector.com/ kann ich zum Http sniffing sehr empfehlen.