Продукт: PHP-NUKE
Версия: 7.8 (и ниже)
Уровень: Высокий
Описание:
Непонятно почему раньше эту уязвимость не нашли, точнее, устранили
, но все же. В самой PHP-NUKE есть фильтр запросов к скриптам системы, он находится в файле mainfile.php. Он фильтрует как и XSS, так и sql-инъекции, но в отличие от xss атак, sql-иньекции фильтруются только запросы GET (то что вы вводите в адресную строку браузера), а вот POST метод не фильтруется, поэтому у злоумышленника появляется возможность при написании правильного POST запроса к скрипту выполнить SQL-инъекцию и получить данные с вашей БД. Что странно и системы безопасности, как NukeSentinel так же этот момент обошли.
Устанение:
Если вы переименовали стандартные префиксы (_nuke) таблиц в свои, то уже можете быть спокойны на 70%
Откройте mainfile.php
Найдите:
PHP код:
$queryString = strtolower($_SERVER['QUERY_STRING']);
if (stripos_clone($queryString,'%20union%20') OR stripos_clone($queryString,'/*') OR stripos_clone($queryString,'*/union/*') OR stripos_clone($queryString,'c2nyaxb0')) {
header("Location: index.php");
die();
}
Ниже добавим проверку POST:
PHP код:
$postString = "";
foreach ($_POST as $postkey => $postvalue) {
if ($postString > "") {
$postString .= "&".$postkey."=".$postvalue;
} else {
$postString .= $postkey."=".$postvalue;
}
}
str_replace("%09", "%20", $postString);
$postString_64 = base64_decode($postString);
if (stristr($postString,'%20union%20') OR stristr($postString,'*/union/*') OR stristr($postString,' union ') OR stristr($postString_64,'%20union%20') OR stristr($postString_64,'*/union/*') OR stristr($postString_64,' union ')) {
header("Location: index.php");
die();
}
Далее пофиксим еще небольшую дырочку, открываем modules.php
Находим:
PHP код:
$result = $db->sql_query("SELECT active, view FROM ".$prefix."_modules WHERE title='$name'");
изменяем на:
PHP код:
$result = $db->sql_query("SELECT active, view FROM ".$prefix."_modules WHERE title='".addslashes($name)."'");
Находим:
PHP код:
$result2 = $db->sql_query("SELECT mod_group FROM ".$prefix."_modules WHERE title='$name'");
изменяем на:
PHP код:
$result2 = $db->sql_query("SELECT mod_group FROM ".$prefix."_modules WHERE title='".addslashes($name)."'");
Единственный минус решение этой проблемы если будите постить, скажем, в форуме сообщение и в нем встретится слово
union, то это сообщение не пройдет!