Пользователь
0,0
рейтинг
7 октября 2013 в 19:03

Разработка → Воруй-убивай, пиши-качай

В январе этого года в одном из сервисов ICQ была найдена уязвимость. Она была связана с доступом к файлам, которые когда-то пользователи передавали друг-другу. Уязвимость устранили, но такие ситуации отнюдь не уникальные.
Ниже мы рассмотрим еще один сервис, предназначенный для файлообмена между пользователями.
image

Сегодня один из заказчиков прислал мне ТЗ используя сайт droplr.com. Сервис действительно удобный. Я не пользуюсь всякими дропбоксами и подобными просто из-за низкой скорости интернета. Но данный сервис мне понравился, всё достаточно удобно, интерфейс, клиенты под различные платформы, но самое главное — можно качать чужие файлы.
Когда я перешел по ссылке от заказчика, стало ясно, что на droplr используется сокращатель ссылок. В результате страница для загрузки файла имеет примерно такой вид: d.pr[a-z]{1}/[A-z0-9]{4}

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

Вторая последовательность длиной в 4 символа может состоять из строчных, прописных латинских символов и цифр.
Учитывая, что сервисом пользуется огромная масса народа, можно предположить, что при брутфорсе второго параметра мы будем часто натыкаться на чужие файлы, ведь общее число возможных вариантов — 14776336.

Обычно, подобные задачи я пишу на PHP или голом BASH, там есть всё что нужно, прямо из коробки. Но нужно развиваться, поэтому решил остановиться на Python, поскольку некоторый опыт работы с ним уже есть.

Судя по задаче нам необходимо как-то обращаться к сервису, в Python для этого есть много реализаций и интерфейсов, я решил остановиться на requests, поскольку эта библиотека обладает всеми требованиями, которые нам необходимы.

В случае, если у вас стоит pip, то установка займет всего несколько секунд.

pip install requests

Для парсинга страницы существует мощная библиотека под названием BeautifulSoup. Установка через pip тоже элементарна.
pip install beautifulsoup4

Скачать скрипт можно на GitHub.

Как я и думал, после первых 5 минут работы было найдено порядка 10 изображений с персональными данными, да еще какими!


Админка сайте, включая некоторые данные о юзерах.


А вот и номера телефонов

image
Один день из жизни LR.


Из разряда, на друг, покупай за мой счёт.

Думаю этого достаточно для демонстрации 5 минут работы скрипта.
Будьте бдительны, не публикуйте персональные и тем более платежные данные в сети.

Некоторые особенности


На сайте нет абсолютно никаких проверок на бота. Нам даже юзер агента отсылать не нужно. Естественно никакого бана за множественные запросы не следует.
Прямая ссылка на файл живет около минуты, новую ссылку можно получить только после посещения страницы скачивания файла.
Примерно 80% рандомных ссылок указывают на файлы.

UP #1 пользователь lybin добавил поддержку многопоточности.
UP #2 больше нет HEAD запроса, всё в одном GET, добавлен User Agent, Referer и таймаут.
Джамбулат @akamajoris
карма
11,0
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (19)

  • +24
    На файлообменке можно скачать чужой файл? Вот это уязвимость!
    Вы сравнили передачу файлов в ICQ(пользователь-пользователь) и обычную шарилку контента(пользователь-весь интернет). Да, владельцы dropl могли сделать ограничение на дамп файлов, но о приватности своих данных должен заботиться конкретный юзер, через подобные сервисы приватную дату передают люди не большого ума.
    • 0
      Понимаете, сервис в большинстве случаем используется для быстрого постинга скриншота. Соответственно разработчики могли бы усложнить процесс генерации ссылок, например на YouTube используется длина идентификатора равная 11 символов, включая некоторые спец. символы, причем видео нужно явно загружать, а тут нажал на 1 кнопку и скриншот на котором могут быть «интересные данные» уже в сети.
      • +2
        Это скорее «фича» сервиса, которую они воспринимают как конкурентное преимущество.
        We'll give you a short link where your friends, family, and co-workers can view or save it.

        Я вас прекрасно понимаю, но если юзер шарит скриншоты с личными данными на подобных сервисах, то все последствия — эго проблемы. Для таких на микроволновках пишут «не засовывайте в аппарат свои конечности».
        Парсингом подобных сервисов мало кого можно удивить.
      • +2
        И кстати, в PRO версии есть:

        Так что, это политика компании, скорее всего.
        • 0
          Вполне логично, что в бесплатной версии коммерческого продукта нет поддержки приватности)
      • 0
        сервис в большинстве случаем используется для быстрого постинга скриншота

        Линуховый Enlightenment имеет встроенную пОстилку скриншотов с генерацией уникальной ссылки, но это не помешало им забабахать целый сервис скриншотов пользователей с удобной постраничной навигацией.
  • 0
    Неплохо.
    Посмотрите на это: habrahabr.ru/post/149330/
    Там автор проект на битбакете сделал можете отправить пулл реквест.
  • 0
    Один день из жизни LR.

    я уж подумал, что либа ожила, т.к. дата перевода месячной давности)
    • –1
      Аналогично, но у них видимо даты идут в формате ММ/ДД/ГГГГ
  • 0
    По-моему, это не имеет смысла, простой перебор id'шников, своим действием Вы лишь привлекли внимание толпы, таким образом может пострадать кто-то. Имхо.
  • +18
    Собственно, это не баг, это фича бизнес-стратегия:

    image

    За «hard to guess URLs» они просят $6 в месяц. И даже предупреждают об этом. И даже на главной странице проекта. Вдумчивый читатель может даже сообразить, что обычные адреса у них easy to guess.

    Но, по мне, бить надо сервисы с такими фичами по лицу лопатой.
  • +4
    Добавим многопоточности:

    privatepaste.com/64600f88c2
    • +1
      P.S. За 5 сек добавил треды и обернул в исключения чтобы не выпадали, ошибки в логе так что норм, не стал разбираться.
    • +2
      v2. privatepaste.com/5542256242
      Ничего интересного, в основном скриншоты, может кому повезет :)
  • +2
    ~ curl -I http://d.pr/hello
    HTTP/1.1 502 Bad Gateway
    Content-length: 3200
    Content-Type: text/html
    Date: Mon, 07 Oct 2013 20:27:47 GMT
    ETag: "5240c159-c80"
    Server: nginx/1.4.1
    Connection: keep-alive
    
  • +1
    А не будет ли эффективней использовать перебор вместо рандома? Разбить таск на несколько тредов, у каждого — свой диапазон. Мне кажется, так будет быстрее работать.
  • +1
    Штука прикольная но ответ от сервера стал приходить 429, после того как убрал head и добавил user-agent стал работать лучше, по какой-то причине стал ругаться на
    o=open(dir + unicodedata.normalize('NFKD', imgalt.replace(":","_").replace("\\","_").replace("/","_")).encode('utf-8','ignore'), 'wb')
    изменил код на
    import urllib ... urllib.urlretrieve(imgsrc, dir+imgalt)
    Теперь работает.
  • +1

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