آشنایی با حملات HTTP Host header

در این مطلب از فراست به بررسی این موضوع میپردازیم که پیکربندی نادرست و منطق کسب و کاری نامناسب چگونه می تواند باعث قرار گرفتن وب سایت ها در معرض حملات مخرب از طریق HTTP Host Header شود. همچنین روشی را نیز برای تشخیص آسیب پذیریهای Host Header معرفی خواهیم کرد. در نهایت هم توصیه هایی را برای محافظت از وب سایت ها در برابر چنین حملاتی بیان می کنیم.
HTTP Host header چیست؟
Headerها ارتباط بین سرورها و کلاینت ها را در پروتکل HTTP کنترل می کنند. در واقع زمانی که درخواستی از یک کلاینت به سرور ارسال می شود Headerها دربرگیرنده اطلاعاتی هستند که میان سرور و کلاینت ارسال می شود.
HTTP Host header یکی از درخواست های الزامی برای برقراری ارتباط کلاینت با سرور است. Header، نام دامنه ای که کلاینت قصد دسترسی به آن را دارد مشخص میکند. برای مثال وقتی کاربری از سایت https://portswigger.net/web-security بازدید میکند، مرورگر وی درخواستی حاوی Host header را به صورت زیر ایجاد می کند:
GET/ web-security HTTP/1.1
Host: faraasat.com
البته این احتمال وجود دارد زمانی که درخواستی توسط یک سیستم واسطه (که توسط هکری کنترل می شود) دوباره ارسال شود، مقدار و ارزش Host پیش از رسیدن به Back End تغییر کند.
کاربرد HTTP Host چیست؟
کاربرد HTTP Host تشخیص بخشی از Back End است که کلاینت قصد برقراری ارتباط با آن را دارد. اگر درخواست ها حاوی Host Header نبوده یا Host Header نوشته شده در درخواست درست نباشد، ممکن است در مسیریابی درخواست های ورودی به سمت سامانه های مورد نظر مشکل ایجاد شود.
از آنجا که در گذشته هر آدرس IP فقط شامل محتوای Host یک دامنه بود، این ابهامات وجود نداشت. امروزه به دلیل گسترش میزان استفاده از راهکارهای مبتنی بر ابر و برون سپاری معماری های مرتبط، امکان دسترسی به چندین وب سایت و سامانه نرم افزاری از طریق یک آدرس IP وجود دارد. همچنین یکی دیگر از دلایل افزایش محبوبیت چنین روشی این است که آدرس های IP ورژن 4 دیگر رو به اتمام هستند.
زمانی که چند سامانه از طریق یک آدرس IP قابل دسترس باشند، یکی از شرایط زیر رخ خواهد داد:
1. میزبانی مجازی
یکی از حالت های احتمالی زمانی است که یک سرور وب، میزبان چندین سامانه یا وب سایت مختلف است. ممکن است این وب سایت ها یک مالک داشته باشند اما امکان میزبانی چندین وب سایت با مالکان مختلف نیز بر روی یک پلتفرم مشترک و واحد وجود دارد. از این روش قبلاً بیشتر استفاده می شد اما هنوز هم در بعضی از راهکارهای SaaS که مبتنی بر بستر ابری هستند، کاربرد دارد.
در هر صورت، اگر چه هر یک از این وب سایت های مجزا نام دامنه متفاوتی دارند ولی باز هم همه آنها از یک آدرس IP مشترک استفاده میکنند. وب سایت هایی که با این روش و توسط یک سرور میزبانی می شوند، با عنوان «میزبان های مجازی» شناخته می شوند. معمولاً برای یک کاربر عادی که به چنین وب سایت هایی دسترسی دارد، میزبان مجازی آن از وب سایتی که در سرور اختصاصی شرکت میزبانی می شود، تفاوتی ندارد.
2. مسیریابی ترافیک با واسطه
یکی دیگر از روش های رایج، زمانی است که وب سایت ها توسط سرورهای Back End متمایز میزبانی می شوند اما تمام ترافیک بین کلاینت ها و سرورها از طریق یک سیستم واسط مسیریابی می شود. این سرور واسط ممکن است یک تعدیل کننده بار به منظور مدیریت درخواست های ارسالی به سرورها بوده یا یک سرور پروکسی معکوس خاص که درخواست ها را کنترل و مدیریت می کند، باشد. این نوع تنظیمات در شرایطی که کلاینت ها از طریق یک شبکه تحویل محتوا (CDN) به وب سایت دسترسی پیدا می کنند بیشتر رایج است.
در این حالت هر چند وب سایت ها بر روی سرورهای مجزا میزبانی میشوند ولی نام دامنه همه آنها به IP سرور سیستم واسط تبدیل میشود. همچنین از آنجا که سرور پروکسی معکوس یا تعدیل کننده بار باید قادر به تشخیص Back End مناسب برای هدایت درخواست به سمت آن باشد، بنابراین چالش های این روش با روش میزبانی مجازی تقریباً یکسان است.
HTTP Host header چه کمکی به رفع این مشکل میکند؟
در هر کدام از موارد بالا، از Host Header برای مشخص کردن دریافت کننده درخواست استفاده میشود. برای روشن تر شدن این موضوع فرض کنید قرار است به شخصی که در یک آپارتمان زندگی میکند، نامه ای ارسال کنید. از آنجا که در خیابان محل زندگی شخص مورد نظر، آپارتمان های مشترکی وجود دارد بنابراین برای هر کدام از این آپارتمان ها باید از یک آدرس دقیق و مشخص استفاده شود. یکی از راهکارها برای حل این مسأله این است که در آدرس، شماره پلاک آپارتمان یا نام گیرنده نامه نوشته شود. Host Header نیز برای پیام های دریافتی HTTP، کاربرد مشابهی با نوشتن شماره پلاک یا نام گیرنده در آدرس دارد.
هنگامی که مرورگر یک درخواست را ارسال میکند، نشانی وب (URL) مقصد تبدیل به آدرس IP سرور میشود. سرور پس از دریافت این درخواست به Host Header مراجعه میکند تا Back End مورد نظر را تشخیص داده و درخواست را متناسب با آن به سمت مقصد مورد نظر مسیریابی کند.
حمله HTTP Host header چیست؟
حملات HTTP Host header، وب سایت های آسیب پذیری که Host header در آنها با یک روش ناامن مدیریت میشود را مورد سوءاستفاده قرار می دهند. اگر سرور به Host header اعتماد داشته و درخواست ورودی را اعتبارسنجی نکند، مهاجم میتواند از طریق این ورودی برای تزریق پی لودهای مخربی استفاده کند که باعث تغییر رفتار در سمت سرور میشوند. به حملاتی که شامل تزریق مستقیم پی لود به Host header هستند، حمله «تزریق Host header» گفته میشود.
معمولاً برای سامانه های نرم افزاری تحت وب آماده که مشخص نیست بر روی چه دامنه هایی نصب میشوند؛ در هنگام راه اندازی، دامنه مورد نظر را به صورت دستی در فایل پیکربندی آن مشخص می کنند. به این ترتیب وقتی این سامانه ها نیازمند اطلاع از دامنه جاری باشند (برای مثال جهت تولید URL موجود در یک ایمیل) باید آن را از Host header بازیابی کنند:
<a href=”https://_SERVER[‘HOST’]/support”>Contact support</a>
البته ممکن است از header در تعاملات مختلفی که بین سیستمهای متفاوت در زیرساخت وب سایت نیز وجود دارد، استفاده شود.
از آنجا که کاربر امکان کنترل Host header را دارد، این موضوع می تواند منجر به ایجاد مشکلات زیادی شود. اگر ورودی به شکل مناسبی اعتبارسنجی یا رد نشود، Host header میتواند مسیری را ایجاد کند که توسط آسیبپذیری های مختلف مورد سوءاستفاده قرار گیرد.
تعدادی از این آسیب پذیری ها عبارتند از:
- ایجاد آسیب پذیری در حافظه پنهان (Cache) وب
- ایجاد نقص در بعضی از عملکردهای خاص منطق تجاری (Business Logic)
- اجرای حملات SSRF (ارسال درخواست جعلی به سرور) از طریق مسیریابی
- آسیبپذیری های سنتی که در سمت سرور وجود دارند، مثل تزریق کدهای SQL.
آسیبپذیریهای HTTP Host چگونه ایجاد میشوند؟
معمولاً آسیبپذیری های HTTP Host با این تصور اشتباه ایجاد میشوند که Header، تحت کنترل کاربر قرار ندارد. این تصور باعث ایجاد اطمینان کامل به Host header و عدم بررسی یا رد آن میشود. در حالی که مهاجمان به راحتی می توانند با استفاده از ابزارهایی همچون Burp Proxy اطلاعات آن را تغییر دهند.
حتی اگر Host header توسط یک روش امنیتی مدیریت و استفاده شود با توجه به نوع پیکربندی سرورهایی که با درخواستهای ورودی سروکار دارند، باز هم امکان تغییر Host از طریق تزریق سایر Headerها وجود دارد. گاهی پیش می آید مالک یک وب سایت از این که Headerها به صورت پیش فرض پشتیبانی میشوند، اطلاعی نداشته باشد. بنابراین احتمال دارد که با دقت کافی با آن برخورد نکند.
در واقع دلیل بروز بسیاری از این آسیبپذیری ها استفاده از روشهای کدنویسی ناامن نیست بلکه این است که یک یا چند مورد از اجزای زیرساخت مرتبط، با روش های نادرست و غیرامنی پیکربندی شده اند. دلیل این مشکلات در پیکربندی هم این است که وب سایت ها از سایر فناوری های شخص ثالث در معماری شان استفاده میکنند، بدون این که از گزینه های مختلف پیکربندی و پیامدهای امنیتی آن مطلع باشند.
روشهای مقابله با حملات HTTP Host header
ساده ترین راه برای مقابله با حملات HTTP Host header، عدم استفاده از Host header در کد سمت سرور است. ابتدا مطمئن شوید آیا تمام آدرس های URL باید به صورت مطلق باشند یا خیر (یعنی آدرس، به صورت کامل و به همراه پروتکل، نام دامنه و … استفاده شود)؟ معمولاً امکان استفاده از آدرس URL نسبی به جای آدرس مطلق وجود دارد. همین یک تغییر کوچک می تواند به پیشگیری از ایجاد آسیب پذیری در حافظه کش وب (web cache poisoning) کمک کند.
سایر روشها برای جلوگیری از انجام حملات HTTP Host header عبارتند از:
1- محافظت از آدرس های URL مطلق
زمانی که از آدرس های URL مطلق استفاده میکنید بایستی تنظیمات را به صورتی تغییر دهید که مشخص کردن نام دامنه فعلی در فایل پیکربندی و ارجاع به آن به جای Host header الزامی باشد. این روش باعث برطرف کردن مخاطراتی همچون آسیب پذیری تنظیم مجدد کلمه عبور توسط مهاجمان میشود.
2- اعتبارسنجی Host header
اگر لازم است از Host header استفاده کنید، حتماً آن را با روش مناسبی اعتبارسنجی کنید. برای انجام این کار میتوانید آن را با یک لیست سفید (Whitelist) که شامل دامنه های مجاز است، مقایسه کرده و درخواست های ارسالی برای Hostهایی که خارج از این لیست هستند را تغییر مسیر داده یا رد کنید.
برای کسب اطلاعات بیشتر درباره نحوه انجام این کار، به مستندات چارچوبی که با آن کار میکنید مراجعه کنید. برای مثال در چارچوب Django گزینه ALLOWED_HOSTS در فایل تنظیمات قرار دارد. این روش به کاهش میزان احتمال حمله در Host header کمک می کند.
3- عدم پشتیبانی از Headerهای اضافه
علاوه بر موارد بالا باید مطمئن شوید از Headerهایی که برای اجرای این حملات استفاده میشوند، به ویژه “X-Forwarded-Host” پشتیبانی نمیشود. توجه داشته باشید که ممکن است در حالت پیش فرض، این Headerها پشتیبانی شوند.
4- دامنههای مجاز
به منظور جلوگیری از انجام حملات مبتنی بر مسیریابی بر ضد زیرساخت های داخلی سازمان باید تعدیل کننده بار یا پروکسی معکوس را به گونه ای پیکربندی کنید که تنها با درخواست های مجاز کار کند.
5- مراقبت از میزبانهای مجازی «فقط داخلی»
هنگام استفاده از میزبان های مجازی باید از میزبانی وب سایت ها و سامانه های «فقط داخلی» بر روی سروری که با محتوای عمومی سروکار دارد، خودداری کنید. در غیر این صورت ممکن است هکرها از طریق دستکاری Host header به دامنه های داخلی دسترسی پیدا کنند.
منبع: portswigger