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

    Есть замечательный проект 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.

    Всё это не так эффектно, как в прошлый раз, но, как видите, тоже может помочь в добытии конфигов сервера.
    Поделиться публикацией
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое