Pull to refresh

Генерация PDF для скачивания конфигов сервера

Reading time3 min
Views5.9K
Есть замечательный проект hiqpdf.

Умеет html качественно в pdf или картинки превращать

Но по дефолту не учитывает тот факт, что в html можно вставлять js/iframe, которые могут быть использованы не по назначению.

Ну и я не долго думая попробовал это на их же сайте

Вот так нагенерил в консоли браузера ифреймы

var str = "";

for (var i = 8000; i <= 9000; i++) {
 str += "#" + i;
 str += "<iframe src='http://localhost:" + i + "' height='60' width='300'></iframe><br/>";
}

str;

Получилось что-то вроде этого


Вот такой самоскан портов.

Нашёл плеск (конечно nmap таже спокойно находит и даже больше -p [8000-9000] -T4 -A -v hiqpdf.com, но вот так интереснее же).



Но быстро с ними разобраться не вышло, потому в конце продемонстрирую на примере других ребят уязвимость, а для понимания механики процесса сделал своё небольшое демо.

Есть апи на .net, которое отдаёт просто строку и всё + есть код, который умеет на этом сервере генерировать pdf. Код взят прямо с hiqpdf.com, без лишних телодвижений.



Теперь 4 iframe localhost/api/def/get



Ок, проверим, что это точно .net на винде

localhost/api/con.aspx — если не в курсе, файлы с именем con/aux и ещё какие-то для винды запрещены. Ноги растут из древностей доса, когда это были конкретные устройства.

Например — очень мне нравится сайт, особенно если под рукой лишь телефон, а так хочется какой-нибудь код набрать:

dotnetfiddle.net/con1.asmx — обработанная ошибка и соответствующая 404-страница
dotnetfiddle.net/con.asmx — вот уже не судьба до управляемого кода в пуле добраться
dotnetfiddle.net/con.txt — а вот так можно и путь получить к директории (Physical Path E:\sitesroot\0\con.txt)



На самом деле без понятия зачем мне версия, в теории может помочь, если там старая и ты знаешь уязвимости нулевого дня для них. Лан, теперь самое интересное — узнать директорию, по локалхосту у меня ошибки 404 не закрыты и получаю их, как есть.



В виду того, что это сайт на .net — конфиг файл web.config лежит в корне:



Собственно, это было легковесное демо.

А теперь на реальных данных (чей-то прод, они уже прикрыли лавочку ;)



О, там секция включается из файла connections.config, удобно, нестандартно, отлично скачивается:



И ещё немного данных:



Думаю, тут уже всё понятно и продолжать сыпать скринами нет смысла.
Жаль вся БД снаружи закрыта.
А из JS я такого пока не умею (да, там можно не только iframe, но и js юзать).

Сразу оговорюсь — именно hiqpdf тут не при чём, проблема конфигурации приложения, кода отправки на печать в pdf данных (если знаешь, что чётко будет html, то нужно делать htmlencode), а также любых других либ, например стандартный компонент WebBrowser умеет также.

Собственно продолжение — оказывается некоторые любят не PDF, даже не HTML, а именно изображение, допустим png. И юзают для получения картинки компоненту WebBrowser (со мной любезно поделились куском кода, но попросили не раскрывать название продукта, где он юзается).

Суть — можно написать js, который исполнялся в дефолтной System.Windows.Forms.WebBrowser компоненте:



Вот сам исходник
using (WebBrowser br = new WebBrowser())
{
  AutoResetEvent loadingWaiter = new AutoResetEvent(false);
  br.AllowNavigation = true;
  br.ScrollBarsEnabled = false;
  br.ScriptErrorsSuppressed = true;
  br.DocumentText = "0";
  br.Width = 1024;
  br.Document.OpenNew(true);
  br.Document.Write(htmlCode);
  br.Refresh();

  br.DocumentCompleted += (a, b) => loadingWaiter.Set();

  loadingWaiter.WaitOne(590);

  br.Height = (int)(br.Document.Body.ScrollRectangle.Height * scale + 1);

  using (Bitmap bmp = new Bitmap(br.Width, br.Height))
  {
    br.DrawToBitmap(bmp, new Rectangle(0, 0, br.Width, br.Height));
    bmp.Save(stream, ImageFormat.Png);
  }
}


Про его безумность ничего сказать не могу, ибо не интересовался проблемой создания произвольного изображения из html.

На момент обнаружения достаточно было 1к запросов отправить в API (да, дело происходило на IIS и алерты, я так понимаю, если и были, то на том же сервере, если, конечно, войти под учёткой, от которой запущен пул).

Как это править — WebBrowser это IE и необходимо для него запрещать на windows-сервере JS. По моему опыту это и так по дефолту, и мне дико повезло, что оказалось иначе.

Но это отстой и по-хорошему — конечно нельзя в такие компоненты вставлять данные, как есть. Если знаешь, что юзаешь подобную компоненту, а клиент может содержать управляющие символы — их нужно экранировать.

Для HTML/JS достаточно сделать HtmlEncode.

Но если что, то HiqPdf через htmlToPdfConverter.RunJavaScript = false отлично умеет запрещать JS.

Всё это не так эффектно, как в прошлый раз, но, как видите, тоже может помочь в добытии конфигов сервера.
Tags:
Hubs:
+10
Comments0

Articles