
27.03.2015, 11:35
|
|
Новичок
Регистрация: 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 аплоадите картинку с шеллом, а наш скрипт её переименуют и переместит. Можно успеть уложиться в отведённое время.
Заключение:
Скрипт пока ещё будет дописываться, концепт показал. Коллеги, может будут какие-нибудь предложения по увеличению времени жизни загружаемого аплоадера?
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|