Comment j'ai contourné l'interdiction de l'API Messages via la documentation de Vkontakte

Bonjour à toute la communauté Habro. Pour moi, ce premier article est écrit sous une certaine euphorie, alors ne jugez pas cet article trop strictement pour la partie littéraire. Mais bon, moins de mots et passez aux choses sérieuses.

Comment tout a commencé


Nous savons tous que VC possède une API, et je suis sûr que la plupart des gens ont essayé de l'utiliser à leurs propres fins. Personnellement, j'ai beaucoup de projets liés à cela: des morceaux de 5 robots puissants, la compilation de jeux de données à grande échelle à partir de publications de groupe, etc. Et il n'est pas surprenant que mes amis m'aient demandé à quelques reprises de télécharger des chansons à partir des pièces jointes du dialogue, des photos ou d'enregistrer le texte de la correspondance avec une personne dans un fichier séparé.

Mais une fois que «ça» est arrivé, et à partir de ce moment, la mise en œuvre de ces petites requêtes a cessé d'être une tâche triviale:

image

Et donc, il y a quelques jours, pour me débarrasser de ce problème une fois pour toutes, j'ai décidé d'écrire mon wrapper via des requêtes http, faisant semblant d'être un utilisateur régulier, de sorte que avoir le même outil puissant que l'API officielle pour la section des messages.

Nous allons passer aux choses sérieuses


J'ai donc commencé avec une autorisation. Armé du renifleur https et de Firefox, j'ai pu passer par toutes les «étapes» d'autorisation et obtenir les cookies finaux. Désormais, il ne restait plus qu'à comprendre comment les requêtes étaient faites. Il a été constaté que la plupart des données sont reçues par une demande POST de https://vk.com/wkview.php , seuls les paramètres des différentes situations changent à chaque fois. J'ai réussi à écrire des fonctions pour pomper absolument tous les types d'investissements, mais nous n'entrerons pas dans les détails, car à un moment tout a radicalement changé.
Lien vers le fichier pour recevoir les cookies d'autorisation (je l'ai écrit uniquement pour l'authentification à deux facteurs, car cela coûte la plupart des gens)

Découverte inattendue


Je travaillais sur un ordinateur portable lorsqu'un ami est venu me voir et m'a demandé ce que je faisais. Comme je ne pouvais pas lui expliquer rapidement tout le problème sur mes doigts, j'ai ouvert la documentation officielle sur la section des messages, et j'ai été stupéfait quand j'ai vu ce qui est sous la description principale de ces méthodes "interdites":

image

Non, vous me comprenez bien, je ne suis pas le premier il suffit de voir cette opportunité. Je l'ai utilisé plusieurs fois avec d'autres méthodes, mais je ne pouvais même pas penser que la fonction "exemple de demande" resterait avec les méthodes de la section des messages. Et encore plus fort a été ma surprise quand j'ai brouillé le trafic. Ce n'étaient que des demandes d'API ordinaires, uniquement sur le site, qui n'avaient que des noms de paramètres légèrement différents dans le formulaire Web et avaient une sorte d'ID de hachage.

image

En quelques minutes, j'ai réalisé que l'ID de hachage n'est qu'une chaîne située dans l'attribut de hachage de données de la balise de bouton, et après quelques minutes, j'essayais déjà de mettre en œuvre l'émulation des «demandes de test» et je ne croyais pas complètement que cela fonctionnerait. Après tout, bien sûr, ces demandes ont une sorte de limite sur le nombre ou quelque chose comme ça. Mais quelle n'a pas été ma surprise quand ce script de 30 lignes (sans compter la réception des cookies), qui était écrit sur mes genoux, a pu pomper mille et un millier de photos des pièces jointes du dialogue en 4 minutes.

image

J'applique le code utilisé
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)


J'étais tellement impressionné qu'à ce stade, j'ai décidé de me calmer et d'essayer de mettre en œuvre une autre méthode (tout d'un coup, je me suis trompé). J'ai repris la méthode History et le résultat était similaire. Seulement, j'ai dû définir un délai de 0,1 seconde pour que le serveur ne donne pas d'erreur sur trop de requêtes. (Si quelqu'un répète, n'oubliez pas que lorsque vous modifiez la méthode, vous devez également modifier l'URL de la documentation, d'où proviennent les données de hachage). Autrement dit, cette méthode a vraiment permis d'accéder à la section des messages via la documentation officielle, en utilisant uniquement le mot de passe et la connexion utilisateur. Pour plus de fiabilité, j'ai essayé de faire les mêmes étapes sur un autre compte et j'ai obtenu le même résultat.

Résumer


Et donc, je pense que tout le monde a déjà réalisé qu'il s'agit d'une violation de la protection de nos données personnelles, qui est suspendue dans la documentation depuis un an et on ne sait pas combien de personnes l'ont déjà utilisée. De plus, cet écart est très important et doit être comblé prochainement. Et pour prouver une fois de plus que cela ne devrait pas fonctionner de cette façon, je citerai les développeurs VK eux-mêmes:
Si vous prévoyez de commencer à développer un messager, après le 15 février 2019, vous devrez obtenir un accès test dans Support, ce qui implique le travail des méthodes de la section Messages avec les clés des administrateurs de votre application autonome.

Autrement dit, même pour obtenir un jeton d'une application interne qui aura accès à la correspondance de l'utilisateur, vous avez besoin d'une autorisation personnelle de VK, et encore moins d'un accès avec un mot de passe et une connexion normaux.

Mon opinion personnelle


L'interdiction de la section des messages n'a apporté aucun changement fondamental à la sécurité des utilisateurs. Il vient de désigner la frontière et de couper un groupe de "sous-hackers" qui, sans même comprendre ce qu'ils faisaient, pourraient avoir un accès complet aux données. Pour le reste des gens, plus expérimentés en programmation, accéder à la correspondance n'est qu'une question de temps. Et dans la première partie de l'article, j'ai prouvé par mon propre exemple, après avoir créé un programme de pompage de pièces jointes, que l'émergence d'une bibliothèque qui peut prétendre être un utilisateur n'est pas loin. Peut-être que j'y arriverai moi-même jusqu'à la fin, et les développeurs VK doivent être préparés à cela et trouver des moyens de reconnaître une activité utilisateur trop suspecte si la confidentialité de nos données est vraiment importante pour eux.

PS
, ) , .

All Articles