De nieuwssites staan er vol mee, de ene na de andere site wordt gehackt. Daarom zullen mijn komende blogs gaan, over de diverse beveiligingsproblemen en wat je er tegen kunt doen.

XSS staat voor Cross-site scripting. Wanneer je site kwetsbaar is voor xss kunnen “aanvallers” client side script in jouw site laten uitvoeren en op die manier, gegevens van jouw gebruikers stelen. Wanneer je bezoekers van je site informatie op je site laat invoeren ben je kwetsbaar voor xss. Geen enkele gebruikersinvoer is te vertrouwen en je dient deze informatie dan ook altijd op deze manier te behandelen. Bijvoorbeeld een blog waarbij bezoekers commentaar kunnen achterlaten en je laat onder je blog de commentaren zien. Een voorbeeld:

Een heel simpele blog pagina met een programmers default design:

  1: <div>
  2:     <h1>
  3:         Een interessant blog h1>
  4:         <p>
  5:             Een verhaal over Xss p>
  6:             <h2>
  7:                 Opmerkingen h2>
  8:                 <asp:repeater runat="server" id="CommentsRepeater">
  9:            <ItemTemplate>
 10:              
 11:                <br />
 12:               
 13:          ItemTemplate>
 14:          asp:Repeater>
 15:         <h3>
 16:             Laat ons je mening weten!
 17:        h3>
 18:         Naam: <asp:TextBox runat="server" ID="NaamTextBox" /> <br /><br />
 19:         <asp:TextBox runat="server" ID="OpmerkingTextBox" TextMode="MultiLine" Rows="5" Width="400px" /> <br /><br />
 20:         <asp:Button runat="server" ID="OpmerkingVersturenButton" Text="Versturen" />
 21: </div>

image_thumb15

En het resultaat van deze invoer is een alert die elke bezoeker die op deze pagina komt te zien krijgt.

image_thumb16

Nou is een alert het minst erge wat je kan overkomen. Het is makkelijk te detecteren en worden geen gegevens buit gemaakt. Het is echter ook mogelijk om met deze zelfde werkwijze bijvoorbeeld cookie informatie te stelen zonder dat je het door hebt. Onderaan deze post staan enkele links naar voorbeelden van zulke scripts.

Wat kan je er aan doen?

Om te voorkomen dat scripts uitgevoerd worden op je pagina moet je er voor zorgen dat de data ge-encode op de pagina getoond wordt. Dat kan op de volgende manier:

image_thumb17

Bij dezelfde invoer als in afbeelding 2 is het resultaat niet meer een alert met de tekst maar een ge-encode tekst.

image_thumb19

Als we de source van de pagina bekijken kunnen we zien wat deze functie nu heeft opgeleverd:

image_thumb21

Met het toevoegen van 1 simpele functie is onze site een stuk veiliger tegen xss. Een stuk veiliger, maar niet 100% waterdicht. Zoals bijna altijd met beveiliging zijn er manieren om een beveiliging te omzeilen, echter maken we het nu een stuk lastiger. De standaard encode functie van het .net maakt gebruikt van een blacklist. Alle tekens die in deze blacklist staan worden omgezet.

Een veiligere manier om xss tegen te gaan is gebruikt te maken van een white list, dus alleen de tekens in deze lijst zijn toegestaan. Een veelgebruikte library die je hiervoor kan gebruiken is de AntiXss Library. Microsoft heeft besloten om in .net 4.5 deze encoder de nieuwe standaard te maken. Maak je gebruik van .net 4.0 of lager, dan kan je deze library downloaden via NuGet. Hoe je deze encoder standaard kan maken, zonder daarvoor bestaande encoding functies aan te passen kan je hier lezen: http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx

Zoeken
Met .net 4.0 is er nog een andere methode toegevoegd om de output te encoden. Vooral gebruikelijk in MVC, maar ook prima mogelijk binnen webforms is het gebruik van code binnen je aspx. In dit voorbeeld hebben we een textbox en een knop om een zoekfunctie uit te voeren. Na een klik op de knop, redirect de pagina naar zichzelf en hebben we een querystring “zoekwoord” toegevoegd aan de url. Wanneer de querystring een tekst bevat laten we zien op welk woord de bezoeker heeft gezocht.

  1: Private Sub SearchButton_Click(sender As Object, e As System.EventArgs) Handles SearchButton.Click
  2:         Response.Redirect(String.Concat("/SearchXss.aspx?zoekwoord=", SearchTextBox.Text))
  3: End Sub
  1:     <div>
  2:     <% If Not String.IsNullOrWhiteSpace(Request.QueryString("zoekwoord")) Then%>
  3:         U heeft gezocht op <%= Request.QueryString("zoekwoord")%>
  4:     <% End If%>
  5:     <asp:TextBox runat="server" ID="SearchTextBox" /> <asp:Button runat="server" ID="SearchButton" Text="Zoeken" />
  6:     </div>

Wanneer we de volgende URL maken SearchXss.aspx?zoekwoord= wordt de bezoeker wederom getrakteerd op een een alert window. De in .net 4.0 toegevoegde aanpassing is vrij subtiel.

  1: <div>
  2: <% If Not String.IsNullOrWhiteSpace(Request.QueryString("zoekwoord")) Then%>
  3:         U heeft gezocht op <%: Request.QueryString("zoekwoord")%>
  4:  <% End If%>
  5: <asp:TextBox runat="server" ID="SearchTextBox" /> <asp:Button runat="server" ID="SearchButton" Text="Zoeken" />
  6: </div>

Het minimale verschil is de dubbele punt in versus . Lees meer over deze aanpassing op het blog van Scott Guthrie http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax-for-html-encoding-output-in-asp-net-4-and-asp-net-mvc-2.aspx

MVC
In MVC met de Razor viewengine wordt alle output ge-encode en hoef je dus standaard niets te doen.

  1: @ModelType IEnumerable(Of Mvc4Test.Comment)
  2: <hgroup class="title">
  3:     <h1>@ViewData("Title").h1> 
  4: hgroup> 
  5: <h2>Opmerkingenh2> 
  6: @For Each item As Mvc4Test.Comment In Model
  7:     Naam:@item.Naam @<br />
  8:     @item.Opmerking @<br />
  9: Next

En de output is wederom gelijk aan ons webforms voorbeeld zonder dat we daar iets voor hebben hoeven doen:

image_thumb1

Meer informatie over XSS:
http://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx http://wpl.codeplex.com/
https://www.owasp.org/index.php/Reviewing_Code_for_Cross-site_scripting
http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-2.html