Wie ich das Verbot der Nachrichten-API durch die Vkontakte-Dokumentation umgangen habe

Hallo an die gesamte Habro Community. Für mich ist dieser erste Artikel unter einer gewissen Euphorie geschrieben, also beurteilen Sie diesen Artikel bitte nicht zu streng für den literarischen Teil. Aber gut, weniger Worte und los geht's.

Wie alles begann


Wir alle wissen, dass VC über eine API verfügt, und ich bin sicher, dass die meisten Leute versucht haben, diese für ihre eigenen Zwecke zu verwenden. Persönlich habe ich viele Projekte im Zusammenhang damit: Teile von 5 leistungsstarken Bots, Zusammenstellung umfangreicher Datensätze aus Gruppenbeiträgen usw. Und es ist nicht verwunderlich, dass meine Freunde mich ein paar Mal gebeten haben, Songs aus den Anhängen des Dialogs und der Fotos herunterzuladen oder den Korrespondenztext mit einer Person in einer separaten Datei zu speichern.

Aber als „es“ kam und von diesem Moment an die Implementierung derart kleiner Anfragen keine triviale Aufgabe mehr war:

Bild

Um dieses Problem ein für alle Mal ein für alle Mal zu beseitigen, beschloss ich, meinen Wrapper über http-Anfragen zu schreiben und so zu tun, als wäre ich ein normaler Benutzer haben das gleiche leistungsstarke Tool wie die offizielle API für den Nachrichtenbereich.

Kommen wir zur Sache


Also habe ich mit der Autorisierung begonnen. Mit dem https-Sniffer und Firefox konnte ich alle „Schritte“ der Autorisierung durchlaufen und die endgültigen Cookies erhalten. Von nun an blieb nur noch zu verstehen, wie Abfragen gestellt wurden. Es wurde festgestellt, dass die meisten Daten durch eine POST-Anfrage von https://vk.com/wkview.php empfangen werden. Nur die Parameter für verschiedene Situationen ändern sich jedes Mal. Ich habe es geschafft, Funktionen zum Abpumpen absolut aller Arten von Investitionen zu schreiben, aber wir werden nicht auf Details eingehen, da sich in einem Moment alles dramatisch geändert hat.
Link zur Datei zum Empfangen von Autorisierungscookies (ich habe sie nur für die Zwei-Faktor-Authentifizierung geschrieben, da sie die meisten Menschen kostet)

Unerwartete Entdeckung


Ich arbeitete an einem Laptop, als ein Freund auf mich zukam und fragte, was ich mache. Da ich ihm das ganze Problem nicht schnell an meinen Fingern erklären konnte, öffnete ich die offizielle Dokumentation im Nachrichtenbereich und war fassungslos, als ich sah, was unter der Hauptbeschreibung dieser "verbotenen" Methoden steht:

Bild

Nein, Sie verstehen mich richtig, ich bin nicht der erste sehen Sie einfach diese Gelegenheit. Ich habe es viele Male mit anderen Methoden verwendet, aber ich konnte nicht einmal glauben, dass die Funktion "Beispielanforderung" bei den Methoden des Nachrichtenabschnitts verbleiben würde. Und noch stärker war meine Überraschung, als ich den Verkehr durcheinander brachte. Dies waren nur gewöhnliche API-Anfragen, nur auf der Site, die nur geringfügig unterschiedliche Parameternamen im Webformular hatten und eine Art Hash-ID hatten.

Bild

Innerhalb weniger Minuten wurde mir klar, dass die Hash-ID nur eine Zeichenfolge ist, die sich im Daten-Hash-Attribut des Button-Tags befindet. Nach einigen Minuten bemühte ich mich bereits, die Emulation von „Testanforderungen“ zu implementieren, und glaubte nicht vollständig, dass dies funktionieren würde. Schließlich haben diese Anfragen mit Sicherheit eine gewisse Begrenzung der Anzahl oder ähnliches. Aber was war meine Überraschung, als dieses Skript mit 30 Zeilen (ohne den Empfang von Cookies), das auf meinen Knien geschrieben war, in 4 Minuten eineinhalbtausend Bilder aus den Dialoganhängen herauspumpen konnte.

Bild

Ich wende den verwendeten Code an
import requests, pickle, re, json

with open('cookies_vk_auth.pickle', 'rb') as handle:
    cookies_final = pickle.load(handle)

session = requests.Session()
peer_id = int(input('  :  '))

response = session.get(f'https://vk.com/dev/messages.getHistoryAttachments', cookies=cookies_final)
hash_data =  re.findall(r'data-hash="(\S*)"', response.text)[0]

session = requests.Session()
response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)

count=20

for i in range(200):
    response_json = json.loads(json.loads(response.text[4:])['payload'][1][0])['response']['items']

    for photo in response_json:
        ph = photo['attachment']['photo']['sizes'][-1]['url']
        r = session.get(ph, timeout=10)
        
        if r.status_code == 200:
            with open(f'D://dev/'+str(ph.split('/')[-1]), 'wb') as f:
                f.write(r.content)

    m_id = photo['message_id']
    response = session.post(f'https://vk.com/dev',
            data=f'act=a_run_method&al=1&hash={hash_data}&method=messages.getHistoryAttachments&param_count=20&param_start_from={m_id}&param_max_forwards_level=45&param_media_type=photo&param_peer_id={peer_id}&param_photo_sizes=0&param_preserve_order=0&param_v=5.103', cookies=cookies_final)


Ich war so beeindruckt, dass ich mich zu diesem Zeitpunkt entschied, mich abzukühlen und zu versuchen, eine andere Methode zu implementieren (plötzlich habe ich mich nur geirrt). Ich habe die History-Methode übernommen und das Ergebnis war ähnlich. Nur musste ich eine Verzögerung von 0,1 Sekunden einstellen, damit der Server bei zu vielen Anfragen keinen Fehler gab. (Wenn sich jemand wiederholt, denken Sie bitte daran, dass Sie beim Ändern der Methode auch die URL der Dokumentation ändern müssen, aus der die Hash-Daten stammen.) Das heißt, diese Methode ermöglichte es wirklich, über die offizielle Dokumentation auf den Nachrichtenbereich zuzugreifen, wobei nur das Kennwort und die Benutzeranmeldung verwendet wurden. Aus Gründen der Zuverlässigkeit habe ich versucht, die gleichen Schritte für ein anderes Konto auszuführen, und das gleiche Ergebnis erzielt.

Zusammenfassen


Ich denke, jeder hat bereits erkannt, dass dies einen Verstoß gegen den Schutz unserer persönlichen Daten darstellt, der seit einem Jahr in der Dokumentation hängt, und es ist nicht bekannt, wie viele Personen ihn bereits verwendet haben. Darüber hinaus ist diese Lücke sehr groß und muss bald geschlossen werden. Und um noch einmal zu beweisen, dass dies nicht so funktionieren sollte, zitiere ich die VK-Entwickler selbst:
Wenn Sie nach dem 15. Februar 2019 mit der Entwicklung eines Messenger beginnen möchten, müssen Sie im Support einen Testzugriff erhalten, der die Arbeit der Methoden des Abschnitts Nachrichten mit den Schlüsseln der Administratoren Ihrer eigenständigen Anwendung impliziert.

Das heißt, selbst um ein Token der internen Anwendung zu erhalten, die Zugriff auf die Korrespondenz des Benutzers hat, benötigen Sie eine persönliche Erlaubnis der VK, geschweige denn den Zugriff mit einem normalen Kennwort und der Anmeldung.

Meine persönliche Meinung


Das Verbot des Nachrichtenbereichs hat die Sicherheit der Benutzer nicht grundlegend verändert. Er hat gerade die Grenze ausgewiesen und eine Gruppe von "Under-Hackern" abgeschnitten, die, ohne zu verstehen, was sie taten, vollen Zugriff auf die Daten erhalten konnten. Für den Rest der Programmierer ist es nur eine Frage der Zeit, Zugang zu Korrespondenz zu erhalten. Und im ersten Teil des Artikels habe ich anhand meines eigenen Beispiels, das ein Programm zum Abpumpen von Anhängen erstellt hat, bewiesen, dass die Entstehung einer Bibliothek, die sich als Benutzer ausgeben kann, nicht mehr weit ist. Vielleicht werde ich es selbst zum Ende bringen, und VK-Entwickler müssen darauf vorbereitet sein und Wege finden, um zu verdächtige Benutzeraktivitäten zu erkennen, wenn der Datenschutz unserer Daten für sie wirklich wichtig ist.

PS
, ) , .

All Articles