2017-05-07 11 views
0

Ich versuche, in CTF zu bekommen und ich fand eine coole Website-Ment, um einige web-basierte CTF-Fähigkeiten namens ctf.slothparadise.com zu üben. Ich habe 4 der Flags bekommen, aber zwei von ihnen geben mir den Finger und leider musste ich die guten Ol 'Python Fähigkeiten abstauben.Python-Urllib-Modul TypeError

import urllib.error 
import urllib.request 
import urllib.parse 
import urllib 
import sys 

while True: 
     about_page = urllib.request.urlopen("http://ctf.slothparadise.com/about.php").read() 
     if "KEY" in about_page: 
      print(about_page) 
      sys.exit(0) 

ctf.slothpython.com/about.php ist die Seite Ich programmiere für und es spuckt alle 1000 Besucher den Schlüssel in den Quellcode aus. Anstatt ein Idiot zu sein und ihn bis 1000 zu aktualisieren, schrieb ich diesen Code in der Hoffnung, dass er die Seite so lange öffnen würde, bis der Satz "KEY" im Seitenquellcode erschien.

Ich erhalte diese: (Typeerror: ‚str‘ die Puffer-Schnittstelle nicht unterstützt)

Von dem, was ich weiß, über TypeErrors dass ich vermute, ich vielleicht im falschen Format haben „KEY“ kann? Ich bin mir nicht wirklich sicher, ich könnte auch nicht die richtigen Module verwenden, aber das alte urllib2-Modul, das ich normalerweise dafür verwenden würde, wurde in verschiedene Module aufgeteilt, so dass ich lerne, wie ich mit diesen neuen Modulen gehe.

Bei der Behebung dieses Problems ist jede Hilfe hilfreich, auch wenn meine Interpretation von TypeErrors falsch ist, fühlen Sie sich frei, mich zu korrigieren.

+1

Anscheinend gibt 'urlopen' den Inhalt der Seite bereits zurück, nicht ein dateiähnliches Objekt, das man" lesen "kann. – ForceBru

+0

Wenn Sie nicht wirklich etwas anderes tun müssen, verwenden Sie ['requests'] (http://docs.python-requests.org/en/master/user/quickstart/) für diese Art von Dingen. – roganjosh

Antwort

0

urllib.request.urlopen gibt ein Objekt http.client.HTTPResponse zurück, und read dieses Objekts gibt ein codiertes Objekt bytes zurück. Wie zu decodieren kann in der zurückgegebenen HTTP-Header sein, oder in Ihrem Fall, in einem HTML-Code eingebettet meta. Wahrscheinlich möchten Sie den HTML-Code für diesen speziellen Test nicht analysieren, suchen Sie einfach nach dem bytes Objekt b'KEY'.

Ich weiß nicht, was Sie mit den Daten als nächstes tun wollen, aber wenn Sie möchten, dass es gut drucken oder scannen Sie das HTML, dann müssen Sie etwas analysieren.

import urllib.error 
import urllib.request 
import urllib.parse 
import urllib 
import sys 

while True: 
     about_page = urllib.request.urlopen("http://ctf.slothparadise.com/about.php").read() 
     if b"KEY" in about_page: 
      print(about_page) 
      sys.exit(0) 
1

Das durch urlopen zurückgegebene Objekt().() Gelesen acts like a context manager.

Sie verwenden es nicht richtig.

versuchen, etwas wie folgt aus:

import urllib.request 
while True: 
    with urllib.request.urlopen('http://ctf.slothparadise.com/about.php') as response: 
     html = response.read() 
     if b"KEY" in html: 
      print(html) 
      sys.exit(0) 
0

Machen about_page einen String mit

about_page=str(urllib.request.urlopen("http://ctf.slothparadise.com/about.php").read())

Dies sollte Ihr Code funktioniert. Hoffe das hilft!!