Действительно, имеется такая проблема, в чем я убедился, проведя локальную инвентаризацию кода этой 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, а простым смертным недоступны.
Пример значения заголовка Referer : для получения ASCII кодов символов строк различных служебных функций (к сожалению, поскольку MySQL при использовании + интерпретирует данные как числа, необходимо второй аргумент после закрытия имеющейся одинарной кавычки тоже сделать числом, в связи с этим лучше способа чем получать ASCII коды отдельных символов в строке я пока не нашел).
Также одинарная кавычка экранизирована в примере 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']));