Продукт: 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:
PHP код:
...
if (ereg("\.\.",$name) || ereg("\.\.",$file) || ereg("\.\.",$mop)) {
echo "You are so cool...";
} else {
...
что в принципе уже запрещало выход из директории modules
А вот код патча 3.1:
PHP код:
....
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
Устранение:
Вернем все как было, это самый разумный способ:
PHP код:
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");
и
PHP код:
if (ereg("\.\.",$name) || ereg("\.\.",$file) || ereg("\.\.",$mop)) {
die("You are so cool...");
}
можете сверить с предыдущей версией патча.