(Dm)
22.12.2009, 11:18
Снова небольшой очерк.
Пару раз сталкивался с веб приложениями в которых можно было загрузив архив, распаковать его. Но дело в том, что если нет проверки на '../'(опуститься на каталог выше), то файлы можно распаковать в произвольные каталоги на сервере.
например архив:
Archive: test.zip
Length Date Time Name
--------- ---------- ----- ----
15 2009-12-22 09:57 ../test.php
Распакуется на каталог выше.
Рассмотрим веб приложение DCMS
там используется PclZip класс для работы с zip архивами.
Администратор может загружать и распаковывать архивы в разделе загрузки:
$zip=new PclZip($dir_loads.'/'.$file);
$zip->extract(PCLZIP_OPT_PATH, $path_unzip, PCLZIP_OPT_SET_CHMOD, 0777, PCLZIP_OPT_BY_PREG, "#^[^\.]+#ui");
Как видно "#^[^\.]+#ui" вот эта регулярка защищает от '../' в начале имени файла =) Чтобы обойти фильтр в начале надо указать существующий каталог, что-то типа такого:
Archive: test.zip
Length Date Time Name
--------- ---------- ----- ----
15 2009-12-22 09:57 test/../../test.php
При распаковке этого архива, файл test.php, будет записан не в том месте где предполагалось, а на каталог выше.
Вот ещё аналогичный баг http://vuln.sg/net2ftp096-en.html
Пару раз сталкивался с веб приложениями в которых можно было загрузив архив, распаковать его. Но дело в том, что если нет проверки на '../'(опуститься на каталог выше), то файлы можно распаковать в произвольные каталоги на сервере.
например архив:
Archive: test.zip
Length Date Time Name
--------- ---------- ----- ----
15 2009-12-22 09:57 ../test.php
Распакуется на каталог выше.
Рассмотрим веб приложение DCMS
там используется PclZip класс для работы с zip архивами.
Администратор может загружать и распаковывать архивы в разделе загрузки:
$zip=new PclZip($dir_loads.'/'.$file);
$zip->extract(PCLZIP_OPT_PATH, $path_unzip, PCLZIP_OPT_SET_CHMOD, 0777, PCLZIP_OPT_BY_PREG, "#^[^\.]+#ui");
Как видно "#^[^\.]+#ui" вот эта регулярка защищает от '../' в начале имени файла =) Чтобы обойти фильтр в начале надо указать существующий каталог, что-то типа такого:
Archive: test.zip
Length Date Time Name
--------- ---------- ----- ----
15 2009-12-22 09:57 test/../../test.php
При распаковке этого архива, файл test.php, будет записан не в том месте где предполагалось, а на каталог выше.
Вот ещё аналогичный баг http://vuln.sg/net2ftp096-en.html