Uge 35: OWASP Top 10
- Kenneth H Sørensen
- Sep 2
- 12 min read

De mest udbredte trusler
For at kunne bygge sikre IT-løsninger, må man først forstå, hvilke trusler man står overfor.
OWASP
Open Worldwide Application Security Project
Er en organisation der arbejder for at forbedre IT-sikkerhed i software. Organisation gør deres værktøjer og materialer tilgængelig for alle gennem open source projekter.
OWASP Projekter
OWASP Top 10:2021 - dok om de mest kritiske sikkerhedsrisikoer ved webapplikationer
OWASP API Security Top 10:2023 - dok om sårbarheder og sikkerhedsrisikoer ved API'er
...
Jeg vil gennemgå de mest udbredte trusler i webapplikationer (OWASP Top 10:2021) som grundlag for videre læring.
En ny Top 10 udkommer i slutningen af 2025. Jeg vil senere på semesteret undersøge om trusselsbilledet har ændret sig.
I næste uge (Uge 36) vil jeg se på OWASP API Security Top 10:2023, da den også er relevant for vores semesterprojekt og mine valgfalg (Backend-udvikling & API-design og IT-sikkerhed).
Web Application Security
OWASP Top 10:2021

Broken Acces Control (A01:2021)
Access Control
Sikrer at brugere kun kan handle inden for deres tilsigtede rettigheder (autoriseret)
Broken Access Control
Kan betyder at information eksponeres, modificeres, bliver ødelagt eller at en bruger handler uden for sine privilegier (uautoriseret)
Typiske sårbarheder
Løs adgangskontrol - brud på Least Privilege / Deny by default principper
Adgangskontrol forbigås - ændring af URL, state, HTML-side eller API-request
Mulighed for at se/redigere andres konto via forudsigelige ID - Insecure Object Ref.
Manglende adgangskontrol til API-metoderne POST, PUT, DELETE
Elevering af privilegier - f.eks. rolle (uautoriseret)
Metadata manipulering - Ændring/misbrug af JSON Web Token (JWT) access control token, cookies eller hidden fields (HTML input field)
CORS fejl - API tilgængelig fra uautoriseret domæner
Force browsing - Adgang til beskyttede sider / admin-sider uden privilegie
Undgås ved
Server-side adgangskontrol - server-side eller API (ikke klienten)
Deny by default - alt der ikke er offentlig ressource (giv eksplicitte tilladelser)
Central adgangskontrol - én adgangskontrol som genbruges i applikationen samt minimal brug af CORS (Cross-Origin Resource Sharing)
Record ownership - tjek at bruger kun kan tilgå (CRUD) egne data
Håndhævelse af forretningsregler - i classes / services, IKKE kun UI eller klienten
Korrekt web server konfig - slå directory listing fra, og undgå følsomme filer i web roots
Logging af access control fejl - alarm ved gentagne fejl
Rate limit API og controller kald - begræns automatiserede angreb
Sessions og tokens - invalider session-ID ved logout og gør JWT kortlivet
(hvis JWT er længerelevende, så følg OAuth standarder for at kunne tilbagekalde adgang)
Cryptographic Failures (A02:2021)
Sensititive Data Exposure fra 2017
Kryptering
Beskytter følsomme data i transit (under transport) og i hvile (lagret)
Cryptographic Failures
Kan betyde at følsomme data eksponeres eller system kompromitteres
Typiske sårbarheder
Klartekst data i transit - HTTP, FTP, SMTP eller intern trafik uden TLS (Transport Layer Sec.)
Svage/forældede algoritmer eller protokoller
Dårlig nøglehåndtering - hardcoded passwords, genbrugte/svage nøgler, manglende rotation eller pushed til GitHub
Manglende håndhævelse af kryptering - HTTP headers der tvinger HTTPS (f.eks HSTS)
Ignorerede / usikre initialization vectors (VI) - samme besked krypteres ens
dvs. samme input = samme output
Passwords brugt som nøgler - for svage uden Password Base Key Derivation Function (PBKDF2). Crypto-nøgler er lange, tilfældige og svære at gætte
Svag randomness - nøgler, IV'er og session tokens kræver tilfældige tal, svære at gætte
Forældede hashfunktioner - f.eks. er MD5 og SHA1 er ikke længere sikre
Forældede padding-metoder - fejl i padding kan angribes
Når data ikke fylder en hel blokstørrelse (128 bit) skal den fyldes ("paddes")
Kryptografiske fejl meddelelser - Utilsigtet afsløring af information
responstid (timing angreb)
fejlmeddelelser (padding oracle attack)
Undgås ved
Klassificering af data - hvilken data kræver kryptering / er følsom (eks.: kortnummer)
Undgå at gemme unødig data - slet hurtigst muligt, tokenisering eller truncation af data
Krypter data i hvile - følsomme data, filer og backups i databaser (DB) krypteres
Brug stærke algoritmer, protokoller og nøgler (+ korrekt håndtering)
Krypter data i transit - protokoller som TLS. Håndhæv kryptering med direktiver som HTTP Strict Transport Security (HSTS)
Undgå caching af følsom data
Implementering af sikkerhedskontroller afhængig af klassificering - se første punkt
Undgå forældede protokoller til transport af følsom data - FTP og SMTP
Password hashfunktioner - gem passwords ved brug af adaptive hashing og salt med work factor (Argon2, scrypt, bcrypt, PBKDF2)
Brug initialization vector (VI) korrekt - generér med CSPRNG, brug ikke samme IV to gange til samme nøgle
Authenticated encryption - kryptering med integritetskontrol
dvs. verificering af integritet / tjek at data er uændret
Sikker nøglegenerering - kryptografisk, random, gem i byte arrays (ikke strings) hvis password bruges og konverter via key derivation
Stærk randomness - brug kryptografisk tilfældighed hvor der behov (CSPRNG) undgå forudsigelige seeds / lav entropi
Undgå forældede hashfunktioner og padding-metoder - MD5 og SHA1...
Test effektiviteten af konfiguration og settings
Injection (A03:2021)
Inkluderer Cross-Site Scripting (XSS) fra 2017
Injection
Når brugerdata bruges direkte i kommandoer eller queries uden korrekt validering, filtrering eller escaping.
Kan føre til eksponering, ændring eller sletning af data samt kompromittering af hele systemet
Typiske sårbarheder
Manglende validering, filtrering og sanitering af input - eks.: forventer id som heltal, men accepterer tegn
1 OR 1=1Dynamiske queries / ikke-parametriserede kald - brugerinput blandes med kode og fortolkes som en del af kommandoen
var q = "SELECT * FROM Users WHERE id = " + userInput; // ikke-param query
db.Execute(q); // direkte til SQL-interpreter fortolker både kode + inputORM-injection - ondsindet data i ORM-parametre kan udvide søgning og udtrække ekstra records (Object Relational Mapper f.eks Entity Framework)
// farligt - bruger skriver: ' OR 1=1 --
var users = await db.Users
.FromSqlRaw($"SELECT * FROM Users WHERE Name = '{input}'")
.ToListAsync();
// sikkert - input sendes som parameter
var users = await db.Users
.FromSqlInterpolated($"SELECT * FROM Users WHERE Name = {input}");
.ToListAsync();Sammenkædning af brugerinput med SQL eller kommandoer (concat i dynamic queries, commands, stored procedures)
SET @sql = 'SELECT * FROM Users WHERE id = ' + @userInput;
EXEC(@sql); -- concat i stored procedure = sårbarAlmindelige injection-typer:
SQL, NoSQL, OS Command, ORM, LDAP, Expression Language (EL), OGNL
XSS (Cross-Site Scripting) - giver angriber adgang kodekørsel i brugerens browser
(kan stjæle cookies/sessioner, manipulere DOM)
Undgås ved
Seperation af inputdata, kommandoer og queries
Brug sikre API’er eller framwork - metoder/biblioteker holder data og kommando adskilt
ADO.NET (C#)
var cmd = new SqlCommand("SELECT * FROM Users WHERE Name = @name", conn);
cmd.Parameters.AddWithValue("@name", input);Entity Framework Core (C# / LINQ / ORM)
var users = db.Users.Where(u => u.Name == input).ToList();Stored procedures - parameteriserede kald, ingen dynamisk kald (concat)
Positiv server-side inputvalidering - whitelist frem for blacklist (extra ikke erstatning)
Escaping - hvis bygning af streng er absolut nødvendig, neutralisér specialtegn
Struktur-navne (tabel, kolonne osv.) må aldrig komme fra brugerinput
Automatiseret test - af alle parametre, headers, URL, cookies, API-payloads: JSON, SOAP, XML
Integrér SAST, DAST og IAST i CI/CD - find injection-fejl inden produktion
SAST: Statisk kildekodeanalyse før kørsel - finder concat-mønstre, usikre API-kald
DAST: Dynamisk black-box test mod kørende app - prøver reelle payloads
IAST: Sensor i app under test - ser hvilke linjer der rammes af ondsindet input
Insecure Design (A04:2021)
Ny kategori 2021
Insecure Design
Opstår når systemet er bygget med design- eller arkitekturfejl
Kan ikke rettes med perfekt kode, fordi kontrollerne aldrig blev tænkt ind fra start.
Typiske sårbarheder
Fejl i design (ikke koden) - sikkerhedskontroller fraværende / forkerte (eks. lockout, 2FA..)
Ingen trusselsmodellering - systemets flows / data er ikke analyseret ift. angreb
(eks. skadelige filtyper..)
Manglende forretningslogik-beskyttelse - f.eks ingen begrænsning på antal bookinger/køb
Svage credential-flows - usikre password recovery-metoder (eks. Q&A er ikke et sikkert identitetsbevis)
Ingen anti-bot eller rate limiting - systemet kan misbruges af scripts eller scalpers
Ubeskyttede grænser - tillid til client-side checks eller manglende tenant-separation
(eks. kun validering i browser og kunde A kan se kunde B's data)
Undgås ved
Secure Development Lifecycle - indbyg sikkerhed fra start (med AppSec specialister)
Brug af secure design patterns - genbrug allerede velprøvede komponenter og arkitekturer
Trusselsmodellering - især på auth, adgangskontrol, forretningslogik og kritiske flows
Sikkerhed i user stories - inkluder sikkerhedskrav og failure flows
Plausibility checks - valider input og processer på alle lag (frontend, backend, DB)
(eks. bestilling af et negativt antal billetter)
Tests mod trusselsmodeller - unit/integration tests af kendte angreb/misbrug af flows
(eks. bestilling af 600 biografbilletter)
Segregation - adskil tenants i alle systemlag
Ressourcebegrænsning - sæt limits på ressourceforbrug pr. bruger/service
Security Misconfiguration (A05:2021)
Inkluderer XML External Entities (XXE) fra 2017
Security Misconfiguration
Når systemer er forkert konfigureret eller mangler hardening / hærdning af indstillinger.
Kan betyde eksponering af data og systemkompromittering.
Typiske sårbarheder
Manglende hardening - system, framework eller cloud-tjeneste ikke konfig / sikret korrekt
Unødvendige features - åbne porte, services, konti, privilegier
Default accounts/passwords - indstillinger ikke ændret
Fejlmeddelser - detaljerede fejl/stack traces vises til brugere
Manglende aktivering af sikkerhedsfunktioner (ofte efter opgraderinger)
Usikre server/framework indstillinger - f.eks i ASP.NET, biblioteker og databaser
Manglende security headers - HTTP-responses uden sikre direktiver
(eks. HSTS, CSP, X-Frame-Options ...)
IKKE-opdateret software - se Vulnerable & Outdated Components nedenfor
Undgås ved
Hardening-processer - gentagelig, automatiseret opsætning af sikre miljøer
(Dev, QA, Prod)
Minimal platform - fjern unødvendige komponenter, services, dokumentation og frameworks
Patch management - hold configs og software opdateret, inkl. cloud-permissions
(eks. S3 buckets)
Segmentation/Isolation - adskil komponenter og tenants (ACLs, containerization, netværkssegmenter)
Security headers - send sikre direktiver til klienter (HSTS, CSP, X-Content-Type-Options ...)
Automatiseret validering - scripts/scans der tjekker configs løbende i alle miljøer
Vulnerable and Outdated Components (A06:2021)
Vulnerable and Outdated Components
Når software, frameworks eller biblioteker er sårbare, forældede eller ikke vedligeholdes.
Sårbarheder i komponenter kan give samme rettigheder som applikationen selv.
Typiske sårbarheder
Manglende overblik - ift. versioner af komponenter (server- og client-side)
Forældet / sårbar / unsupported software - operativsystemer (OS), web-/applikationsserver, database management system (DBMS), applikationer, API'er, runtime environments, frameworks og biblioteker
Ingen scanning - ingen regelmæssige vulnerability scans eller overvågning af:
CVEs/NVD relateret til komponenter som benyttes
(Common vulnerability and Exposures / National Vulnerability Database)
Langsom patch-proces - unødig eksponeringsvindue for angreb
Manglende patch-proces - kompatibilitetstest og benyttelse af opdaterede biblioteker
(ældre libraries har muligvis sårbarheder)
Usikre konfigurationer - se Security Misconfiguration ovenfor
Undgås ved
Patch management - hurtig proces for opdateringer og fjernelse af ubrugte komponenter
Inventar og overvågning - kend versioner af alle dependencies (client/server) og hold øje med CVEs/NVD
Software Composition Analysis (SCA) - automatisér med værktøjer (Dependency Check, retire.js, GitHub advisories)
Kun officielle kilder - hent komponenter fra trusted sources via sikre links, foretræk signed packages
Overvåg vedligeholdelse - brug ikke libraries uden aktiv patching, hvis uundgåeligt, brug “virtual patching” (WAF, IDS)
Langsigtet plan - kontinuerlig monitorering, triagering (vurder alvorlighed) og opdatering gennem hele app'ens livscyklus
Identification and Authentication Failures (A07:2021)
Tidligere Broken Authentication (2017)
Identification and Authentication Failures
Når brugeridentitet, login eller sessioner ikke håndteres sikkert.
Kan føre til kontoovertagelse, credential reuse, brute force eller session hijacking.
Typiske sårbarheder
Automatiserede angreb - credential stuffing med lister af brugernavne/passwords
Brute force - ingen begrænsning på antal loginforsøg
Svage/default passwords - f.eks “Password1” eller “admin”
Usikre credential recovery flows - Q&A (ikke et sikkert identitetsbevis)
Svag password storage - passwords gemt i klartekst, svagt krypteret eller hashed uden salt
Manglende MFA - ingen eller ineffektiv multi-factor authentication
Session ID i URL - gør det nemt at opsnappe og misbruge sessionen
Session reuse - samme session-ID genbruges efter login (betyder andre kan genbruge)
Manglende session invalidation - sessioner/tokens udløber ikke korrekt ved logout eller inaktivitet
Undgås ved
Multi-factor authentication - bevis for identitet beskytter mod credential stuffing, brute force og reuse
Ingen default credentials - fjern fabriksindstillinger, især for admin-konti (admin/admin)
Weak password checks - afvis passwords fra lister over de mest brugte (f.eks top 10.000)
Moderne password-politikker - følg NIST 800-63b mht. længde, kompleksitet, rotation osv.
(National Institute of Standards and Technology)
Hærdede credential flows - brug samme fejlmeddelelse for at undgå account enumeration angreb
Rate limiting / delay - begræns eller forsink gentagne loginforsøg, log hændelser og alarmer ved mistænkelig aktivitet
Sikker session management - brug server-side session manager, generér nyt tilfældigt session-ID efter login, aldrig i URL, invalider ved logout, inaktivitet og timeouts
Software and Data Integrity Failures (A08:2021)
Ny kategori 2021
Inkluderer Insecure Deserialization 2017
Software and Data Integrity Failures
Handler om situationer, hvor kode eller infrastruktur ikke har mekanismer til at sikre integritet.
Kan føre til ondsindet kode, kompromitterede opdateringer eller manipulation af data.
Typiske sårbarheder
En applikation kan blive sårbar, hvis den stoler på kode eller komponenter fra kilder, den ikke kan verificere
Tredjeparts-komponenter fra usikre kilder - plugins, libraries eller modules hentet fra uofficielle repos (NuGet, npm, Maven osv.) hvor pakker kan være manipuleret (f.eks typo-squatting)
Content Delivery Networks (CDNs) - loader scripts direkte fra eksternt CDN uden integritetstjek (f.eks <script src="...">)
Auto-updates uden verificering - app henter opdateringer uden at tjekke digital signatur
angriber kan erstatte med ondsindet kode
Insecure CI/CD pipeline - manglende adgangskontrol/isolation i build- og deploy-pipelines
angriber kan manipulere udviklers commit og injicere ondsindet kode eller config
Insecure deserialization
serialized objekter/data sendes til klienten uden signatur/validering
klient kan manipulere og sende tilbage
risiko for code execution eller data manipulation
Undgås ved
Digital signatur / integritetstjek - verificér at software/data kommer fra forventet kilde og ikke er ændret
Trusted repositories - hent libraries fra officielle kilder
Hvis virksomhed har høj risikoprofil brug intern vetted repo
Supply chain security tools - f.eks OWASP Dependency Check, CycloneDX, SCA-værktøjer til afhængighedskontrol (Software Composition Analysis)
Code & config review - Find og forhindre ondsindet kode eller config-fejl i pipelines
Sikker CI/CD pipeline - korrekt segregation, konfiguration og adgangskontrol i build/deploy-processer
Sikker serialization - send ikke serialized data til klienter uden et integritetstjek, f.eks digital signatur
Security Logging and Monitoering Failures (A09:2021)
Tidligere Insufficient Logging and Monitoring 2017
Security Logging and Monitoring Failures
Handler om manglende evne til at opdage, eskalere og reagere på aktive brud.
Kan føre til at angreb ikke opdages, og at hændelser ikke kan spores eller efterforskes.
Typiske sårbarheder
Manglende logging - vigtige events (logins, mislykkedes logins, transaktioner) logges ikke
Dårlige logmeddelelser - advarsler og fejl giver uklare eller utilstrækkelige logs
Manglende overvågning - logs fra apps og API'er bliver ikke analyseret for mistænkelig aktivitet
Lokale logs - logs gemmes kun lokalt og kan let slettes, manipuleres eller gå tabt
Ingen effektiv alarmering og eskalering - manglende tærskler for hændelser og procedurer for eskalering for at kunne reagere på angreb i tide
Sikkerhedstest udløser ingen alarm - uopdaget pentests og DAST-scanninger (f.eks OWASP ZAP) afslører at reelle angreb også vil passere ubemærket
Ingen real-time detection - app kan ikke opdage og advare om aktive angreb
Information lækage i logs - brugere/angribere kan se log- og alarmdata
Log injection - brugerinput logges uden korrekt encoding, så angribere kan indsætte falske poster og skjule deres aktivitet
Undgås ved
Logging af kritiske hændelser - log login, adgangskontrol og valideringsfejl med kontekst nok til at identificere angribere
Standardiseret logformat - så logs kan læses af log management-løsninger
Korrekt encoding af logdata - undgå log injection og misbrug af logsystemet
Audit trail på værdifulde transaktioner - f.eks append-only databaser eller integritetskontroller, så logs ikke kan ændres
Effektiv overvågning og alarmering - DevSecOps sikrer hurtig detektion og respons på mistænkelig aktivitet
Incident response plan - etabler eller brug en plan som NIST 800-61r2 til håndtering og genopretning
Værktøjer - f.eks OWASP ModSecurity Core Rule Set eller ELK-stack til logkorrelation, dashboards og alarmering
Server Side Request Forgery (SSRF) (A10:2021)
Ny kategori 2021
SSRF
Sårbarhed opstår når applikation henter ressourcer fra en bruger angivet URL uden validering.
Angriber kan tvinge serveren til at sende requests til uventede destinationer - også bag firewalls og virtual private network (VPN) / network access control list (ACLs).
Typiske sårbarheder
User-angivet URL uden validering - app accepterer blindt URL (f.eks billedupload). Angriber kan få server til at hente ressourcer den ikke burde
Ingen begrænsning af skema/port/destination - uden whitelist kan angriber tilgå interne services eller følsomme filer
HTTP-redirects slået til - requests kan omdirigeres til ondsindede mål
DNS-rebinding / TOCTOU-angreb - udnytter forskel mellem valideringstidspunkt af URL og faktisk brug af URL
Dårlige “deny lists” - regex/blacklists kan let omgås med alternative payloads
Manglende netværkssegmentering - server kan nå ALLE interne ressourcer
Undgås ved
Netværkslag
Segmentér adgangen til eksterne ressourcer - isolér funktioner, der laver udgående kald
Deny by default-firewalls - bloker alt internt trafik, tillad kun nødvendige forbindelser
Lifecycle for firewall regler - ejerskab, opdatering og logging af alle regler
Applikationslag
Valider input - sanitér og verificér at URL'er følger whitelist af skema (http/https),
port (80/443), hosts/domæner (tilladte destinationer)
Ingen rå responses - returnér ikke ukontrollerede svar direkte til klienten
Deaktiver redirects - følg ikke automatisk HTTP-omdirigeringer
Vær opmærksom på DNS-rebinding og TOCTOU - dobbelttjek konsistens mellem input og faktisk request
Tjek at DNS-navnet stadig peger på den samme (tilladte) IP, når requesten faktisk udføres - Ikke kun under første validering
Yderligere tiltag
Ingen følsomme services på frontend-systemer - f.eks OpenID eller interne API'er
Kontrol af lokal trafik - serveren skal ikke kunne kalde localhost og loopback-interfaces
VPN/netværkskryptering for særlige grupper - hvis der er meget høje krav til beskyttelse
API Security
OWASP API Security Top 10:2023
Se Uge 36
Refleksion
Ved at læse OWASP Top 10:2021 har jeg fået et overblik over de mest almindelige trusler. Derudover forstår jeg nu bedre at langt de fleste sårbarheder kommer fra design- og procesfejl.
I sidste uge (Uge 34) læste jeg om CIA Triad. Modellen er viser målene man sigter efter for et sikkert IT-system, og OWASP viser de ting der truer målene.
Så jeg skal designe med CIA Triad og validere mod OWASP. Udfordringer
Jeg har forsøgt at sætte mig ind i hvert punkt i listen, men der er mange nye udtryk. Det er gået op for mig hvor meget man egentlig kunne fordybe sig i hver sårbarhed.
Derfor kommer denne blog også til at fungere lidt som opslagsværk for mig.
Hvad har jeg opnået
Jeg var alligevel overrasket over hvor meget der gav mening. Vi har set lidt på nogen af de her ting i et tidligere semester.
I semester 3, arbejdede jeg meget med Access Control, og mere specifikt role based access control (RBAC). I den forbindelse arbejdede jeg en del med Identity i ASP.NET Core, user- / role management, JWT og CORS.
I sommerferien fik jeg startet et projekt hvor jeg bl.a. fik lært om refresh tokens, rotation af tokens, og kortlivet access tokens. Hvilket er ting der også nævnes i listen.
Så jeg har fået et større overblik og jeg kan mærke at min forståelse bliver bedre.
Videre plan
IT-sikkerhed
Med denne oversigt over OWASP Top 10 (webapplikation), har jeg lagt et fundament for videre læring. Jeg vil gerne læse en anden Top 10 også, da den kunne gå hen og vise sig at være meget relevant for vores semesterprojekt og mine valgfag. Derfor vil jeg læse
OWASP API Security Top 10
OWASP Top 10:2025 (i fremtiden)
Backend-udvikling og API-design
Jeg er startet med IT-sikkerhed og har udskudt backend lidt da jeg gerne vil leve op til
secure-by-design principperne.
Jeg vil se på microservices vs. monolith architecture og hexagonal arkitektur
Ressourcer
OWASP
Hjemmeside: OWASP Top Ten
Dokumentation: OWASP Top Ten 2021
Cloudflare - Learning Center
Artikel: What is OWASP
Evt. videre læsning
OWASP
Software Assurance Maturity Model (SAMM)
OWASP Top 10:2025

