
Atlassian Jira неавторизованная инъекция шаблонов
4.4.x
5.x.x
6.x.x
7.0.x
7.1.x
7.2.x
7.3.x
7.4.x
7.5.x
7.6.x before 7.6.14 (the fixed version for 7.6.x)
7.7.x
7.8.x
7.9.x
7.10.x
7.11.x
7.12.x
7.13.x before 7.13.5 (the fixed version for 7.13.x)
8.0.x before 8.0.3 (the fixed version for 8.0.x)
8.1.x before 8.1.2 (the fixed version for 8.1.x)
8.2.x before 8.2.3 (the fixed version for 8.2.x)
set JVM_SUPPORT_RECOMMENDED_ARGS= в файле ./bin/setenv.bat (или аналогично в ./bin/setenv.sh для Linux), чтобы включить удаленную отладкуset JVM_SUPPORT_RECOMMENDED_ARGS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
Remote JVM Debug с параметрами host и port localhost:5005 и Command line arguments for remote JVM-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
Запустите ./bin/config.bat (или ./bin/config.sh для Linux) и измените "Jira home" на свою домашнюю директорию Jira

Запустите ./bin/start-jira.bat (или ./bin/start-jira.sh для Linux). Проверьте, что версия Java и порты 8080 и 5005 свободны, иначе не запустится!
Выбираем private mode

На этом этапе используйте email, на который можно получить письмо :)

Настройте и протестируйте соединение

По адресу http://localhost:8080/secure/admin/EditApplicationProperties!default.jspa включите функцию Contact Administrators Form

Я лишь отмечаю некоторые моменты при сборке, вы можете обратиться к building jira from source
После прочтения Advisory мы узнали, что эта ошибка находится в ContactAdministrators и SendBulkMail (это мы пропускаем, так как требуется аутентификация). Поэтому я начал тестировать функцию ContactAdministrators и перехватил запрос

Я увидел запрос к /secure/ContactAdministrators.jspa, поэтому посмотрел файл ./atlassian-jira/WEB-INF/web.xml, чтобы узнать, в какой класс направляется этот запрос


Таким образом, запрос обрабатывается в JiraWebworkActionDispatcher, поэтому я поставил точки останова на init и serve в этом классе и запустил отладку

Программа остановилась на функции serve, немного проследив, программа перешла в ContactAdministrators.doExecute()

Затем переходим к send, здесь программа выводит список активных администраторов

Затем программа переходит к функции sendTo. Здесь мы видим, что программа создает MailQueueItem и добавляет его в mailQueue.

Программа вызывает функцию EmailBuilder.withSubject. Здесь строка subject письма (отправленная атакующим) преобразуется из String в TemplateSources и присваивается параметру subjectTemplate класса EmailBuilder.

В функции renderLater программа создает EmailRenderer и использует его для создания RenderingMailQueueItem

Отсюда, возвращаясь к функции ContactAdministrators.sendTo. После создания MailQueueItem программа добавляет элемент в mailQueue и возвращается к doExecute для перенаправления. Если следовать этому потоку отладки, мы не можем перейти к части, где программа рендерит письмо, поэтому не можем добраться до места, где происходит инъекция шаблона. Что же делать, чтобы отследить обработку письма???
Я заметил, что в EmailRenderer есть функция renderNow (программа вызывает только renderLater). Я предположил, что когда письмо из очереди вызывается для рендеринга, оно будет следовать тому же потоку, что и renderNow, поэтому я решил трассировать от функции renderNow

Из renderNow программа вызывает EmailRenderer.render(). Я поставил точку останова здесь и повторил запрос, чтобы проверить, действительно ли программа доходит до этого места

К счастью, программа пошла по предполагаемому пути. Далее программа вызывает renderEmailSubject

Далее программа вызывает DefaultVelocityTemplatingEngine.render(this.subjectTemplate)

Доходим до DefaultVelocityTemplatingEngine.applying и DefaultVelocityTemplatingEngine.asPlainText

Продолжаем вызов к asPlainText(Writer writer)

Доходим до toWriterImpl, так как writer, который я передал, является Fragment, программа переходит к else
private void toWriterImpl(Writer writer, boolean attachCartridge) throws IOException {
if (this.source instanceof File) {
File template = (File)this.source;
if (attachCartridge) {
this.context.attachEventCartridge(DefaultVelocityTemplatingEngine.this.createDefaultCartridge());
}