Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
SQL-инъекция в PHP-Nuke
 
Обсуждение статьи SQL-инъекция в PHP-Nuke
 
Действительно, имеется такая проблема, в чем я убедился, проведя локальную инвентаризацию кода этой CMS.


Дырявый код имеется в двух местах : файл index.php и modules/News/categories.php

код вида :

Код
if ($httpref == 1) {
    if (isset($_SERVER['HTTP_REFERER'])) {
    $referer = $_SERVER['HTTP_REFERER'];
    $referer = check_html($referer, "nohtml");
    }
    if (!empty($referer) && !stripos_clone($referer, "unknown") && !stripos_clone($referer, "bookmark") && !stripos_clone($referer, $_SERVER['HTTP_HOST'])) {
    $result = $db->sql_query("INSERT INTO ".$prefix."_referer VALUES (NULL, '".$referer."')");


Как видим, кавычки для получаемого значения заголовка Referer: не экранируются, а значит можно расширить INSERT запрос в таблицу рефереров.
К сожалению функция mysql_query() не позволяет объединять несколько запросов, и расширить запрос строкой вида "; DELETE FROM xxx /*" не получится.
Единственное возможность чего я нашел - это осуществить вставку в таблицу рефереров в качестве значения поля реферера "системных" данных - вроде USER(), DATABASE() через вложенный SELECT. Помимо этого при наличии соотв. прав через функцию LOAD_FILE можно записать в эту таблицу данные системных файлов.
Единственная проблема теперь - это получить вывод этих данных в браузер. Насколько я знаю, данные рефереров отображаются только в админской панели в этой cms, а простым смертным недоступны.

Знатоки PHPNuke, выскажитесь, возможно я не прав?
 
Пример значения заголовка Referer : для того, чтобы "положить" сервер :
1' + BENCHMARK(100000000,ENCODE('preved','medved')))/*

Примерный формируемый SQL запрос :
INSERT INTO nuke_referer VALUES (NULL, '1' + BENCHMARK(100000000,ENCODE('preved','medved')))/*')
 
Пример значения заголовка Referer : для получения ASCII кодов символов строк различных служебных функций (к сожалению, поскольку MySQL при использовании + интерпретирует данные как числа, необходимо второй аргумент после закрытия имеющейся одинарной кавычки тоже сделать числом, в связи с этим лучше способа чем получать ASCII коды отдельных символов в строке я пока не нашел).

Также одинарная кавычка экранизирована в примере
0\'+ASCII((SUBSTRING((SELECT DATABASE()), 1, 1))))/*

Примерный формируемый SQL запрос :
INSERT INTO nuke_referer VALUES (NULL, '0'+ASCII((SUBSTRING((SELECT DATABASE()), 1, 1))))/*')

Меняя второй аргумент в функции SUBSTRING на числа > 1, мы пройдемся по всем символам строки, возвращаемой функцией DATABASE(), таким образом строка будет "рассыпана" на несколько записей в таблице рефереров.
 
Решение:
Открываем:mainfile.php
Находим:
PHP код:
// override old superglobals if php is higher then 4.1.0  
Выше добавляем:
PHP код:
$_SERVER['HTTP_REFERER'] = addslashes(stripslashes($_SERVER['HTTP_REFERER']));
 
Продемонстрировали отличную заплатку но лучше уж попробывать написать свой Скрипт или CMS
Страницы: 1
Читают тему