PDA

View Full Version : PHPNuke Удаленный Доступ К Дириктории


Soniks
20.10.2005, 19:38
Продукт: PHP-Nuke

Версия: 7.8 - 7.9 + patch 3.1

Затронуты файлы: modules.php

Описание уязвимости:
Вышедший в свет фикс-патч версии 3.1 от http://www.nukeresources.com/
исправляет в PHP-Nuke не только найденные ошибки, а как уже не однократно было замечено и создает новые бреши в коде, что позваляет хаккеру выполнить нападение на сайт! Что больше всего поражает данная уязвимость уже была пофиксина в самой php-nuke на стадии 7.0 версии, а авторы данного патча по причине не знания php или же из за невнимательности, разграничили права на переменную $files, $mop и $name. Вот часть кода обычной php-nuke 7.8:

...
if (ereg("\.\.",$name) || ereg("\.\.",$file) || ereg("\.\.",$mop)) {
echo "You are so cool...";
} else {
...

что в принципе уже запрещало выход из директории modules
А вот код патча 3.1:

....
if (stripos_clone($name, "..") OR ((stripos_clone($modstring,"&file=nickpage") || stripos_clone($modstring,"&user=")) AND ($name=="Private_Messages" OR $name=="Forums" OR $name=="Members_List"))) header("Location: index.php");
....
if (!isset($file) OR $file != $_REQUEST['file']) $file="index";
if (stripos_clone($file,"..") OR stripos_clone($mop,"..")) die("You are so cool...");
.....

в результате этого идет проверка на вхожден строки начнаю не с символов ..
А этого уже достаточно что бы перейти в другой раздел на сервере используя следующий вызов:
&file=../../../../../../../../../etc/passwd

Устранение:
Вернем все как было, это самый разумный способ:

if (ereg("\.\.", $name) OR ((stripos_clone("&file=nickpage",$modstring) || stripos_clone("&user=",$modstring)) AND ($name=="Private_Messages" OR $name=="Forums" OR $name=="Members_List"))) header("Location: index.php");

и

if (ereg("\.\.",$name) || ereg("\.\.",$file) || ereg("\.\.",$mop)) {
die("You are so cool...");
}

можете сверить с предыдущей версией патча.