Hey,
Ik vind dat dit eigenlijk in de FAQ moet, maar ik ben ook niet omnipotent dus ik hoop dat er rond dit punt een beetje discussie ontstaat.
Een tijdje geleden heb ik op eigen initiatief (achtergrond: ik ben een 21 jarige student die part-time bij een groot internationaal op de E-commerce afdeling werkte) op m'n werk gevraagd hoe het met security zat, en dat bracht eigenlijk alleen een hoop ge-'euh' voort. Ik heb toen maar eens de code (ASP, een paar honderd files, echt behoorlijk wat dus) gescand op problemen, en daar kwam ik de volgende problemen tegen:
- SQL injection. Er staat vrij uitgebreid op www.sqlsecurity.com beschreven wat dit is, maar ik zal het even herhalen. Stel, ik heb een webshop waar iemand kan zoeken op artikelen. Iemand kan dan uit een drop-down box kiezen op wat voor product, hierdoor wordt er een getal gepost naar mijn zoekpagina. Ik maak dan de volgende query:
query = "SELECT * FROM Catalog WHERE productcat= " & Request.Item("catalogid")
Voor de meeste mensen zal het gelijk duidelijk zijn: dit kan natuurlijk mis gaan. Als iemand niet netjes de drop-down box gebruikt maar zelf iets in de URL intikt (let er op dat het met POST forms ook werkt, kost voor de aanvaller maar ietsje meer moeite) dan kan het vervelende gevolgen hebben. Stel dat er ingetikt wordt: '3 DROP CATALOG' dan is mijn catalogus weg (ik ga nu even uit van MS SQL server, maar vergelijkbare constructies zijn voor alle SQL servers mogelijk).
Regel 1: vertrouw NIETS (en dan dus ook echt NIETS) wat van de user komt. Dus geen variabelen, geen cookie-waarden, geen headers, nada!
- Directory traversal
Lijkt een beetje op het vorige: in de code die ik doorkeek werden er wel eens files geopend die afhingen van user-input, maar ook hier werd niet goed gelet op onverwachte tekens. Een voorbeeld:
attachment = "C:\attachments\" + Request.Item("attachmentid")
Gaat overduidelijk fout. Dus hieruit volgt regel 2:
vertrouw NIETS (en dan dus ook echt NIETS) wat van de user komt. Dus geen variabelen, geen cookie-waarden, geen headers, nada!
Dit waren dus twee implementatieproblemen, maar ook voor architecten valt er veel te leren. Bovenstaande, en een hoop andere, dingen staan trouwen ook op de Open Web Application Security Project site: www.owasp.org (nee, ik heb niets met dit project te maken, maar ik heb wel info er van gebruikt bij het testen van de applicatie)
Ik hoop dat hier een FAQ itempje van gemaakt kan worden, zodat er meer mensen op het schrijven van veilige code gaan letten.
Ohja, ik had uiteindelijk in meer dan 20 pagina's meer dan 100 problemen gevonden, dus een cracker had 100 mogelijkheden om in systemen in te breken ...
Ik vind dat dit eigenlijk in de FAQ moet, maar ik ben ook niet omnipotent dus ik hoop dat er rond dit punt een beetje discussie ontstaat.
Een tijdje geleden heb ik op eigen initiatief (achtergrond: ik ben een 21 jarige student die part-time bij een groot internationaal op de E-commerce afdeling werkte) op m'n werk gevraagd hoe het met security zat, en dat bracht eigenlijk alleen een hoop ge-'euh' voort. Ik heb toen maar eens de code (ASP, een paar honderd files, echt behoorlijk wat dus) gescand op problemen, en daar kwam ik de volgende problemen tegen:
- SQL injection. Er staat vrij uitgebreid op www.sqlsecurity.com beschreven wat dit is, maar ik zal het even herhalen. Stel, ik heb een webshop waar iemand kan zoeken op artikelen. Iemand kan dan uit een drop-down box kiezen op wat voor product, hierdoor wordt er een getal gepost naar mijn zoekpagina. Ik maak dan de volgende query:
query = "SELECT * FROM Catalog WHERE productcat= " & Request.Item("catalogid")
Voor de meeste mensen zal het gelijk duidelijk zijn: dit kan natuurlijk mis gaan. Als iemand niet netjes de drop-down box gebruikt maar zelf iets in de URL intikt (let er op dat het met POST forms ook werkt, kost voor de aanvaller maar ietsje meer moeite) dan kan het vervelende gevolgen hebben. Stel dat er ingetikt wordt: '3 DROP CATALOG' dan is mijn catalogus weg (ik ga nu even uit van MS SQL server, maar vergelijkbare constructies zijn voor alle SQL servers mogelijk).
Regel 1: vertrouw NIETS (en dan dus ook echt NIETS) wat van de user komt. Dus geen variabelen, geen cookie-waarden, geen headers, nada!
- Directory traversal
Lijkt een beetje op het vorige: in de code die ik doorkeek werden er wel eens files geopend die afhingen van user-input, maar ook hier werd niet goed gelet op onverwachte tekens. Een voorbeeld:
attachment = "C:\attachments\" + Request.Item("attachmentid")
Gaat overduidelijk fout. Dus hieruit volgt regel 2:
vertrouw NIETS (en dan dus ook echt NIETS) wat van de user komt. Dus geen variabelen, geen cookie-waarden, geen headers, nada!
Dit waren dus twee implementatieproblemen, maar ook voor architecten valt er veel te leren. Bovenstaande, en een hoop andere, dingen staan trouwen ook op de Open Web Application Security Project site: www.owasp.org (nee, ik heb niets met dit project te maken, maar ik heb wel info er van gebruikt bij het testen van de applicatie)
Ik hoop dat hier een FAQ itempje van gemaakt kan worden, zodat er meer mensen op het schrijven van veilige code gaan letten.
Ohja, ik had uiteindelijk in meer dan 20 pagina's meer dan 100 problemen gevonden, dus een cracker had 100 mogelijkheden om in systemen in te breken ...
There are no stupid questions, but there are a lot of inquisitive idiots.