In ieder programma zitten fouten. Hoe klein de fout ook is, vroeg of laat wordt hij ontdekt. En als het een beveiligingslek is, kunnen de gevolgen enorm zijn. Aanleiding voor deze bijdrage zijn de geconstateerde lekken bij een aantal websites. Remko Stouthart geeft beveiligingstips.
Hieronder volgen twaalf tips die het hacken van een website bemoeilijken – deze tips gelden overigens voor websites die gebruik maken van het besturingssysteem NT Server, in combinatie met Internet Information Server (IIS), de Active Server-page-technologie en SQL Server. Hoewel dit een krachtig platform is voor het ontwikkelen van dynamische websites, kan een kleine fout in de configuratie of code grote gevolgen hebben voor de veiligheid.
MS SQL Server
- Beperk de permissies van de gebruiker onder wiens naam verbinding met de database wordt gelegd. De standaard rol ‘db_datareader’ is doorgaans voldoende. Log nooit in onder de gebruiker ‘SA’; deze heeft normaliter toegang tot alle ingebouwde functies. Bij een inbraak kan dit grote gevolgen hebben (zie onder meer de ‘books online’, onder ‘xp_cmdshell‘).
- Voorkom dat de database van buitenaf wordt benaderd via het TCP/IP-protocol. Het kunnen bijwerken van gegevens is ook via webpagina’s te regelen. Is directe toegang desondanks toch vereist, zorg er dan voor dat SQL ‘luistert’ naar een andere poort dan de standaard TCP/IP-poort 1433. Zorg in dat geval tevens voor een juist geconfigureerde ‘firewall’.
- Laat gebruikers (lees: bezoekers) die meer rechten nodig hebben dan lezen, expliciet inloggen op de website. Het is raadzaam om hierbij gebruik te maken van NT Security, zodat de rollen of permissies direct kunnen worden gekoppeld aan SQL Server.
ASP / MS SQL Server
- Maak bij voorkeur gebruik van stored procedures in plaats van dynamische sql-statements. Dit heeft voordelen, zowel voor wat betreft beveiliging (per ‘stored procedure’ kan apart worden ingesteld wie deze mag uitvoeren) als voor de prestatie (‘optimized query plan‘).
- Voeg inputparameters (‘QueryString’) nooit als tekst toe aan een dynamisch sql-statement. In dergelijke gevallen is het namelijk mogelijk om middels de toevoeging van een batch-terminator (‘;’) en/of commentaar-quotes (–‘ ) aan de inputparameters(s) delen van het sql-statement uit te schakelen. Om dezelfde reden is het verstandig om een dynamisch sql-statement meer dan één regel te laten beslaan. Het uitschakelen van delen van het statement zoals hierboven beschreven wordt daardoor onmogelijk (lees: lastiger).
ASP
- Controleer altijd het datatype van inputwaarden. Dit is mogelijk met iedere scripttaal waarmee ASP’s kunnen worden gebouwd (‘VarType’ in VBScript). Er zijn namelijk altijd gebruikers die het ‘leuk’ vinden om tekst in te voeren, terwijl numerieke invoer wordt verwacht. Overigens zou dit ook tijdens het ontwikkelen reeds uitgebreid getest moeten worden.
- Zorg voor een goede standaard foutafhandeling, bijvoorbeeld een re-direct naar de hoofdpagina. Voorkom in ieder geval dat foutmeldingen die optreden tijdens het ophalen van de ASP, worden getoond in de browser van de bezoeker. Met behulp van dergelijke meldingen kan een ervaren programmeur vrij gemakkelijk achterhalen of, en zo ja, welke mogelijkheden er zijn om de betreffende website te hacken.
- Log gebruikers die fouten veroorzaken en doe ook daadwerkelijk iets met deze informatie. Een incidentele fout kan altijd optreden. Echter, als dat vaker gebeurt bij dezelfde gebruiker (of ip-adres) berust dit meestal niet op toeval. In noodgevallen kan toegang tijdelijk worden geblokkeerd voor een of meerdere bezoekers.
- Om redundante code te vermijden, wordt in ASP’s vaak gebruikgemaakt van include files. Op zich is hier niets mis mee (integendeel). Geef deze bestanden echter nooit de extensie ‘.inc’. Als om wat voor reden dan ook een gebruiker achter de naam van een dergelijke file komt, kan hij deze gewoon downloaden en de inhoud ervan bekijken (‘.inc’-bestanden worden door de server noch de browser als webpagina herkend).
- Zet gebruikersnamen en wachtwoorden (voor het inloggen op een database) nooit in een asp-bestand of ‘include file’. Hiervoor bestaan betere, maar bovenal veiligere oplossingen, zoals een ‘Data Link File’.
NT Server / IIS
- De machine waarop Internet Information Server (IIS) draait, mag nooit een ‘Primary Domain Controller’ zijn. Met enige regelmaat worden beveiligingslekken in IIS aangetroffen. Het is buitengewoon ‘onprettig’ als bij een inbraak tevens alle gebruikersnamen en wachtwoorden verdwijnen.
- Hetzelfde geldt voor de combinatie van IIS en SQL Server. Bij een inbraak lopen de databases en de data gevaar. Maak in ieder geval altijd consequent back-ups van de databases (open deur). Vergeet ook niet om deze te controleren op integriteit.
Het merendeel van bovenvermelde tips geldt voor het ontwikkelen van software in zijn algemeenheid. Feitelijk maken programmeurs nog steeds dezelfde fouten als tien jaar geleden. Bovendien nemen de meeste softwareontwikkelaars (en hun leidinggevenden) beveiligingsaspecten nog altijd niet serieus. Het geconstateerde lek in de thuisbankiersoftware van de ABN-Amro en met name de officiële reactie daarop, was wat dat betreft een klassieke blunder.
Gezondigd
In het geval van de Automatiseringgids is (op donderdag 24 augustus 2000) gezondigd tegen de punten 1, 4, 5, 6, 7, 8 en 11. Na het invullen van onjuiste invoerwaarden werd het volledige pad naar de betreffende asp-file getoond. Bijvoorbeeld:
http://www.automatiseringsgids.nl/news/default.asp?category=aaa
Geeft als resultaat:
Microsoft OLE DB Provider for SQL Server error ‘80040e14’
‘aaaAND’ is not a recognized built-in function name.
d:websiteswww.automatiseringgids.nlwwwrootnews../inc/inc_newslist.asp, line 189
Uit deze melding kan worden opgemaakt waar de asp-pagina zich fysiek op de server bevindt. Tevens wordt duidelijk, dat de waarde ‘aaa’ midden in een sql-statement is geplaatst, namelijk voor het keyword ‘AND’.
Inmiddels is deze kennis gebruikt om enkele asp-files van een andere naam te voorzien (vrijdag 25 augustus). Hierdoor was het gedurende enkele uren niet mogelijk om nieuwsberichten op te vragen. Een anoniem bericht naar de webmaster (leest hij zijn post wel?) is blijkbaar nog niet aangekomen. De bestanden met de gewijzigde namen staan er nog steeds (zie: www.automatiseringgids.nlincINC_newslist.bak). Waarschijnlijk is slechts een back-up teruggezet. Ook is de gehele website van vrijdagavond 25 augustus tot en met zondagmiddag 27 augustus uit de lucht geweest, nadat door derden het wachtwoord van de ‘SA’-gebruiker werd aangepast. Een mailtje naar de postmaster was noodzakelijk om het systeem weer aan de praat te krijgen.
Andere incidenten
Overigens is het probleem bij de Automatiseringgids geen op zichzelf staand incident. De website van Delphi Informant Magazine (www.delphizine.com) toont in geval van een ’time-out’ naar de database de volledige naam van de ‘include file’ waarin de fout is opgetreden. In dit bestand blijken gebruikersnaam en wachtwoord van de ‘SA’-gebruiker te staan!
Ook de website van MSI (fabrikant van moederborden) is niet veel beter. Als de url:
http://www.msicomputer.com/products/detail.asp?ProductID=128
wordt vervangen door:
http://www.msicomputer.com/products/detail.asp?ProductID=(select%20@@version)
verschijnt de volgende foutboodschap:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘Microsoft SQL Server 7.00 – 7.00.623 (Intel X86) Nov 27 1998 22:20:07 Copyright (c) 1988-1998 Microsoft Corporation Small Business Server Edition on Windows NT 4.0 (Build 1381: Service Pack 5) ‘ to a column of data type int.
/products/detail.asp, line 36
Een oplettende lezer herkent hierin het versienummer van de database-server.
Nog leuker
http://www.msicomputer.com/products/detail.asp?ProductID=(select%20system_user)
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘web’ to a column of data type int.
/products/detail.asp, line 36
Hiermee kan zelfs de gebruikersnaam (‘web’) worden achterhaald waarmee de verbinding naar SQL Server wordt gemaakt. Dit gegeven is voldoende om het wachtwoord te wijzigen (zie de ‘books online’, onder ‘sp_password), met een vastgelopen website als resultaat.
De moraal van dit verhaal: in ieder programma zitten fouten, dat geldt ook voor ASP’s. Het vervelende is echter, dat websites vaak door zeer grote aantallen gebruikers worden bezocht. Hoe klein de fout dan ook moge wezen, vroeg of laat wordt hij ontdekt. En als dat een beveiligingslek blijkt, kunnen de gevolgen enorm zijn. Houdt bij het ontwikkelen van websites daarom vanaf het eerste moment serieus rekening met beveiliging en test dit ook uitgebreid.
Remko Stouthart
Inprise Certified Consultant (Delphi)
Microsoft Certified Professional (SQL Server)
Beste redactie , ik krijg onderstaande melding als ik op een site voor opiniepeilingen wil.
Is dit een ersnstige zaak, ik heb er weinig verstand van.
Vr. Gr.
Peter Kiksen
melding die ik zie:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name ‘undefined’.
/survey_startOB.asp, line 51