В сегодняшнем блоге я собираюсь показать вам, как анализ файлов javascript может привести к неограниченному доступу к конечным точкам и понять, как приложение справляется с этим. Я также покажу вам, как я обошел 2 конечные точки загрузки файлов, чтобы получить RCE в приложении ASP.NET.

Прежде всего, это была частная программа, поэтому я буду ссылаться на нее с помощью target.com.

Нахождение конечной точки:

После нескольких часов игры с приложением я нашел поддомен, который выдает мне сообщение «Сделал небольшой перерыв», что означает, что это хороший знак для начала фаззинга каталогов.

Я начал просматривать каталоги, пока не нашел некоторые конечные точки, которые возвращают страницу с кодом ошибки 403 Forbidden, кроме конечной точки /tools, она дает мне страницу входа, и я думал, что она предназначена только для администраторов, давайте посмотрим:

Я пытался войти в систему с учетными данными по умолчанию, но это не удалось.
Обычно, когда я нахожу панель входа, на которую не могу войти, я просматриваю файлы javascript, так как могут быть утечки учетных данных, Ключи API, скрытые конечные точки и т. д.

Подавляющее большинство веб-приложений запутывают файлы javascript, так что будет пустой тратой времени, чтобы понять, как и что эти файлы вообще делают, но вы можете воспользоваться функцией поиска в наших браузерах, чтобы найти кое-что полезное!
Я пытаюсь найти api, secret, token, admin и т. д., а также пытаюсь выполнить поиск запросов Ajax и XML.

И я нашел несколько конечных точек, которые подтверждают, что эта панель входа предназначена для администраторов.

Я проверил все эти конечные точки, и все дали мне пустой ответ, кроме этого /path/to/assetmain.aspx, он возвращает белую страницу и некоторые импортированные файлы CSS и javascript, давайте покопаемся в этих файлах, тем более, что имена этих файлов что-то говорят связанные с загрузкой.

Проанализируйте первый файл (xproupload.js):

Начиная с xproupload.js, я обнаружил этот беспорядок.

Я решил использовать онлайн-улучшитель javascript, чтобы мне было легче его анализировать.

В этом файле было +550 строк кода, поэтому я сосредоточусь только на важных объектах и ​​функциях.

Я анализировал этот файл, пока не нашел функцию, которая имеет дело с функцией загрузки бэкэнда, начиная со строки 465, объект «o» был объявлен и подготовлен для использования в качестве тела запроса инициированный запрос Ajax в строке 473 и содержит следующие элементы (параметры):

  • папка→ Каталог, в который я буду загружать.
  • файл→ параметр, который будет иметь имя нашего файла и его содержимое.
  • currentFilter→ просто пустая строка, тоже из более поздних анализов, в ней нет необходимости.

Также в строки 472 и 473 добавлены новые параметры:

  • getRS→ возвращаемое значение из функции getAKrs, мы так и не узнали, что это такое, также в этом файле нет функций с таким названием, поэтому буду искать в других файлах javascript позже.
  • akap→ в javascript значение !0 означает «true».

Назначение запроса на загрузку было объявлено в строке 488 для _uploadHander, и эта переменная была упомянута в строке 377, как вы можете видеть ниже.

Также вы можете заметить, что в строке 379 есть несколько правил загрузки, одно из них — разрешенные расширения файлов.

Проанализируйте второй файл (xprofile.js):

У этого файла много функций, поэтому я сосредоточусь только на важных объектах и ​​функциях.

Здесь также были объявлены те же правила загрузки, в дополнение к новым свойствам handlers, и они вызывались из разных конечных точек.

  • _fileHandlerfilemgn.ashx
  • _rsHandlerfileUtility.ashx

В строке 13 есть функция getAKrs, которую я искал, она возвращает результаты почтового запроса Ajax в _rsHandler(fileUtility. ashx), единственный параметр, необходимый для отправки запроса, называется «fx», а его значение — «setFileRS».

Я попытался отправить этот запрос с помощью пакета burp, и результатом была случайная строка для каждого запроса, я предполагаю, что этот код может проверять каждый запрос, отправленный на сервер, так же, как динамический токен CSRF. , посмотрим.

Теперь все необходимые параметры и их значения для загрузки файла находятся здесь, давайте загрузим текстовый файл, чтобы проверить, есть ли у меня права на загрузку файла или я должен быть зарегистрирован как admin, я также изменил кодировку тело запроса в multipart/form-data;, чтобы сервер подготовился к получению файла.

Красиво, сработало! Кроме того, ответ дает мне каталог, в который был загружен мой файл, и он находится в каталоге /assets, давайте проверим!

Звучит хорошо, теперь нам нужно обойти белый список расширений приложения, чтобы загрузить оболочку, имейте в виду, что это приложение ASP.NET.

Я пытался обойти его всеми известными способами, такими как двойное расширение, нулевой байт и т. д., но это не сработало, также пробовал со всеми возможными конфигурациями и исполняемыми расширениями, которые работают с ASP.NET и сервером Microsoft приложения, такие как exe, bat, config и т. д., но безуспешно.

Вернитесь к файлу xprofile.js и изучите, возможно, есть другие функции, которые могут использовать эту загрузку.

Мое внимание привлекло количество Ajax-запросов, используемых в этом файле, я заметил, что некоторые из них отправлены для обработки каким-то файловым менеджером, есть такие функции, как getFiles, deleteFile, createFolder и другие, одна из этих функций называется renameFile!, и переименование файлов — это то, что мне нужно!

Судя по этой функции, это запрос Ajax, отправленный в _fileHandler (filemgn.ashx), и ему нужны 4 параметра:

  • fn → и принимает строковое значение «rename_file».
  • getRS→ значение, возвращаемое функцией getAKrs.
  • akap→ как упоминалось выше, это просто значение «true».
  • param→ принимает значение переменной «t», которая была объявлена ​​как массив в строке 131, и ему были присвоены три значения в строке 132.

Я не знаю, для чего используется параметр param? поэтому я начал фаззить это.

Несколько минут спустя, и поскольку параметр param должен был быть отправлен как массив из 3 элементов, я наконец обнаружил, что:

  • 1st param[] — это каталог, содержащий файл, который мы хотим переименовать.
  • Второй был для нового имени.
  • 3-й был для текущего имени файла.

Я попытался использовать другой текстовый файл, поэтому загрузил slider.txt и изменил имя на slider_melo.txt.

Отлично! Я также пытался изменить расширение файла на НЕ разрешенное, например aspx, и это тоже работает, так что давайте загрузим вредоносный файл!

Я использовал cmd.aspx, но изменил его на cmd.txt и загрузил, затем изменил его имя на testshell.aspx, затем я перешел к файлу.

Мой ребенок успешно загружен, и теперь я могу запускать команды в системе!

График отчета:

25 марта: отправлено.
28 марта: сортировка.
29 марта: награда за награду.

Копаем больше:

Мне стало интересно узнать, что стоит за этим кодом, особенно за фильтрацией, реализованной в расширении файла. Следовательно, поскольку у нас есть право писать команды на сервере, я начал читать эту часть кода в файле fileUtility.aspx.

Обратите внимание, что вы ДОЛЖНЫ запрашивать разрешение, прежде чем использовать любую обнаруженную вами ошибку, особенно когда речь идет о доступе к внутренним данным, и, конечно же, в моем случае это было сообщено и согласовано командой программы.

Вернувшись к тому, что я обнаружил, приложение преобразует расширение файла в нижний регистр, а затем фильтрует все исполняемые файлы, и я понял, что его нельзя использовать, не найдя функцию rename, но в том же файле я нашел что-то, связанное с загрузкой файла zip, привлекло мое внимание!

Как видно из строки 126, она проверяет две основные вещи:

  • Если последние 4 символа в имени файла — «.zip»,
  • Значение параметра запроса extract.

Если оба верны, он разархивирует файл в тот же каталог, который мы загрузили!

Будет извлекаться без фильтрации?
- ДА! Поехали!

Я использовал тот же файл оболочки, но на этот раз я добавляю его в Zip-архив и создаю простой скрипт Python для его загрузки и добавляю параметр extract со значением true ценить

Теперь давайте проверим это в браузере

Смотри, моя вторая детская ракушка успешно загружена!

Я хотел отправить новый отчет, но они все равно закрыли сервер, надеюсь, вам было интересно читать, и мне будет приятно, если у вас есть отзывы!