Добро пожаловать в наш практический лабораторный курс! Сегодня мы сосредоточимся на распространенной проблеме: уязвимостях при загрузке файлов. Наша задача - разобраться в этой часто недооцененной и непонятной слабой точке. Мы разберём принципы, лежащие в основе этих уязвимостей, чтобы сделать их простыми для понимания. Затем мы примемся за дело и научимся эффективно использовать эти уязвимости, предоставив вам знания для выявления и устранения таких проблем в реальных приложениях. Давайте начнём это увлекательное путешествие в мир веб - безопасности!
Skills Graph
%%%%{init: {'theme':'neutral'}}%%%%
flowchart RL
nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"])
nmap/NmapGroup -.-> nmap/firewall_evasion("Firewall Evasion Techniques")
subgraph Lab Skills
nmap/firewall_evasion -.-> lab-416154{{"Эксплуатация уязвимостей загрузки файлов с помощью Nmap"}}
end
Понимание уязвимости при загрузке файлов
Ладно, друзья! Пристегните ремни, потому что мы собираемся погрузиться в увлекательный мир уязвимостей при загрузке файлов. Теперь представьте, что вы на вечеринке и там есть гардероб. Вы отдаёте им свою куртку (или костюм динозавра, если вы такой вечеринщик), они дают вам талон, и вы ожидаете, что в конце вечера получите свою вещь обратно, верно? Ну, веб - приложения часто работают аналогично, принимая файлы, такие как изображения, документы и тому подобное.
Но что, если кто - то подсовывает в гардероб ёжика вместо куртки? Вот тут-то и начинаются проблемы! Если наше веб - приложение, как несчастный, не подозревающий сотрудник гардероба, не проверяет "куртку" (то есть содержимое и тип файла) должным образом, атакующий может подсунуть что - то вредоносное. Это может быть веб - шелл (web shell), особый вид вредоносного файла, который, будучи выполненным, даёт ему контроль над сервером - как если бы дать человеку с контроллером над ёжиком ключи от гардероба!
Теперь поговорим о PHP, популярном языке для веб - разработки. В PHP есть функция move_uploaded_file(), которая похожа на то, как сотрудник гардероба перемещает вашу куртку на вешалку. Вот как она работает:
<?php
// Эта функция перемещает загруженный файл в новое место. Если это удаётся, она даёт знак "ок" (возвращает true). Если нет, то "не ок" (возвращает false).
move_uploaded_file($file, $newloc);
$file: "Куртка" (или ёжик), которую нужно переместить
$newloc: Вещалка, где мы храним "куртку"
Вот в чём подвох: функция move_uploaded_file() похожа на очень доверчивого сотрудника гардероба - она не проверяет "куртку". Поэтому нам нужно написать дополнительный код для валидации, вот так:
Если приложение не имеет надлежащего "контроля гардероба" (валидации) или если валидацию можно обмануть, мы можем столкнуться с уязвимостью при загрузке файлов. И никто не хочет, чтобы в его гардеробе оказался ёжик, верно? Поэтому давайте научимся избегать этого!
Определение серверного языка
На этом этапе все сводится к настройке нашей лабораторной среды и обучению определению серверного языка веб - приложения. Почему это нужно, спросите вы? Ну, знание языка помогает нам определить правильный тип файла для загрузки. Это похоже на то, чтобы знать, какой словарь - французский, испанский или суахили - взять на вечеринку по обмену языками!
Сначала мы настроим нашу лабораторную среду. Представьте, что вы готовите место для вечеринки. Вот волшебная команда:
Далее мы научим вас быть детективами по языкам. Вот ваши подсказки:
Расширение файла в URL:
Встретили .php в URL? Скорее всего, используется PHP, поэтому попробуйте загрузить файл - шелл с расширением .php.
Тип веб - сервера:
Если веб - сервер - это Microsoft IIS, то, вероятно, используется ASP.NET. Попробуйте загрузить файл - шелл с расширением .asp или .aspx.
Если сервер - это Nginx или Apache, то, скорее всего, используется PHP. Попробуйте загрузить файл - шелл с расширением .php.
Если сервер - это Tomcat, то, вероятно, используется JSP. Попробуйте загрузить файл - шелл с расширением .jsp.
Для упрощения всего этого вы можете использовать расширение для браузера Wappalyzer. Это как многоязычный друг, который может определить тип веб - сервера, серверный язык и фреймворки, используемые на веб - сайте.
После установки расширения просто нажмите на него, чтобы автоматически определить информацию о веб - сайте. Это как если бы у вас был гость на вечеринке, который сразу мог сказать, на каком языке говорит каждый!
В нашем примере ниже наше полезное расширение успешно определило веб - сервер Apache и язык программирования PHP, используемые в нашей лабораторной среде:
Web Server: Apache
Backend Language: PHP
Загрузка правильного веб - шелла
На этом этапе, друзья, все о действиях! Мы собираемся загрузить веб - шелл, особый тип файла, который позволяет нам взаимодействовать с сервером. Это как если бы вы подкрадывались на вечеринку с обученным попугаем, который может шептать нам секреты сервера. Поскольку наша "вечеринка" (а точнее, наша лабораторная среда) "говорит" на PHP, нам понадобится файл - шелл с расширением .php.
Вы можете найти настоящий клад веб - шеллов здесь:
Давайте начнем с простого файла phpinfo.php, который находится в директории /home/labex/project. Это как если бы вы спросили сервер: "Привет, расскажи мне все о себе!" Вот как создать и загрузить его:
<?php phpinfo();?>
Вы можете перейти по адресу http://localhost:82/upload/example1.php для загрузки файла.
После загрузки попробуйте открыть файл:
http://localhost:82/upload/images/phpinfo.php
Вы увидите следующее содержимое:
Если все пройдет хорошо, вы должны увидеть кучу информации о PHP. Это как если бы сервер раскрыл вам свою жизнь!
Далее давайте попробуем однострочный веб - шелл на PHP shell.php, который находится в директории /home/labex/project:
<?php echo "Shell"; system($_GET['cmd']);?>
Эта маленькая магия PHP выполнит любую системную команду, которую мы передадим через параметр cmd в GET - запросе.
Загрузите shell.php и попробуйте получить доступ к нему:
http://localhost:82/upload/images/shell.php
Вы, возможно, увидите сообщение Warning, потому что мы еще не передали параметр cmd. Это как если бы наш попугай сказал: "Эй, ты забыл сказать мне, что сказать!" Давайте дайте ему команду.
Чтобы узнать, кто является текущим пользователем, используйте:
Вы также можете заставить своего попугая прочитать целую поэму (выполнить несколько команд), например, вывести список файлов в текущей директории и проверить информацию об операционной системе:
Поздравляем! Теперь вы можете заставить сервер раскрыть свои секреты.
Теперь, если вы хотите углубиться в эту тему, вы можете:
Использовать инструменты, такие как nc или bash, чтобы получить обратный шелл на своей локальной машине.
Использовать инструменты, такие как "Cknife", "AntSword" или "Behinder", чтобы получить веб - шелл.
Если шелл, который вы получили, не имеет привилегий root или администратора, вам, возможно, придется повысить привилегии. Вы можете обратиться к курсу "Penetration Testing Methodology: Linux Privilege Escalation" для получения более подробной информации.
Но так как это курс "Основы", мы оставим эти приключения для наших более продвинутых курсов. Пока же давайте отпразднуем нашу успешную эксплойтацию уязвимости загрузки файлов!
Обход ограничений сервера (опционально)
В этом опциональном этапе, для тех из вас, кто любит вызовы, мы рассмотрим обход ограничений сервера. Это как если бы сервер был дверным охранником, который пропускает на вечеринку только гостей с определенными шляпами (или расширениями файлов). Но что, если мы можем обмануть охранника и заставить его пропустить гостей с другими шляпами?
Иногда сервер может не позволить нам загрузить файлы с определенными расширениями, например, .php. В таких случаях мы можем попробовать загрузить файлы с другими расширениями, которые сервер все еще может проанализировать и выполнить.
Например, давайте попробуем загрузить phpinfo.php3:
http://localhost:82/upload/example2.php
Если загрузка прошла успешно, попробуйте открыть файл:
http://localhost:82/upload/images/phpinfo.php3
Если файл не выполняется, это как если бы охранник не поверил в наш трюк с шляпой. Поэтому мы меняем шляпу и пробуем расширение .phar:
http://localhost:82/upload/images/phpinfo.phar
Если файл с расширением .phar успешно выполняется, это как если бы охранник пропустил нашего гостя! Теперь вы можете продолжить использовать ту же методику эксплойта, которую мы применяли на предыдущих этапах.
Помните, это игра на смекалку и креативность. Существует больше методов обхода ограничений сервера, и мы рассмотрим их в наших продвинутых курсах. Пока же наслаждайтесь успешным обходом охранника... я имею в виду, ограничений сервера!
Резюме
В этой лабораторной работе мы изучили уязвимость при загрузке файлов, одну из наиболее распространенных уязвимостей в веб - приложениях. Мы узнали принципы, лежащие в основе уязвимостей при загрузке файлов, как определить серверный язык, используемый приложением, и как загрузить подходящий веб - шелл для получения контроля над сервером.
Основные выводы из этой лабораторной работы:
Понимание концепции уязвимости при загрузке файлов и ее потенциального воздействия.
Определение серверного языка, используемого веб - приложением, для определения подходящего типа файла для загрузки.
Загрузка и выполнение веб - шеллов для получения контроля над сервером.
Техники обхода ограничений сервера на расширения файлов (опционально).
Эта лабораторная работа дала прочный фундамент для понимания и эксплойтации уязвимостей при загрузке файлов. Однако существуют более продвинутые техники и концепции, которые будут рассмотрены в будущих курсах.