اگر علاقه مند به مباحث هک و امنیت باشید، حتما با نام XSS یا حمله مبتنی بر Cross Site Scripting آشنا هستید. در ادامه با ما باشید تا با نحوه عملکرد این نوع از حملات تحت وب آشنا شوید.
[highlight]این پست تنها با هدف افزایش اطلاعات منتشر شده است. هر گونه سوء استفاده از گفته های این پست بر عهده کاربر است.[/highlight]
حمله تزریق کد (XSS) چیست؟
حمله تزریق اسکریپت از طریق وبگاه (Cross Site Scripting) که به صورت مخفف XSS نیز نامیده میشود (مخفف آن درواقع CSS است ولی با زبان طراحی CSS اشتباه گرفته شده و به همین دلیل XSS نامیده میشود)، نوعی از حملات تزریقی است که در وبسایتها پیدا میشود و در بین رایج ترین حملات تحت وب، در جایگاه اول قرار دارد.
این حمله طی آسیب پذیریای صورت میگیرد که در آن دادههای وارد شده توسط حمله کننده یا هکر، بدون فیلتر شدن تحویل کاربران داده میشود. این دادهها میتوانند کدهای جاوا اسکریپتی باشند که در سمت مرورگر کاربر اجرا شده و کارهای مختلفی میتواند برای هکر انجام دهد.
چگونه از باگ XSS جلوگیری کنیم؟
نحوه جلوگیری از باگ XSS نیاز به آگاهی برنامه نویس تحت وب از سناریوهای گوناگونی است که ممکن است طی آنها، حمله کننده باگ XSS را شناسایی کرده و اقدام به اکسپلویت کردن آن نماید. به همین دلیل یک پست جداگانه با عنوان نحوه جلوگیری از باگ Cross Site Scripting یا همان XSS منتشر کرده ایم که در آن موارد حساس به باگ XSS را بررسی کرده ایم. برای جلوگیری از باگ، به پست زیر مراجعه کنید:
اصلاح و جلوگیری از باگ تزریق کد (XSS)
چرا حملات XSS خطرناک هستند؟
حملات تزریق کد یا جاوا اسکریپت (Javascript)، به دلایل مختلفی خطرناک هستند. ازجمله:
دزدیدن کوکیها:
هکر میتواند بسیار ساده، کوکیهای مرورگر کاربر را بدزدد. از آنجایی که در کوکیها اطلاعاتی نظیر شناساگر نشست (Session) فعالِ مثلاً حساب کاربری فرد نوشته شده است، هکر میتواند با استفاده از این کوکیها و بدون وارد کردن حتی یک کاراکتر رمز، وارد حساب شما شود. البته اگر کوکیهای حساس از طرف سایت اصلی به عنوان امن به مرورگر معرفی شوند، این کوکیها به دست هکر نخواهد افتاد (حداقل با روشهای عادی).
دزدیدن اطلاعاتی مثل رمز عبور:
اگر باگ کراس سایت اسکریپتینگ در صفحات حساسی مثل صفحه لاگین، جایی که ما رمز عبور خود را وارد میکنیم باشد، هکر به سادگی میتواند فیلد وارد کردن رمز عبور را مانیتور کرده و با هر بار تغییر مقدار، مقدار داخل آن را به سرور هکر بازگرداند و در نتیجه هکر اطلاعات بسیار حساس مثل نام کاربری و رمز عبور فرد را در دست داشته باشد.
ارسال درخواستهای جعلی:
هکر میتواند با تزریق کدی، درخواستهای تقلبی را از مرورگر کاربر رد و بدل کند. در این صورت مرورگر کاربر را مانند یک سرور پراکسی در دست گرفته و به راحتی میتواند خود را پشت آن مخفی کند. همچنین میتواند از این طریق اقدام به DDoS کردن سرویسهای گوناگون کند.
مدیریت کل محتوای HTML صفحه:
هکر با استفاده از حملات تحت DOM میتواند محتوای صفحه را تغییر دهد. این کار بخصوص در مباحث مربوط به مهندسی اجتماعی بسیار خطرناک است. یا مثلاً میتواند از طریق API کدهایی نظیر زبان HTML5 استفاده کرده و کارهایی از قبیل شنود میکروفون، مشاهده وبکم، ردگیری مکان و … انجام دهد. البته همه این کارها به دانش مهندسی اجتماعی هکر نیاز دارد.
حملات XSS چگونه انجام میپذیرند؟
همانطور که گفته شد، ابتدا حمله کننده یک باگ یا آسیب پذیری بر روی یک سایت پیدا کرده سپس با تزریق کدهای خود آن را اکسپلویت میکند. تزریق کد میتواند به روشهای گوناگونی انجام بپذیرد.
مثلاً فرض کنید یک سایت قابلیت اضافه نموند محتوایی توسط کاربران را به یک صفحه میدهد، مثل قسمت نظرات یا کامنتهای یک مطلب. در سمت سرور، نحوه نمایش کامنتها مثلاً به صورت زیر است (کدها در زبان PHP هستند):
echo ‘<div class=”comment”>’ . $commentBody . ‘</div>’;
با فرض اینکه در متغیر commentBody، کامنتی که کاربران گذاشته اند قرار گرفته، درصورتی که یک کاربر نظری مثل متن زیر را بگذارد:
با تشکر از مطالب مفیدتون
کد تغییر یافته اینچنین خواهد شد:
echo ‘<div class=”comment”>’ . “با تشکر از مطالب مفیدتون” . ‘</div>’;
در نتیجه کدهای HTML زیر به مرورگر کاربر تحویل داده خواهد شد:
<div class=”comment”>با تشکر از مطالب مفیدتون</div>
و کاربرانی که آن مطلب را مشاهده میکنند، قادر خواهند بود تا کامنتی با محتوای “با تشکر از مطالب مفیدتون” را ببینند.
حال فرض کنید کاربر دیگر (در اینجا، حمله کننده) کامنتی با محتوای زیر را ارسال کند:
عالی بود <script>alert(“You Are Hacked”)</script>
چون در کدهای PHP گذاشته شده، هیچ فیلتری بر روی خروجی اعمال نمیشود، در سمت سرور پردازش به این صورت خواهد بود:
echo ‘<div class=”comment”>’ . ‘عالی بود <script>alert(“XSS Bug Found”)</script>‘ . ‘</div>’;
و در نتیجه به مرورگر کاربرانی که آن مطلب را مشاهده میکنند کد زیر ارسال خواهد شد:
<div class=”comment”>عالی بود <script>alert(“XSS Bug Found”)</script></div>
و کاربر محتوای “عالی بود” را مشاهده خواهد کرد با این تفاوت که چون یک تگ <script> استفاده شده، مرورگر مقادیر داخل آن را با استفاده از موتور جاوا اسکریپت خود execute خواهد کرد و در نتیجه کاربر یک پیغام به صورت پاپ آپ حاوی مقدار “XSS Bug Found” را خواهد دید!
حال اگر از سمت سرور خروجی به درستی فیلتر شود، عبارت زیر فقط و فقط به عنوان یک نوشته چاپ میگردد و در نتیجه <script> نیز به عنوان تگ توسط مرورگر شناسایی نخواهد شد:
<div class=”comment”>عالی بود <script>alert(“XSS Bug Found”)</script></div>
ممکن است بگوئید که خب میشود با فیلتر کردن تگ <script> جلوی این باگ را گرفت اما به این سادگیها نیست. محتوای زیر را به عنوان Payload حمله در نظر بگیرید:
<div style=”background-image: url(javascript:alert(‘XSS Bug Found’))”>
در پی لود بالا از هیچ تگ <script> ای استفاده نکرده ایم با این حال با تزریق کردن آن، باز هم متن “XSS Bug Found” را خواهیم دید.
یک مثال دیگر:
سایتی را فرض کنید که با جستجو کردن مثلا عبارتی “cpu چیست” شما را به مسیری مانند زیر هدایت میکند (چون معمولاً از متد GET استفاده میکنند):
http://example.com/vul/?q=cpu+چیست
و از طرفی کدهای قسمت نتایج جستجوی آن به این صورت نوشته شده است (کد در زبان PHP است):
echo “متن جستجوی شما: ” . $_GET[“q”];
در کد بالا همراه با رشته “متن جستجوی شما: ” چیزی که در پارامتر q (در آدرس سایت مثال بالا) نوشته ایم، به مرورگر تحویل داده میشود.
با جسنجوی عبارت “cpu چیست” کد نوشته شده، متن زیر را تحویل ما خواهد داد:
متن جستجوی شما: cpu چیست
حال فرض کنید که یک کاربر دیگر (در اینجا، حمله کننده) بجای عبارت “cpu چیست”، کد دلخواه خود را اجرا کند که معمولاً کدهای جاوا اسکریپت هم شامل آنها میشود:
http://example.com/vul/?q=<script>alert(“XSS Found Here”)</script>
با رفتن به مسیر بالا، متوجه خواهیم شد که کدهای زیر به مرورگر کاربر تحویل داده خواهند شد:
متن جستجوی شما: <script>alert(“XSS Found Here”)</script>
با اینحال چون خروجی توسط کدهای سایت فیلتر نشده است و <script> یک تگ استاندارد برای مرورگر است، مقدار داخل آن توسط انجین جاوا اسکریپت مرورگر پردازش شده و از دید کاربر پنهان میشود. در نتیجه چیزی که کاربر میبیند به این صورت خواهد بود:
متن جستجوی شما:
به همراه یک پاپ آپ حاوی عبارت “XSS Found Here”.
حال اگر آن قسمت به درستی فیلتر شود، دقیقاً عین مقدار زیر برای کاربر نشان داده خواهد شد و چون فیلتر شده، <script> به عنوان یک تگ برای مرورگر شناخته نخواهد شد بلکه تنها یک نوشته خواهد بود:
متن جستجوی شما: <script>alert(“XSS Found Here”)</script>
دستتون طلا .
عالی بود
زنده باشید 😉
عالی بود alert(“XSS Bug Found”)
alert(“XSS Bug IS NOT found :)”);
الان میگین چطور باید فیلتر کرد
سلام. پست زیر رو بخونین:
https://bytegate.io/%D8%A7%D8%B5%D9%84%D8%A7%D8%AD-%D9%88-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%A8%D8%A7%DA%AF-%D8%AA%D8%B2%D8%B1%DB%8C%D9%82-%DA%A9%D8%AF-xss/