Разбираем вторую задачку из нашего соревнования CTF. Задание называется pinger, 100 баллов за флаг.
Ссылка ведёт на URL:
http://challenge01.root-me.org/web-serveur/ch54/
Нам предлагают пройти одно из испытаний на root-me.org.
Ссылки
Решение
Сразу скажу, задачка на эксплуатацию уязвимости из разряда Command injection.
Command injection — внедрение команд ОС. Выполнение несанкционированных команд операционной системы на удалённом сервере через уязвимое веб-приложение.
Что нам предлагают. У нас есть форма. Вводим адрес и пингуем его. Результат выводится на экран. Для теста пинганём localhost.
Видим, что возвращается результат, похож на результат пинга в Llinux. Да что там похож, он и есть. Вероятно выполняется код "ping x". Если так, то мы можем попробовать добавить в конец свою команду, если вводимые данные не валидируются.
Попробуем пингануть такое:
localhost; cat /etc/passwd
Да, уязвимость налицо. Мы можем выполнить любую команду bash Linux через эту форму. Осталось найти флаг. Смотрим что у нас лежит в корне сайта:
127.0.0.1; ls
Видим только один файл index.php. Заглянем в него. Вообще, выполнять несколько команд можно разными способами:
localhost; cat index.php
localhost&&cat index.php
localhost|(cat index.php)
Я проверил, работают все.
Вывели содержимое файла index.php. Посмотрим в текстовом виде на код страницы:
А вот и наш флаг, он задан в виде переменной: $flag.
Безопасность
- Проверяйте переменные переданные пользователем. В данной задаче достаточно валидировать IP адрес или доменное имя, это уже исключит инъекцию.
- Пинговать лучше не с помощью команд ОС. Пример Ping.