Описание Задач Positive Hack Days Ctf 2018: Mnogorock, Sincity, Wowuchchain, Event0

Всем привет. Состоялся ежегодный PHD CTF и как всегда задания были очень классные и интересные! В этом году я решил сделать 4 задания.

Может показаться, что статья очень длинная – но скриншотов просто много.



многорок

Интересная PHP-песочница, окончательное решение которой, на мой взгляд, было проще найти на шаре, потому что она очень простая.

Но чтобы прийти к нему, нужно было разобраться в том, что происходит. Я пришел к такому решению, сделав довольно длинный обходной путь.

Мне тоже не сразу пришло в голову погуглить монго рок, хотя перестановка букв была очевидна =) Изначально нам предоставляется URL-адрес, который возвращает небольшую подсказку о том, что делать дальше.



Описание задач Positive Hack Days CTF 2018: mnogorock, sincity, wowuchchain, event0

Сбор POST-запроса

Описание задач Positive Hack Days CTF 2018: mnogorock, sincity, wowuchchain, event0

Мы видим результат выполнения командыинформ().

Первое, что приходит на ум — это инъекция в команду, пробуем вставить кавычки, обратную косую черту, параметры в функцию информирования и изучаем поведение:

Описание задач Positive Hack Days CTF 2018: mnogorock, sincity, wowuchchain, event0



Описание задач Positive Hack Days CTF 2018: mnogorock, sincity, wowuchchain, event0

Видим какую-то ошибку.

Но если добавить ещё букву,

Описание задач Positive Hack Days CTF 2018: mnogorock, sincity, wowuchchain, event0

то в конце выпадает закрывающий php-тег, то есть инъекцией мы куда-то закрываем строку.

Погуглив, что написано заглавными буквами (T_ENCAPSED_AND_WHITESPACE) — понимаем, что это лексические токены PHP. Это говорит о том, что у нас есть песочница PHP, где токенизация ввода происходит перед выполнением кода.

При этом некоторые токены запрещены к использованию.

А т.к.

это песочница, то вектор инъекции скорее всего не тот. Теперь попробуем написать валидные запросы, которые будут пропущены.

Например вот так:

Описание задач Positive Hack Days CTF 2018: mnogorock, sincity, wowuchchain, event0

Мы видим, что в данном случае вывод произошел дважды, также мы видим, что разрешен токен T_CONSTANT_ENCAPSED_STRING (строка в кавычках), это оказалось критически важно.

В общем, здесь всё можно было бы решить, если бы я знал, что PHP позволяет делать ТАКИЕ вещи =) Но я не знал.

Поэтому далее я взял полный список токенов PHP ( здесь ) и запустил их в Intrumer, чтобы понять, какие из них разрешены.

Тогда я решил погуглить «mongo rock» и нашел код песочницы, который использовался для выполнения задачи.

Его, конечно, немного изменили под задачу, но логику прочитать не помешает (Заодно сравните реальный код с псевдокодом в голове, который я скомпилировал, изучая поведение программы с черным ящиком) github.com/iwind/rockmongo/blob/939017a6b4d0b6eb488288d362ed07744e3163d3/app/classes/VarEval.php Давайте посмотрим на функцию, которая выполняет токенизацию перед оценочным кодом.

  
  
   

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);

Переменная $php представляет собой объединение строк, отсюда разрыв строки и закрывающий тег в приведенном выше примере, когда мы вставили information()''A. Далее идут 2 проверки, первая проверяет, что токен включен в список разрешенных:

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
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.