Cómo eludí la prohibición de la API de mensajes a través de la documentación de Vkontakte

Hola a toda la comunidad de Habro. Para mí, este primer artículo está escrito bajo cierta euforia, así que por favor no juzguen este artículo demasiado estrictamente por la parte literaria. Pero bueno, menos palabras y manos a la obra.

Cómo todo empezó


Todos sabemos que VC tiene una API, y estoy seguro de que la mayoría de la gente intentó usarla para sus propios fines. Personalmente, tengo muchos proyectos relacionados con él: piezas de 5 potentes bots, compilación de conjuntos de datos a gran escala de publicaciones grupales, etc. Y no es sorprendente que mis amigos me pidieron un par de veces descargar canciones de los archivos adjuntos del diálogo, fotos o guardar el texto de la correspondencia con alguna persona en un archivo separado.

Pero una vez que llegó "eso", y desde ese momento, la implementación de solicitudes tan pequeñas dejó de ser una tarea trivial:

imagen

y así, hace un par de días, para deshacerme de este problema de una vez por todas, decidí escribir mi contenedor a través de solicitudes http, pretendiendo ser un usuario regular, de modo que tener la misma herramienta poderosa que la API oficial para la sección de mensajes.

Vamos a ir al grano


Entonces, comencé con la autorización. Armado con el rastreador https y Firefox, pude seguir todos los "pasos" de autorización y obtener las cookies finales. De ahora en adelante, solo quedaba entender cómo se hacían las consultas. Se descubrió que la mayoría de los datos se reciben mediante una solicitud POST de https://vk.com/wkview.php , solo los parámetros para diferentes situaciones cambian cada vez. Logré escribir funciones para bombear absolutamente todo tipo de inversiones, pero no entraremos en detalles al respecto, porque en un momento todo cambió drásticamente.
Enlace al archivo para recibir cookies de autorización (lo escribí solo para la autenticación de dos factores, ya que le cuesta a la mayoría de las personas)

Descubrimiento inesperado


Estaba trabajando en una computadora portátil cuando un amigo se me acercó y me preguntó qué estaba haciendo. Como no podía explicarle todo el problema rápidamente con mis dedos, abrí la documentación oficial en la sección de mensajes y me quedé atónito cuando vi lo que está debajo de la descripción principal de estos métodos "prohibidos":

imagen

No, me entiendes correctamente, no soy el primero Solo ve esta oportunidad. Lo usé muchas veces con otros métodos, pero ni siquiera podía pensar que la función "solicitud de muestra" permanecería con los métodos de la sección de mensajes. Y aún más fuerte fue mi sorpresa cuando revolví el tráfico. Estas fueron solo solicitudes API normales, solo en el sitio, que solo tenían nombres de parámetros ligeramente diferentes en el formulario web y tenían algún tipo de hash-ID.

imagen

En unos minutos, me di cuenta de que el hash-ID es solo una cadena ubicada en el atributo de hash de datos de la etiqueta del botón, y después de un par de minutos ya estaba tratando de implementar la emulación de "solicitudes de prueba" y no creía completamente que funcionaría. Después de todo, seguro que estas solicitudes tienen algún tipo de límite en el número o algo así. Pero cuál fue mi sorpresa cuando este guión de 30 líneas (sin contar la recepción de cookies), que estaba escrito sobre mis rodillas, fue capaz de extraer mil quinientas imágenes de los archivos adjuntos de diálogo en 4 minutos.

imagen

Aplico el código usado
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)


Estaba tan impresionado que en este punto decidí enfriarme e intentar implementar algún otro método (de repente me equivoqué). Tomé el método de Historia y el resultado fue similar. Solo tuve que establecer un retraso de 0.1 segundos para que el servidor no diera un error sobre demasiadas solicitudes. (Si alguien repite, recuerde que al cambiar el método también debe cambiar la URL a la documentación, de donde provienen los datos hash). Es decir, este método realmente hizo posible acceder a la sección de mensajes a través de la documentación oficial, utilizando solo la contraseña y el inicio de sesión del usuario. Para mayor confiabilidad, intenté hacer los mismos pasos en otra cuenta y obtuve el mismo resultado.

Para resumir


Y, entonces, creo que todos ya se han dado cuenta de que esto es una violación en la protección de nuestros datos personales, que ha estado colgada en la documentación durante un año y no se sabe cuántas personas ya la han usado. Además, esta brecha es muy grande y debe cerrarse pronto. Y para demostrar una vez más que esto no debería funcionar de esta manera, citaré a los propios desarrolladores de VK:
Si planea comenzar a desarrollar un mensajero, después del 15 de febrero de 2019, necesitará obtener acceso de prueba en Soporte, lo que implica el trabajo de los métodos de la sección Mensajes con las claves de los administradores de su aplicación Independiente.

Es decir, incluso para obtener un token de una aplicación interna que tendrá acceso a la correspondencia del usuario, necesita un permiso personal de VK, y mucho menos acceder con una contraseña normal e iniciar sesión.

Mi opinión personal


La prohibición de la sección de mensajes no trajo ningún cambio fundamental a la seguridad de los usuarios. Él acaba de designar la frontera y aisló a un grupo de "infra-hackers" que, sin siquiera comprender lo que estaban haciendo, podían obtener acceso completo a los datos. Para el resto de las personas, más experimentadas en programación, obtener acceso a la correspondencia es solo cuestión de tiempo. Y en la primera parte del artículo, probé con mi propio ejemplo, después de haber creado un programa para extraer archivos adjuntos, que la aparición de una biblioteca que puede pretender ser un usuario está a la vuelta de la esquina. Tal vez yo mismo lo traiga al final, y los desarrolladores de VK necesitan estar preparados para esto y encontrar formas de reconocer la actividad del usuario demasiado sospechosa si la privacidad de nuestros datos es realmente importante para ellos.

PD
, ) , .

All Articles