Repository navigation
Expand file tree
/
Copy path6.html
More file actions
295 lines (269 loc) · 14.4 KB
/
Copy path6.html
File metadata and controls
295 lines (269 loc) · 14.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="AnnaWiktoria">
<meta name="copyright" content="AnnaWiktoria">
<meta name="description" content="Interaktywny kurs bezpieczeństwa aplikacji webowych. Licencja CC BY-NC-SA.">
<meta http-equiv="Content-Security-Policy" content="default-src 'self';
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
script-src 'self' 'unsafe-inline';
img-src 'self' data:;">
<title>Kurs bezpieczeństwa aplikacji webowych - Lekcja 06: AuthN vs AuthZ</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<style>
/* Akcent: Neon Blue (Identity & Access) */
:root {
--accent: #2979ff;
--accent-glow: rgba(41, 121, 255, 0.3);
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>AuthN vs AuthZ</h1>
<p>MODUŁ 06: Uwierzytelnianie, Autoryzacja i Kontrola Dostępu</p>
</header>
<!-- 1. DEFINICJE -->
<section>
<h2>> RÓŻNICA, KTÓRĄ MUSISZ ZNAĆ</h2>
<p>Wiele osób używa skrótu "Auth" wymiennie, ale dla pentestera to dwa różne światy z różnymi podatnościami.
</p>
<div class="card">
<h3>1. AUTHENTICATION (AuthN) - Uwierzytelnianie</h3>
<p><strong>Pytanie:</strong> "Kim jesteś?"</p>
<p>Proces weryfikacji tożsamości (Logowanie). Sprawdzamy, czy Jan Kowalski to faktycznie Jan Kowalski.
</p>
<ul>
<li><strong>Metody:</strong> Hasło, 2FA, Biometria, Token JWT.</li>
<li><strong>Ataki:</strong> Brute-force, Credential Stuffing, Phishing, Session Hijacking.</li>
</ul>
</div>
<div class="card">
<h3>2. AUTHORIZATION (AuthZ) - Autoryzacja</h3>
<p><strong>Pytanie:</strong> "Co wolno Ci zrobić?"</p>
<p>Dzieje się PO zalogowaniu. Sprawdzamy, czy Jan Kowalski ma prawo wejść do panelu admina.</p>
<ul>
<li><strong>Metody:</strong> Role (Admin/User), ACL (Listy kontroli dostępu), Uprawnienia plików.
</li>
<li><strong>Ataki:</strong> IDOR, Privilege Escalation (Pionowe/Poziome).</li>
</ul>
</div>
</section>
<!-- 2. Broken Access Control -->
<section>
<h2>> BROKEN ACCESS CONTROL (BAC)</h2>
<p>To nr 1 na liście OWASP Top 10. Programiści często sprawdzają "czy jesteś zalogowany", ale zapominają
sprawdzić "czy masz prawo do tego konkretnego zasobu".</p>
<div class="card">
<h3>RODZAJE ESKALACJI UPRAWNIEŃ</h3>
<table>
<tr>
<th>Typ</th>
<th>Opis</th>
<th>Przykład</th>
</tr>
<tr>
<td><strong>Pionowa (Vertical)</strong></td>
<td>Zwykły użytkownik uzyskuje dostęp do funkcji Administratora.</td>
<td>User zmienia w URL <code>/user/settings</code> na <code>/admin/settings</code> i wchodzi bez
błędu 403.</td>
</tr>
<tr>
<td><strong>Pozioma (Horizontal)</strong></td>
<td>Użytkownik uzyskuje dostęp do danych INNEGO użytkownika o tych samych uprawnieniach.</td>
<td>Słynny <strong>IDOR</strong>. Jan wchodzi na fakturę Marka, zmieniając ID w URL:
<code>/invoice/100</code> -> <code>/invoice/101</code>.
</td>
</tr>
</table>
</div>
</section>
<!-- 3. SCENARIUSZE -->
<section>
<h2>> SCENARIUSZE PENTESTERA</h2>
<div class="card">
<h3>SCENARIUSZ 1: Brak Rate Limit (AuthN)</h3>
<p>Logowanie nie ma blokady po nieudanych próbach.</p>
<p><strong>Atak:</strong> Uruchamiasz Hydrę lub Burp Intruder i sprawdzasz 10,000 haseł dla konta
"admin". W końcu trafiasz.</p>
</div>
<div class="card">
<h3>SCENARIUSZ 2: IDOR (AuthZ)</h3>
<p>Aplikacja używa przewidywalnych ID: <code>GET /api/messages/1055</code>.</p>
<p><strong>Atak:</strong> Piszesz skrypt w Pythonie/Burpie, który iteruje od 1 do 10000 i pobiera
wiadomości wszystkich użytkowników serwisu. To zazwyczaj błąd o randze
<strong>HIGH/CRITICAL</strong>.
</p>
</div>
<div class="card">
<h3>SCENARIUSZ 3: Parameter Tampering</h3>
<p>Podczas rejestracji wysyłane jest żądanie:</p>
<pre><code>POST /register
{
"username": "hacker",
"password": "123",
"role": "user" <-- A co jeśli zmienisz to na "admin"?
}</code></pre>
<p>Często backend bezmyślnie przyjmuje ten parametr (Mass Assignment vulnerability).</p>
</div>
</section>
<!-- CHECKLIST -->
<section>
<h2>CHECKLISTA / RED FLAGS</h2>
<div class="card checklist-card">
<div class="checklist-item">
<span class="check-icon">⚠</span>
<div><strong>Kolejne numery ID (Sequential IDs):</strong> Zaproszenie do IDOR. Powinno się używać
UUID (losowych ciągów).</div>
</div>
<div class="checklist-item">
<span class="check-icon">⚠</span>
<div><strong>Brak 2FA na koncie admina:</strong> W dzisiejszych czasach to słaba konfiguracja (choć
nie zawsze "podatność").</div>
</div>
<div class="checklist-item">
<span class="check-icon">⚠</span>
<div><strong>Client-Side Validation:</strong> Ukrycie przycisku "Admin Panel" w HTML to nie
zabezpieczenie. Haker i tak wejdzie na URL bezpośrednio.</div>
</div>
</div>
</section>
<!-- QUIZ -->
<section id="quiz-section">
<h2>🎓 WERYFIKACJA WIEDZY</h2>
<div id="quiz-container"></div>
</section>
<footer>
<p style="text-align: center; margin-top: 50px; color: #555;">© 2026 Hack & Learn: Web Edition | Moduł
06</p>
</footer>
</div>
<!-- DANE DO QUIZU -->
<script>
const quizData = [
{
question: "Jaka jest różnica między Authentication (AuthN) a Authorization (AuthZ)?",
options: [
"AuthN to szyfrowanie, AuthZ to hashowanie.",
"AuthN sprawdza 'Kim jesteś' (logowanie), AuthZ sprawdza 'Co wolno Ci zrobić' (uprawnienia).",
"AuthN dotyczy admina, AuthZ dotyczy usera.",
"Nie ma różnicy, to synonimy."
],
correct: 1,
explanation: "Zapamiętaj: N = Name (Kim jesteś?), Z = Zezwolenie (Co możesz?). Najpierw wchodzisz do budynku (AuthN), potem próbujesz wejść do gabinetu szefa (AuthZ)."
},
{
question: "Co to jest IDOR (Insecure Direct Object Reference)?",
options: [
"Błąd, gdzie aplikacja pozwala na dostęp do obiektu (np. pliku, faktury) na podstawie ID w URL, bez sprawdzenia czy użytkownik jest właścicielem tego obiektu.",
"Rodzaj ataku DDoS.",
"Błąd w bazie danych SQL.",
"Niebezpieczne przekierowanie."
],
correct: 0,
explanation: "IDOR to klasyczny przykład Broken Access Control. Serwer ufa, że skoro znasz numer ID faktury, to masz do niej prawo. Błąd polega na braku weryfikacji właściciela po stronie backendu."
},
{
question: "Czym jest 'Credential Stuffing'?",
options: [
"Wpychaniem wirusa do pliku PDF.",
"Atakiem polegającym na użyciu loginów i haseł wyciekłych z innej strony (np. LinkedIn) do zalogowania się na Twojej stronie.",
"Zgadywaniem hasła metodą słownikową.",
"Kradzieżą ciasteczek."
],
correct: 1,
explanation: "Ludzie używają tych samych haseł wszędzie. Hakerzy biorą bazy z wycieków i automatycznie sprawdzają te pary login:hasło na Netflixie, Uberze, Facebooku itd."
},
{
type: "scenario",
question: "Jesteś zalogowany jako 'user'. Zmieniasz w ciasteczku parametr 'role=user' na 'role=admin'. Po odświeżeniu widzisz panel administratora. Jaki to typ ataku?",
options: [
"SQL Injection.",
"Privilege Escalation (Pionowe podniesienie uprawnień).",
"Cross-Site Scripting (XSS).",
"Brute Force."
],
correct: 1,
explanation: "Udało Ci się wskoczyć z niższego poziomu (user) na wyższy (admin). To klasyczna eskalacja pionowa wynikająca z ufania danym od klienta."
},
{
type: "scenario",
question: "AUDYT RYZYKA: Odkrywasz, że zmieniając ID w URL (/user/100 -> /user/101) możesz pobrać pełne dane osobowe (PESEL, adres, telefon) każdego użytkownika serwisu. Co zgłaszasz klientowi i z jakim priorytetem (Severity)?",
options: [
"Information Disclosure - Low (Niska), bo to tylko dane tekstowe.",
"Broken Authentication - Medium (Średnia), bo system źle loguje.",
"Broken Access Control (IDOR) - Critical/High (Krytyczna/Wysoka), ponieważ dochodzi do masowego wycieku danych wrażliwych (PII).",
"Zgłaszam jako funkcjonalność (Works as intended)."
],
correct: 2,
explanation: "To jest pytanie rekrutacyjne! Wyciek danych osobowych (PII) to zazwyczaj High lub Critical (RODO/GDPR). Biznesowo to katastrofa dla firmy."
},
{
question: "Dlaczego stosowanie UUID (np. 550e8400-e29b...) jest bezpieczniejsze niż ID sekwencyjnych (1, 2, 3...)?",
options: [
"UUID szybciej działa w bazie danych.",
"UUID uniemożliwia proste zgadywanie (iterowanie) identyfikatorów innych użytkowników, co utrudnia ataki IDOR.",
"UUID jest zaszyfrowane.",
"UUID zajmuje mniej miejsca."
],
correct: 1,
explanation: "Sekwencyjne ID (1, 2, 3) pozwalają hakerowi łatwo sprawdzić wszystkich użytkowników pętlą 'for'. UUID jest losowe i praktycznie niemożliwe do zgadnięcia."
},
{
question: "Co to jest 'Horizontal Privilege Escalation' (Pozioma eskalacja)?",
options: [
"Uzyskanie dostępu do konta administratora.",
"Przejęcie konta innego użytkownika o TYCH SAMYCH uprawnieniach (np. Marek wchodzi na konto Ani).",
"Atak na serwer w tej samej sieci Wi-Fi.",
"Zwiększenie limitu transferu danych."
],
correct: 1,
explanation: "Pozioma = poruszasz się w bok, na tym samym szczeblu drabiny uprawnień, ale wchodzisz do cudzego pokoju."
},
{
type: "scenario",
question: "Widzisz formularz logowania, który po 3 błędnych próbach nie blokuje konta ani nie wprowadza opóźnienia (CAPTCHA/Rate Limit). Na jaki atak jest podatny?",
options: [
"SQL Injection.",
"Brute-Force / Password Spraying.",
"XSS.",
"Man-in-the-Middle."
],
correct: 1,
explanation: "Brak Rate Limitngu pozwala atakującemu sprawdzać tysiące haseł na minutę. To błąd konfiguracyjny mechanizmu AuthN."
},
{
question: "Czy ukrycie przycisku 'Panel Admina' w CSS (display: none) to skuteczna autoryzacja?",
options: [
"Tak, użytkownik go nie widzi, więc nie kliknie.",
"Nie. To 'Security by Obscurity'. Atakujący może podejrzeć kod źródłowy, znaleźć link i wejść na niego bezpośrednio.",
"Tak, ale tylko w przeglądarce Chrome.",
"Zależy od frameworka."
],
correct: 1,
explanation: "Kontrola dostępu (AuthZ) MUSI odbywać się na serwerze (backendzie). Frontend służy tylko do wyświetlania. Hakerzy nie używają przycisków, używają żądań HTTP."
},
{
type: "scenario",
question: "AUDYT RYZYKA: Znajdujesz panel admina dostępny pod /admin bez logowania (ktokolwiek wejdzie, jest adminem). Jakie Severity?",
options: [
"Low",
"Medium",
"Critical",
"Info"
],
correct: 2,
explanation: "To Authentication Bypass. Całkowite przejęcie kontroli nad systemem bez żadnego wysiłku. Definicja Critical."
}
];
</script>
<script src="quiz.js"></script>
</body>
</html>