Cross-site scripting (XSS)
زمان مطالعه :6 دقیقه
What is XSS, How does XSS work? Impact of an attack
Cross-site scripting
https://portswigger.net/web-security/cross-site-scripting#what-is-cross-site-scripting-xss
در این بخش، ما توضیح میدهیم که cross-site scripting چیست، انواع مختلفی از cross-site scripting vulnerabilities را توضیح میدهیم و نحوه پیدا کردن و جلوگیری از cross-site scripting را توضیح میدهیم.
?What is cross-site scripting (XSS)
Cross-site scripting (که به عنوان XSS نیز شناخته میشود) یک web security vulnerability است که به یک attacker اجازه میدهد تعاملات کاربران با یک برنامه آسیبپذیر را به خطر بیندازد. این امکان را به یک attacker میدهد تا same origin policy را که برای جدا کردن سایتهای مختلف از یکدیگر طراحی شده است، دور بزند. Cross-site scripting vulnerabilities به طور معمول به یک attacker اجازه میدهد تا به عنوان یک کاربر قربانی تظاهر کند، هر عملیاتی که کاربر قادر به انجام آن است را انجام دهد و به هر یک از دادههای کاربر دسترسی پیدا کند. اگر کاربر قربانی دسترسی privileged درون برنامه داشته باشد، ممکن است attacker بتواند کنترل کامل بر تمام قابلیتها و دادههای برنامه را بدست آورد.
?How does XSS work
Cross-site scripting با دستکاری یک وبسایت آسیبپذیر کار میکند تا کد JavaScript مخرب را به کاربران برگرداند. هنگامی که کد مخرب در مرورگر قربانی اجرا میشود، attacker میتواند تعاملات آنها با برنامه را کاملاً به خطر بیندازد.
Labs
اگر از قبل با مفاهیم اساسی XSS vulnerabilities آشنا هستید و فقط میخواهید تمرین کنید که چگونه آنها را در اهداف واقعی و عمداً آسیبپذیر استخراج کنید، میتوانید به تمامی آزمایشگاههای موجود در این موضوع از طریق لینک زیر دسترسی پیدا کنید.
XSS proof of concept
میتوانید اکثر انواع XSS vulnerability را با تزریق یک payload که باعث میشود مرورگر شما بعضی JavaScript های دلخواه را اجرا کند، تأیید کنید. استفاده از تابع alert() برای این منظور مدتها است که یک روش معمول است، زیرا کوتاه، بیضرر و به سختی قابل چشمپوشی است زمانی که با موفقیت فراخوانی میشود. در واقع، شما با فراخوانی alert() در مرورگر قربانی شبیهسازی شده، اکثر آزمایشگاههای XSS ما را حل میکنید.
متأسفانه، اگر از Chrome استفاده میکنید، مشکلی وجود دارد. از نسخه 92 به بعد (20 ژوئیه 2021)، cross-origin iframes از فراخوانی alert() منع شدهاند. از آنجایی که این موارد برای ساخت برخی از حملات پیشرفته XSS استفاده میشوند، گاهی اوقات نیاز به استفاده از payload جایگزین دارید. در این شرایط، ما تابع print() را توصیه میکنیم. اگر علاقهمند به یادگیری بیشتر درباره این تغییر و دلیل تمایل ما به print() هستید، وبلاگ ما در این موضوع را بررسی کنید.
از آنجایی که قربانی شبیهسازی شده در آزمایشگاههای ما از Chrome استفاده میکند، آزمایشگاههای مربوطه را تغییر دادهایم تا بتوانند با استفاده از print() نیز حل شوند. این تغییرات را در دستورالعملها درج کردهایم.
?What are the types of XSS attacks
سه نوع اصلی از XSS attacks وجود دارد. اینها عبارتند از:
· Reflected XSS، که در آن اسکریپت مخرب از HTTP request فعلی میآید.
· Stored XSS، که در آن اسکریپت مخرب از database وبسایت میآید.
· DOM-based XSS، که در آن اسیبپذیری در client-side code به جای server-side code وجود دارد.
Reflected cross-site scripting
Reflected XSS سادهترین نوع cross-site scripting است. این اتفاق زمانی رخ میدهد که یک برنامه دادهای را در یک HTTP request دریافت کند و آن داده را به طور ناامن در immediate response قرار دهد.
در اینجا یک مثال ساده از یک reflected XSS vulnerability آورده شده است:
https://insecure-website.com/status?message=All+is+well.
<p>Status: All is well.</p>
برنامه هیچ پردازش دیگری روی داده انجام نمیدهد، بنابراین یک attacker به راحتی میتواند یک حمله مانند این را بسازد:
https://insecure-website.com/status?message=<script>/+Bad+stuff+here...+/</script>
<p>Status: <script>/* Bad stuff here... */</script></p>
اگر کاربر از URL ساخته شده توسط attacker بازدید کند، اسکریپت attacker در مرورگر کاربر، در زمینه session آن کاربر با برنامه اجرا میشود. در آن لحظه، اسکریپت میتواند هر عملیاتی را انجام دهد و هر دادهای که کاربر به آن دسترسی دارد را بازیابی کند.
Read more
· Reflected cross-site scripting
· Cross-site scripting cheat sheet
Stored cross-site scripting
Stored XSS (که به عنوان persistent یا second-order XSS نیز شناخته میشود) زمانی رخ میدهد که یک برنامه دادهای را از یک منبع غیرقابل اعتماد دریافت کند و آن داده را به طور ناامن در HTTP responses بعدی خود قرار دهد.
داده مورد نظر ممکن است از طریق HTTP requests به برنامه ارسال شود؛ برای مثال، نظرات در یک پست وبلاگ، نامهای کاربری در یک اتاق گفتگو، یا اطلاعات تماس در یک سفارش مشتری. در موارد دیگر، داده ممکن است از منابع غیرقابل اعتماد دیگر وارد شود؛ برای مثال، یک برنامه وبمیل (webmail) که پیامهای دریافتی از طریق SMTP را نمایش میدهد، یک برنامه بازاریابی که پستهای شبکههای اجتماعی را نمایش میدهد، یا یک برنامه network monitoring که دادههای بستهها از ترافیک شبکه را نمایش میدهد.
در اینجا یک مثال ساده از یک stored XSS vulnerability آورده شده است. یک برنامه message board به کاربران اجازه میدهد پیامهایی ارسال کنند که برای دیگر کاربران نمایش داده میشود:
<p>Hello, this is my message!</p>
برنامه هیچ پردازش دیگری روی داده انجام نمیدهد، بنابراین یک attacker به راحتی میتواند یک پیام ارسال کند که دیگر کاربران را هدف قرار میدهد:
<p><script>/* Bad stuff here... */</script></p>
Read more
Cross-site scripting cheat sheet
DOM-based cross-site scripting
DOM-based XSS (که به عنوان DOM XSS نیز شناخته میشود) زمانی رخ میدهد که یک برنامه حاوی کد client-side JavaScript باشد که دادهای را از یک منبع غیرقابل اعتماد به طور ناامن پردازش میکند، معمولاً با نوشتن دادهها با DOM.
در مثال زیر، یک برنامه از JavaScript برای خواندن value از یک input field و نوشتن آن value در یک element در HTML استفاده میکند:
;var search = document.getElementById('search').value
;var results = document.getElementById('results')
;results.innerHTML = 'You searched for: ' + search
اگر attacker بتواند مقدار input field را کنترل کند، به راحتی میتواند یک مقدار مخرب بسازد که باعث اجرای اسکریپت خودش شود:
You searched for: <img src=1 onerror='/* Bad stuff here... /'>
در یک حالت معمولی، input field از بخشی از HTTP request مانند یک URL query string parameter پر میشود، که به attacker اجازه میدهد حملهای را با استفاده از یک URL مخرب تحویل دهد، به همان روش reflected XSS.
Read more
DOM-based cross-site scripting
?What can XSS be used for
یک attacker که از یک cross-site scripting vulnerability سوءاستفاده میکند، معمولاً قادر است:
· تظاهر یا جعل هویت کاربر قربانی.
· انجام هر عملی که کاربر قادر به انجام آن است.
· خواندن هر دادهای که کاربر به آن دسترسی دارد.
· گرفتن اطلاعات ورود کاربر.
· انجام defacement مجازی از وب سایت.
· تزریق قابلیت trojan به وب سایت.
Impact of XSS vulnerabilities
تأثیر واقعی یک XSS attack به طور کلی بستگی به ماهیت برنامه، عملکرد و دادههای آن و وضعیت کاربر آسیبدیده دارد. به عنوان مثال:
· در یک برنامه بروشور، که همه کاربران ناشناس هستند و همه اطلاعات عمومی است، تأثیر معمولاً حداقلی خواهد بود.
· در یک برنامه که دادههای حساس را نگه میدارد، مانند تراکنشهای بانکی، ایمیلها، یا سوابق بهداشتی، تأثیر معمولاً جدی خواهد بود.
· اگر کاربر آسیبدیده دارای دسترسیهای بالاتر درون برنامه باشد، تأثیر معمولاً بحرانی خواهد بود و به attacker اجازه میدهد کنترل کامل بر برنامه آسیبپذیر را بدست آورد و همه کاربران و دادههای آنها را به خطر بیندازد.
Read more
Exploiting cross-site scripting vulnerabilities
How to find and test for XSS vulnerabilities
بیشتر XSS vulnerabilities را میتوان سریع و قابل اعتماد با استفاده از Burp Suite's web vulnerability scanner پیدا کرد.
تست دستی برای reflected و stored XSS معمولاً شامل ارائه یک ورودی ساده و یکتا (مانند یک short alphanumeric string) به هر نقطه ورودی در برنامه، شناسایی هر محلی که ورودی ارائه شده در HTTP responses بازگشت داده میشود و تست هر محل به طور جداگانه برای تعیین اینکه آیا ورودی مناسبی میتواند برای اجرای JavaScript دلخواه استفاده شود. به این روش، میتوانید contextی که در آن XSS رخ میدهد را تعیین کنید و payload مناسب برای بهرهبرداری از آن را انتخاب کنید.
تست دستی برای DOM-based XSS ناشی از URL parameters شامل فرآیندی مشابه است: قرار دادن یک ورودی ساده و یکتا در parameter، استفاده از ابزارهای توسعهدهنده مرورگر (browser's developer tools) برای جستجوی این ورودی در DOM و تست هر محل برای تعیین اینکه آیا قابل بهرهبرداری است. با این حال، انواع دیگر DOM XSS سختتر شناسایی میشوند. برای یافتن اسیبپذیری مبتنی بر DOM در ورودیهای غیر از URL (مانند document.cookie) یا sinks غیر از HTML (مانند setTimeout) هیچ جایگزینی برای بازبینی کد JavaScript وجود ندارد که میتواند بسیار وقتگیر باشد. Burp Suite's web vulnerability scanner تحلیلهای استاتیک و دینامیک JavaScript را ترکیب میکند تا به طور قابل اعتمادی شناسایی آسیبپذیری مبتنی بر DOM را خودکار کند.
Read more
Content security policy
Content security policy (CSP) یک مکانیزم مرورگر است که هدف آن کاهش تأثیر cross-site scripting و برخی اسیبپذیریهای دیگر است. اگر یک برنامه که از CSP استفاده میکند رفتارهای مشابه XSS داشته باشد، CSP ممکن است بهرهبرداری از آسیبپذیری را مختل یا جلوگیری کند. اغلب، CSP را میتوان دور زد تا exploitation از آسیبپذیری زیرین را ممکن ساخت.
Read more
Dangling markup injection
Dangling markup injection یک تکنیک است که میتواند برای گرفتن دادهها در cross-domain در مواردی که یک cross-site scripting exploit کامل ممکن نیست، به دلیل فیلترهای ورودی یا دفاعهای دیگر، استفاده شود. اغلب میتوان از آن برای گرفتن اطلاعات حساس که برای کاربران دیگر قابل مشاهده است، از جمله CSRF tokens که میتواند برای انجام اقدامات غیرمجاز به نمایندگی از کاربر استفاده شود، بهره برد.
Read more
How to prevent XSS attacks
جلوگیری از cross-site scripting در برخی موارد ساده است اما میتواند بسته به پیچیدگی برنامه و نحوه مدیریت دادههای کنترل شده توسط کاربر، بسیار سختتر باشد.
به طور کلی، جلوگیری مؤثر از XSS vulnerabilities احتمالاً شامل ترکیبی از اقدامات زیر است:
· فیلتر کردن ورودی هنگام دریافت. در نقطهای که ورودی کاربر دریافت میشود، بر اساس آنچه انتظار میرود یا ورودی معتبر است، به شدت فیلتر کنید.
· رمزگذاری دادهها هنگام خروجی. در نقطهای که دادههای کنترل شده توسط کاربر در HTTP responses خروجی میشود، خروجی را رمزگذاری کنید تا از تفسیر آن به عنوان محتوای فعال جلوگیری کنید. بسته به زمینه خروجی، این ممکن است نیاز به اعمال ترکیبهای HTML، URL، JavaScript، و CSS encoding داشته باشد.
· استفاده از response headers مناسب. برای جلوگیری از XSS در HTTP responses که قرار نیست هیچ HTML یا JavaScript داشته باشند، میتوانید از headers Content-Type و X-Content-Type-Options استفاده کنید تا اطمینان حاصل کنید که مرورگرها responses را به روشی که شما قصد دارید تفسیر میکنند.
· Content Security Policy . به عنوان آخرین خط دفاعی، میتوانید از Content Security Policy (CSP) استفاده کنید تا شدت هر XSS vulnerabilities که هنوز رخ میدهد را کاهش دهید.
Read more
Find XSS vulnerabilities using Burp Suite's web vulnerability scanner
Common questions about cross-site scripting
چقدر XSS vulnerabilities رایج هستند؟ XSS vulnerabilities بسیار رایج هستند و احتمالاً رایجترین web security vulnerability هستند.
چقدر XSS attacks رایج هستند؟ به دست آوردن دادههای قابل اعتماد درباره XSS attacks در دنیای واقعی دشوار است، اما احتمالاً کمتر از دیگر آسیبپذیریها بهرهبرداری میشود.
تفاوت بین XSS و CSRF چیست؟ XSS شامل واداشتن یک وب سایت به بازگرداندن JavaScript مخرب است، در حالی که CSRF شامل واداشتن یک کاربر قربانی به انجام اعمالی است که قصد انجام آنها را ندارد.
تفاوت بین XSS و SQL Injection چیست؟ XSS یک آسیبپذیری سمت کاربر است که کاربران دیگر برنامه را هدف قرار میدهد، در حالی که SQL Injection یک آسیبپذیری سمت سرور است که database برنامه را هدف قرار میدهد.
چگونه از XSS در PHP جلوگیری کنم؟ ورودیهای خود را با یک لیست سفید از characters مجاز فیلتر کنید و از type hints یا type casting استفاده کنید. خروجیهای خود را با htmlentities و ENT_QUOTES برای context های HTML یا جاوااسکریپت Unicode escapes برای context های JavaScript فرار دهید.
چگونه از XSS در Java جلوگیری کنم؟ ورودیهای خود را با یک لیست سفید از characters مجاز فیلتر کنید و از یک کتابخانه مانند Google Guava برای HTML-encode کردن خروجیهای خود برای context های HTML استفاده کنید یا از جاوااسکریپت Unicode escapes برای context های JavaScript استفاده کنید.
امیر رضا کبریادار
مشاهده مقاله های بیشتر
مقالات مرتبط
Reflected XSS, Impact, Contexts, Testing, FAQs
زمان مطالعه :5 دقیقه
.Stored XSS, Impact , Contexts, Testing for vulnerabilities
زمان مطالعه :3 دقیقه
DOM-based XSS, Testing, Exploiting
زمان مطالعه :8 دقیقه
XSS contexts: Between HTML tags, In HTML tag attributes, JavaScript, Client-side template injection
زمان مطالعه :6 دقیقه
Exploiting XSS vulnerabilities & Dangling markup injection
زمان مطالعه :4 دقیقه