Так вышло, что мне стало интересно узнать, насколько безопасно публиковать приватное видео на вконтакте.ру Оказалось, что сейчас уровень защиты слабый.
Перед тем как исследовать чужие файлы, стоит изучить систему поближе, поэтому я закачал видеоролик на вконтакте, сделал его публичным, а урл на видео скормил сервису videosaver.ru. Сервис хороший, потому как любезно предоставил мне прямую ссылку на мой файл.
Далее, свое публичное видео я сделал крайне приватным (только для себя), и попробовал снова скачать файл напрямую с завершенной сессией. Ага, качается. Это значит, что сервера на раздаче видео не производят проверки на приватность (и правильно делают, потому как это надо делать в другом месте).
Ссылка на мой публичный, а ныне приватный ролик выглядит как:
551.gt3.vkadre.ru/assets/videos/08e8e26a100647241.vk.flv
в которой самая интересная часть — 08e8e26a100647241. Это явно хеш и вычислить его врядли получится, а значит необходимо найти этот хеш на сайте — в исходниках, в коментах, где угодно. Просмотр исходных кодов страниц со списком моего видео и при просмотре видео ничего не дало, но при этом видно, что thumbnail видеоролика генерируется скриптом:
vkadre.ru/get_thumbnail?vkid=100647241&vtag=08e8e26a&size=160
id ролика и прочее нас не интересует. Главное, что этот скрипт выдал нам прямой линк к картинке:
551.gt3.vkadre.ru/assets/thumbnails/08e8e26a100647241.160.vk.jpg
и да, вот он наш хеш (08e8e26a100647241), который мы наблюдали в ссылке на видео. Понятное дело, теперь можно связать любой thumbnail с частью полного пути к flv файлу.
Если название файла можно получить из названия картинки можно, то теперь необходимо достроить остальной путь — название сервера и субдиректории. Субдиректории все одинаковые и отличия в ссылках только в хостах. Вцелом, все ссылки на видео можно описать как
http://[0-9]+.gt(2|3).vkadre.ru/assets/videos/[0-9a-z]{,16}.vk.flv
Нас интересует часть до vkadre.ru, потому как с хешем все ясно. Предположив, что на выдаче видео 2000 серверов (с крутым запасом) сканируем все хосты xxx.gt2.vkadre.ru и xxx.gt3.vkadre.ru на предмет ip адреса, где xxx от 1 до 1000.
Оказалось, что у вконтакте около 250 серверов (уникальных ip) на выдачу видео (возможно также они хостят и аудио, не проверял). Имея эти 250 серверов делаем простой перебор на скачивания файла:
http://[айпиадрес из пула]/assets/videos/[хеш из картинки].vk.flv
Если файл физически не найден, сервер выдаст дефолтный flv ролик на 300 килобайт с какой-то стремной музыкой. То есть, любой файл отличный по размеру от дефолтного и есть искомый ролик, а файл находится не больше чем через ~250 запросов.
сделать проверку на доступ в скрипте /get_thumbnail.php и если прав нет, то показывать дефолтную картинку, мол тут дела личные и нечего смотреть превью. В дополнение к этому не стоит вообще показывать видео в списках, если его невозможно посмотреть.
update
Спасибо kabachok
более простой способ получения хеша
/get_thumbnail?vkid=100647241&vtag=08e8e26a&size=160 = 08e8e26a 100647241
это значит, что хеш впринципе публиковать нельзя.
Немного копнуть
Перед тем как исследовать чужие файлы, стоит изучить систему поближе, поэтому я закачал видеоролик на вконтакте, сделал его публичным, а урл на видео скормил сервису videosaver.ru. Сервис хороший, потому как любезно предоставил мне прямую ссылку на мой файл.
Далее, свое публичное видео я сделал крайне приватным (только для себя), и попробовал снова скачать файл напрямую с завершенной сессией. Ага, качается. Это значит, что сервера на раздаче видео не производят проверки на приватность (и правильно делают, потому как это надо делать в другом месте).
Thumbnail это все
Ссылка на мой публичный, а ныне приватный ролик выглядит как:
551.gt3.vkadre.ru/assets/videos/08e8e26a100647241.vk.flv
в которой самая интересная часть — 08e8e26a100647241. Это явно хеш и вычислить его врядли получится, а значит необходимо найти этот хеш на сайте — в исходниках, в коментах, где угодно. Просмотр исходных кодов страниц со списком моего видео и при просмотре видео ничего не дало, но при этом видно, что thumbnail видеоролика генерируется скриптом:
vkadre.ru/get_thumbnail?vkid=100647241&vtag=08e8e26a&size=160
id ролика и прочее нас не интересует. Главное, что этот скрипт выдал нам прямой линк к картинке:
551.gt3.vkadre.ru/assets/thumbnails/08e8e26a100647241.160.vk.jpg
и да, вот он наш хеш (08e8e26a100647241), который мы наблюдали в ссылке на видео. Понятное дело, теперь можно связать любой thumbnail с частью полного пути к flv файлу.
Путь к файлу
Если название файла можно получить из названия картинки можно, то теперь необходимо достроить остальной путь — название сервера и субдиректории. Субдиректории все одинаковые и отличия в ссылках только в хостах. Вцелом, все ссылки на видео можно описать как
http://[0-9]+.gt(2|3).vkadre.ru/assets/videos/[0-9a-z]{,16}.vk.flv
Нас интересует часть до vkadre.ru, потому как с хешем все ясно. Предположив, что на выдаче видео 2000 серверов (с крутым запасом) сканируем все хосты xxx.gt2.vkadre.ru и xxx.gt3.vkadre.ru на предмет ip адреса, где xxx от 1 до 1000.
Оказалось, что у вконтакте около 250 серверов (уникальных ip) на выдачу видео (возможно также они хостят и аудио, не проверял). Имея эти 250 серверов делаем простой перебор на скачивания файла:
http://[айпиадрес из пула]/assets/videos/[хеш из картинки].vk.flv
Если файл физически не найден, сервер выдаст дефолтный flv ролик на 300 килобайт с какой-то стремной музыкой. То есть, любой файл отличный по размеру от дефолтного и есть искомый ролик, а файл находится не больше чем через ~250 запросов.
Как это исправить
сделать проверку на доступ в скрипте /get_thumbnail.php и если прав нет, то показывать дефолтную картинку, мол тут дела личные и нечего смотреть превью. В дополнение к этому не стоит вообще показывать видео в списках, если его невозможно посмотреть.
update
Спасибо kabachok
более простой способ получения хеша
/get_thumbnail?vkid=100647241&vtag=08e8e26a&size=160 = 08e8e26a 100647241
это значит, что хеш впринципе публиковать нельзя.