PDA

View Full Version : PHP-Nuke POST - SQL-Инъекция


Soniks
13.09.2005, 19:11
Продукт: PHP-NUKE

Версия: 7.8 (и ниже)

Уровень: Высокий

Описание:
Непонятно почему раньше эту уязвимость не нашли, точнее, устранили:smile: , но все же. В самой PHP-NUKE есть фильтр запросов к скриптам системы, он находится в файле mainfile.php. Он фильтрует как и XSS, так и sql-инъекции, но в отличие от xss атак, sql-иньекции фильтруются только запросы GET (то что вы вводите в адресную строку браузера), а вот POST метод не фильтруется, поэтому у злоумышленника появляется возможность при написании правильного POST запроса к скрипту выполнить SQL-инъекцию и получить данные с вашей БД. Что странно и системы безопасности, как NukeSentinel так же этот момент обошли.

Устанение:
Если вы переименовали стандартные префиксы (_nuke) таблиц в свои, то уже можете быть спокойны на 70% :wink:

Откройте mainfile.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:

$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
Находим:
$result = $db->sql_query("SELECT active, view FROM ".$prefix."_modules WHERE title='$name'");

изменяем на:
$result = $db->sql_query("SELECT active, view FROM ".$prefix."_modules WHERE title='".addslashes($name)."'");
Находим:
$result2 = $db->sql_query("SELECT mod_group FROM ".$prefix."_modules WHERE title='$name'");

изменяем на:
$result2 = $db->sql_query("SELECT mod_group FROM ".$prefix."_modules WHERE title='".addslashes($name)."'");

Единственный минус решение этой проблемы если будите постить, скажем, в форуме сообщение и в нем встретится слово union, то это сообщение не пройдет!
:pirate:

Vek
22.01.2006, 14:31
это нужно делать для Nuke 7.9?

Soniks
22.01.2006, 16:39
Vek ну вы посмотрите имеется ли там приведенный код и сравните