Всем привет. Состоялся ежегодный PHD CTF и как всегда задания были очень классные и интересные! В этом году я решил сделать 4 задания.
Может показаться, что статья очень длинная – но скриншотов просто много.
многорок
Интересная PHP-песочница, окончательное решение которой, на мой взгляд, было проще найти на шаре, потому что она очень простая.Но чтобы прийти к нему, нужно было разобраться в том, что происходит. Я пришел к такому решению, сделав довольно длинный обходной путь.
Мне тоже не сразу пришло в голову погуглить монго рок, хотя перестановка букв была очевидна =) Изначально нам предоставляется URL-адрес, который возвращает небольшую подсказку о том, что делать дальше.
Сбор POST-запроса
Мы видим результат выполнения командыинформ().
Первое, что приходит на ум — это инъекция в команду, пробуем вставить кавычки, обратную косую черту, параметры в функцию информирования и изучаем поведение:
Видим какую-то ошибку.
Но если добавить ещё букву,
то в конце выпадает закрывающий php-тег, то есть инъекцией мы куда-то закрываем строку.
Погуглив, что написано заглавными буквами (T_ENCAPSED_AND_WHITESPACE) — понимаем, что это лексические токены PHP. Это говорит о том, что у нас есть песочница PHP, где токенизация ввода происходит перед выполнением кода.
При этом некоторые токены запрещены к использованию.
А т.к.
это песочница, то вектор инъекции скорее всего не тот. Теперь попробуем написать валидные запросы, которые будут пропущены.
Например вот так:
Мы видим, что в данном случае вывод произошел дважды, также мы видим, что разрешен токен T_CONSTANT_ENCAPSED_STRING (строка в кавычках), это оказалось критически важно.
В общем, здесь всё можно было бы решить, если бы я знал, что PHP позволяет делать ТАКИЕ вещи =) Но я не знал.
Поэтому далее я взял полный список токенов PHP ( здесь ) и запустил их в Intrumer, чтобы понять, какие из них разрешены.
Тогда я решил погуглить «mongo rock» и нашел код песочницы, который использовался для выполнения задачи.
Его, конечно, немного изменили под задачу, но логику прочитать не помешает (Заодно сравните реальный код с псевдокодом в голове, который я скомпилировал, изучая поведение программы с черным ящиком) github.com/iwind/rockmongo/blob/939017a6b4d0b6eb488288d362ed07744e3163d3/app/classes/VarEval.php Давайте посмотрим на функцию, которая выполняет токенизацию перед оценочным кодом.
Переменная $php представляет собой объединение строк, отсюда разрыв строки и закрывающий тег в приведенном выше примере, когда мы вставили information()''A. Далее идут 2 проверки, первая проверяет, что токен включен в список разрешенных:private function _runPHP() { $this->_source = "return " .
$this->_source .
";"; if (function_exists("token_get_all")) {//tokenizer extension may be disabled $php = "<Эphp\n" .
$this->_source .
"\n?>"; $tokens = token_get_all($php);
if (in_array($type, array(
T_OPEN_TAG,
T_RETURN,
T_WHITESPACE,
и во-вторых, токены T_STRING имеют действительные значения:
if ($type == T_STRING) {
$func = strtolower($token[1]);
if (in_array($func, array(
//keywords allowed
Теги: #php #Nginx #ctf #pwn #security #информационная безопасность #ctf
-
Нервная Анорексия
19 Oct, 24 -
Bad Manager – Инструкция По Эксплуатации
19 Oct, 24 -
Еще Одна Битва С Веб-Вирусами
19 Oct, 24 -
Этапы Оптимизации И Развития Клиента
19 Oct, 24 -
Почему Я Не Покупаю Квартиру В Кредит?
19 Oct, 24 -
Выпуск Джанго 1.9
19 Oct, 24