Forum. MyNuke.ru

Forum. MyNuke.ru (http://forum.mynuke.ru/index.php)
-   Уязвимости Защиты (http://forum.mynuke.ru/forumdisplay.php?f=15)
-   -   PHP-Nuke POST - SQL-Инъекция (http://forum.mynuke.ru/showthread.php?t=574)

Soniks 13.09.2005 19:11

PHP-Nuke POST - SQL-Инъекция
 
Продукт: PHP-NUKE

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

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

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

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

Откройте 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, то это сообщение не пройдет!
:pirate:

Vek 22.01.2006 14:31

это нужно делать для Nuke 7.9?

Soniks 22.01.2006 16:39

Vek ну вы посмотрите имеется ли там приведенный код и сравните


Часовой пояс GMT +4, время: 17:18.

Copyright © 2005 by Soniks