Есть замечательный проект hiqpdf.
Умеет html качественно в pdf или картинки превращать
Но по дефолту не учитывает тот факт, что в html можно вставлять js/iframe, которые могут быть использованы не по назначению.
Ну и я не долго думая попробовал это на их же сайте
Вот так нагенерил в консоли браузера ифреймы
Вот такой самоскан портов.
Нашёл плеск (конечно 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 компоненте:
Про его безумность ничего сказать не могу, ибо не интересовался проблемой создания произвольного изображения из html.
На момент обнаружения достаточно было 1к запросов отправить в API (да, дело происходило на IIS и алерты, я так понимаю, если и были, то на том же сервере, если, конечно, войти под учёткой, от которой запущен пул).
Как это править — WebBrowser это IE и необходимо для него запрещать на windows-сервере JS. По моему опыту это и так по дефолту, и мне дико повезло, что оказалось иначе.
Но это отстой и по-хорошему — конечно нельзя в такие компоненты вставлять данные, как есть. Если знаешь, что юзаешь подобную компоненту, а клиент может содержать управляющие символы — их нужно экранировать.
Для HTML/JS достаточно сделать HtmlEncode.
Но если что, то HiqPdf через htmlToPdfConverter.RunJavaScript = false отлично умеет запрещать JS.
Всё это не так эффектно, как в прошлый раз, но, как видите, тоже может помочь в добытии конфигов сервера.
Умеет 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.
Всё это не так эффектно, как в прошлый раз, но, как видите, тоже может помочь в добытии конфигов сервера.