HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости > Уязвимости CMS / форумов
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 27.03.2015, 11:35
BigBear
Новичок
Регистрация: 04.12.2008
Сообщений: 11
С нами: 9176038

Репутация: 8
По умолчанию

[SIZE="2"][COLOR="Lime"][B]WordPress 2.*


">



" />

.......................
[/CODE]
./wp-admin/includes/class-pclzip.php

Код:
.................................

function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
  {
    $v_result=1;
    $v_list_detail = array();

    // ----- Look if the archive exists or is empty
    if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
    {

     .....................................................................

    // ----- Open the zip file
    if (($v_result=$this->privOpenFd('rb')) != 1)
    {
     .....................................................................

    // ----- Creates a temporay file
    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';

    // ----- Open the temporary file in write mode
    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
    {
      $this->privCloseFd();
      $this->privSwapBackMagicQuotes();

      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Copy the files from the archive to the temporary file
    // TBC : Here I should better append the file and go back to erase the central dir
    $v_size = $v_central_dir['offset'];
    while ($v_size != 0)
    {
      $v_read_size = ($v_size zip_fd, $v_read_size);
      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
      $v_size -= $v_read_size;
    }

   ...........................................................

    // ----- Create the central dir footer
    if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
    {
      // ----- Reset the file list
      unset($v_header_list);
      $this->privSwapBackMagicQuotes();

      // ----- Return
      return $v_result;
    }

    // ----- Swap back the file descriptor
    $v_swap = $this->zip_fd;
    $this->zip_fd = $v_zip_temp_fd;
    $v_zip_temp_fd = $v_swap;

    // ----- Close
    $this->privCloseFd();

    // ----- Close the temporary file
    @fclose($v_zip_temp_fd);

    // ----- Magic quotes trick
    $this->privSwapBackMagicQuotes();

    // ----- Delete the zip file
    // TBC : I should test the result ...
    @unlink($this->zipname);

    // ----- Rename the temporary file
    // TBC : I should test the result ...
    //@rename($v_zip_temp_name, $this->zipname);
    PclZipUtilRename($v_zip_temp_name, $this->zipname);

    // ----- Return
    return $v_result;
  }
Ну или вкратце: загружаемый zip архив открывается, парсится, распаковывается и удаляется.

Все действия - в порядке вещей.

Если мы попробуем вместо .zip подсунуть .php файл, он тоже будет подвергаться всем этим действиям, и в итоге - удалится.

При попытке загрузить шелл-код на сервер, я столкнулся с проблемой0.233 секунд - этого времени явно маловато для последовательной загрузки аплоадера и затем самого шелл-кода.

Однако, если пропихнуть в аплоадер что-нибудь для веса - время парсинга можно увеличить до рекордных1.363 секунд. (тут я рассматриваю стандартную конфигурацию сервера, а конкретно Denwer сборку).

Значит вручную это будет делать тяжело, пишем скрипт.

В итоге родился такой концепт (это бета-версия)

script.php

Код:

Up.php

Код:

Как это работает:

Скрипт авторизуется в WordPress, заливает uploader в ./wp-content/uploads и отправляет аплоадеру запрос на загрузку шелл кода, пока аплоадер ещё не удалён.

Какие проблемы:

1) Запрос к аплоадеру отправляется слишком поздно, на localhost загрузка идёт раз через раз. Нужно использовать multi-exec.

2) Хорошо бы вместо аплоадера использовать конструкцию типа cp('./wp-content/uploads/image.jpg','./wp-content/uploads/shell.php').

Эта конструкция лучше, так как менее временизатратная, вы просто стандартным MediaManager аплоадите картинку с шеллом, а наш скрипт её переименуют и переместит. Можно успеть уложиться в отведённое время.

Заключение:

Скрипт пока ещё будет дописываться, концепт показал. Коллеги, может будут какие-нибудь предложения по увеличению времени жизни загружаемого аплоадера?
 
Ответить с цитированием

  #2  
Старый 27.03.2015, 13:38
BigBear
Новичок
Регистрация: 04.12.2008
Сообщений: 11
С нами: 9176038

Репутация: 8
По умолчанию

По сути тут чистый Race Condition, как мне уже предложили, разумно в качестве Uploader использовать file_put_contents(shell_code), а для того, что бы войти в состоянии гонки - использовать bash curl -X HEAD .

Это бы решило проблему.... Но кое-где HEAD бывает отключен, GET может парсить долго. Что делать тогда?
 
Ответить с цитированием

  #3  
Старый 05.02.2018, 16:59
BigBear
Новичок
Регистрация: 04.12.2008
Сообщений: 11
С нами: 9176038

Репутация: 8
По умолчанию

Спускаем для завлечения в лвл8
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.