حمله HTTP Host Header چیست و چه خطری دارد؟

0 92
۵/۵ - (۶ امتیاز)

فهرست

در این مقاله قصد داریم در مورد یکی از حملات جدید و جالب علیه وب سایت ها و برنامه های تحت وب یعنی حمله HTTP Host Header یا Host Header Injection صحبت کنیم که توسط کمپانی Portswigger کشف و معرفی شد. این حمله از آن دست حملاتی است که اگر یک متخصص تست نفوذ دانش شناسایی و اکسپلویت آن را داشته باشد می تواند نسبت به همکاران و رقیبان خود تمایز ویژه ای ایجاد کند. به همین دلیل ما این مطلب را در قالب چند مقاله به طور دقیق در اختیار شما می گذاریم.

سرآیند میزبان یا Host در پروتکل HTTP چیست؟

هنگامی که یک درخواست HTTP ارسال می شود، تعدادی سرآیند یا هدر درون درخواست قرار می گیرند که بعضی از آن ها الزامی هستند و این الزام دستور و نیاز پروتکل HTTP است. یکی از هدرهای الزامی در هنگام ارسال یک در خواست HTTP، هدر Host یا میزبان است. این هدرنام دامنه ای که کاربر به آن درخواست می دهد را مشخص می کند. برای مثال در شکل زیر ما برای بازدید از وب سایت، یک درخواست HTTP با متد GET به آکادمی ترجنس ارسال کرده ایم:

http get

در درخواست بالا مشاهده می شود که هدر Host با مقدار edu.thregence.ir به سرور ارسال شده است.
شاید برای شما اتفاق افتاده باشد که برای ایجاد یک وب سایت از یک هاستینگ یا سرویس دهنده ابری استفاده کرده باشید و برای وب سایت خود IP ایستا یا Static دریافت نکرده باشید. طبیعی است که اگر وب سایت خود را ping کنید یک IP مشاهده می کنید که این IP تنها برای وب سایت شما نیست. ممکن است تعداد زیادی وب سایت روی آن سرویس دهنده وجود داشته باشند که دارای همین IP هستند. حال وقتی یک درخواست به وب سایت شما ارسال می شود، کدام یک از این وب سایت ها باید به شما نمایش داده شوند؟!
درخواستی که در شکل قبل مشاهده کردید قرار است به دست یک مولفه (Back-end) برسد که بتواند درخواست را پاسخ دهد. برای مثال درخواست قرار است به دست وب سرور برسد که به این درخواست پاسخ دهد. بسیار اتفاق می افتد که این درخواست توسط یک مولفه میانی به سمت مولفه Back-end هدایت می شود. این موضوع دلایل زیادی دارد. از دلایل آن می توان به استفاده از هاست اشتراکی، متعادل کنندگان بار یا Load Balancer ها و به طور کلی استفاده از یک آدرس IP برای چندین مولفه Back-end اشاره کرد.
اما کدام مولفه باید به یک درخواست به سمت یک IP اشتراکی پاسخ دهد؟!

میزبانی مجازی یا Virtual Hosting

وقتی چند وب سایت روی یک پلتفرم مشترک با IP یکسان میزبانی می شوند یک راه استفاده از میزبانی مجازی یا Virtual Hosting است. این روش طوری عمل می کند که گویی هر وب سایت بر روی سرور اختصاصی خود میزبانی می شود. در شکل زیر تعریف دو Virtual Host برای دو دامنه domain1 و domain2 در آپاچی را مشاهده می کنید:

<VirtualHost *:80>
    ServerName domain1.com
    ServerAlias www.domain1.com

    DocumentRoot /var/www/domain1.com/html
</VirtualHost>

<VirtualHost *:80>
    ServerName domain2.com
    ServerAlias www.domain2.com

    DocumentRoot /var/www/domain2.com/html
</VirtualHost>

اگر دقت کنیم دو هاست مجازی تعریف شده و فایل هایی که هر کدام باید برای پاسخ به درخواست کاربر ارائه دهند نیز مشخص شده است. برای مثال اگر کاربر در مرورگر خود domain1.com را وارد کرد محتویات درون var/www/domain1/html/ به او نمایش داده می شود اما اگر domain2.com را وارد کرد محتویات درون var/www/domain2.com/html/ به او نمایش داده می شود.

مسیریابی توسط واسط

حالتی را فرض کنید که چند وب سایت در اختیار دارید و هر یک را در یک سرور جداگانه میزبانی می کنید که دارای آدرس IP متمایزی هستند اما برای دلایلی از یک واسط میانی استفاده می کنید. برای مثال به دلیل افزایش سرعت پاسخ وب سایت خود از CDN یا برای تعدیل بار از Load Balancer استفاده می کنید. در این حالت درست است که هر سرور IP مشخص خود را دارد اما کلیه درخواست ها ابتدا به یک IP یکسان که همان IP واسط میانی باشد تحویل داده می شوند.

استفاده از سرآیند Host

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

حمله HTTP Host Header یا Host Header Injection (HHI)

حمله HTTP Host Header یا Host Header Injection آسیب پذیری وب سایت هایی را اکسپلویت می کند که به طور صحیح مقدار هدر Host را مدیریت نمی کنند. در این موارد مهاجم با قرار دادن یک پیلود (Payload) مخرب به عنوان مقدار برای هدر Host می تواند رفتار سرور را تحت تاثیر قرار دهد.
برای مثال فرض کنید یک وب سایت یا برنامه تحت وب را برای توسعه برون سپاری کرده اید. به دلیل اینکه تیم توسعه علاوه بر تایید اعتبار نکردن مقدار هدر Host، نام دقیق دامنه را نیز نمی دانند برای دریافت نام دامنه در مولفه های مختلف برنامه از مقدار هدر Host استفاده می کنند. برای این کار مثلا در PHP می توان از متغیر سراسری Server_ به صورت زیر استفاده کرد:

_SERVER['Host']

این متغیر می تواند در مکان های مختلف قرار داده شود و با مولفه های مختلف در ارتباط باشد. برای مثال فرض کنید یک تگ در HTML وب سایت به صورت زیر وجود دارد:

<a href="https://_SERVER['Host]/contact-us">Send Your Message!</a>

از آنجا که مقدار هدر هاست و در نتیجه SERVER[‘Host’]_ را یک مهاجم می تواند کنترل کند، این قطعه کد در صورت مدیریت غلط ورودی ها و کدنویسی ناامن توسط توسعه دهنده می توان اتفاقات بدی به همراه داشته باشد.
برخی از حملات تحت وب که در نتیجه حمله Host Header Injection رخ می دهند عبارتند از:

  • Web Cache Poisoning
  • SQL Injection
  • Routing-based SSRF
  • RCE
  • و…

سخن پایانی

در این مقاله در مورد یکی از حملات جالب و جدید علیه وب سایت ها و برنامه های تحت وب صحبت کردیم. این حمله تاثیر دیگری از استفاده نکردن از DevSecOps می باشد که مثل این آسیب پذیری، به دلیل عدم دانش امنیتی توسعه دهنده به وجود می آید. با توجه به جدید بودن این حمله در مقالات بعدی در مورد نحوه شناسایی، اکسپلویت و جلوگیری از آن مفصلا صحبت می کنیم.

درباره ما

ترجنس | thregence.ir
آکادمی ترجنس | edu.thregence.ir
دوره‌های آکادمی ترجنس | courses.thregence.ir
اینستاگرام | instagram.com/thregence
تلگرام | t.me/thregence
یوتوب | https://bit.ly/30mGowo
آپارات | aparat.com/thregence

ارسال یک پاسخ