در این بخش از دوره آموزشی SEC542 از موسسه SANS در ادامه مباحث SQL Injection به آشنایی با ابزار کاربردی sqlmap می پردازیم.
sqlmap یک ابزار open source و مبتنی بر پایتون برای کشف و اکسپلویت SQL injection از طریق خط فرمان است. این ابزار فوقالعاده توسط Bernardo Damele A.G. (@inquisdb) نوشته شده است. به سادگی میتوان گفت که این ابزار، مهمترین ابزار تست SQL injection است. برای دریافت اطلاعات بیشتر و دریافت اسکریپت آن به لینک زیر مراجعه کنید.
https://github.com/sqlmapproject/sqlmap
تصویر زیر، اجرای این ابزار با دستور زیر را نشان میدهد:
$sqlmap –u http://www.sec542.org/scanners/sqli.php?name=Zaphod –file-read=/etc/passwd
ابزاری برای تمام نیازهای SQLi شما
sqlmap برخلاف سایر ابزارها، ویژگیها و آپشنهای قابل توجه و رو به رشدی دارد. از لحاظ نوع DBMS، این ابزار از MySQL ، MS SQL Server ، Oracle database ، PostgreSQl ، SQLite و … پشتیبانی میکند.
نکته مهم دیگر این است که sqlmap تکنیکهای متعدد اکسپلویت SQLi را پشتیبانی میکند. تکنیکهایی از جمله Blind timing ، error-based ، blind Boolean ، stacked queries ، UNION و تکنیکهای دیگر. یکی از تفاوتهای اساسی این ابزار با بقیه ابزارها اینست که sqlmap هم میتواند باگهای SQLi را بیابد و هم آنها را اکسپلویت کند. همچنین اکسپلویت کردن با sqlmap میتواند فراتر از استخراج دیتا از دیتابیس باشد.
از نکات مورد توجه دیگر درباره sqlmap میتوان به قابلیت یکپارچه شدن آن با Metasploit/w3af/Burp/ZAP اشاره نمود.
یکپارچگی و ادغام sqlmap
sqlmap به تنهایی کمک بزرگی به تست اپلیکیشن میکند. اما این امکان وجود دارد که آن را با ابزارهای دیگر ادغام کنیم تا بهرهوری و قابلیت بیشتری بدست آوریم. روشهای مختلفی برای این کار وجود دارد. در بعضی ابزارها باید یکپارچگی از طریق sqlmap صورت گیرد و در برخی دیگر، یکپارچگی در ابزار مقابل صورت میگیرد.
از طریق خود sqlmap میتوانیم مستقیما به Burp Suite (pro version) و Metasploit اشاره کنیم. همچنین ابزارهایی وجود دارند که برای نیازهای SQLi خود، از قدرت sqlmap استفاده میکنند.
sqlmap: -h and –hh
سختی sqlmap اینست که تعداد بسیار زیادی سوئیچ خط فرمان و گزینههای تنظیمات برای ما قرار داده شده است. درواقع این فوق العاده است ولی در عین حال کمی ترسناک و گیجکننده به نظر میرسد.
sqlmap دو سوئیچ مختلف برای نمایش help دارد، -h و –hh . سوئیچ –h یک کمک مقدماتیتر و –hh یک راهنمای کامل ابزار را در اختیار ما قرار میدهد. حتی با مراجعه به صفحه Github آن که شامل یک دستورالعمل در wiki است، میتوانید از جزئیات بیشتری نیز مطلع شوید.
https://github.com/sqlmapproject/sqlmap/wiki/Usage
در ادامه نگاهی خواهیم داشت به برخی از سوئیچهای مهم sqlmap که ممکن است برای افراد مبتدی کمی ترسناک به نظر برسد.
sqlmap: Initial Targeting
sqlmap میتواند به عنوان نقطه آغازین SQLi استفاده شود. این یک نقطه قوت برای کشف باگهای SQL injection محسوب میشود. بنابراین بدون داشتن اطلاعات زیادی از تارگت و به کمک سوئیچهای زیر میتوان به جستجو و کشف SQLi با sqlmap پرداخت.
-u : یک URL برای راهاندازی sqlmap
–crawl : با spider کردن سایت، سعی میکند تا نقاط ورودی برای تست را بیابد.
–forms : فرمها را هدف قرار میدهد.
–dbms : اگر نوع دیتابیس پشت اپلیکیشن را میدانیم (یا میتوانیم حدس بزنیم)، میتوانیم به sqlmap اطلاع دهیم تا کوئریهای مربوط به همان دیتابیس را تست کند.
sqlmap: Auth/Sessions/Proxies
به عنوان تست نفوذ کننده، بیشترین استفاده ما از sqlmap ، زمانی است که با اپلیکیشن کار کردهایم (ممکن است لاگین کرده باشیم) و سرنخهایی مبنی بر وجود SQL injection بر روی تارگت به دست آوردهایم. بنابراین بجای spider کردن و هدف قرار دادن فرمها و …، اطلاعات تارگت خود را به sqlmap میدهیم. در این مواقع که میخواهیم از اطلاعات پراکسی خود در sqlmap استفاده کنیم، سوئیچهای زیر کمک زیادی به ما میکنند:
-r / -l : اطلاعات موجود در درخواست HTTP (HTTP Request) یا لاگ پراکسی را تست میکند.
–cookie : بصورت دستی کوکی سایت را در sqlmap ست میکنیم. (–cookie ‘SESSID=42’)
–proxy : sqlmap را به Burp/ZAP را هر پراکسی دیگر هدایت کن. (–proxy http://127.0.0.1:8081)
sqlmap: Proxies and Active Sessions
سوئیچ –proxy از سوئیچهای بسیار پرکاربرد برای ماست. زیرا در اکثر مواقع ما در تست خود از پراکسی استفاده میکنیم. همچنین استفاده از پراکسی در زمان authentication بسیار مفید است. گرچه sqlmap فرمهای مختلف authentication را پشتیبانی میکند، اما معمولا قدرت پراکسی و یا دستی ست کردن authentication از طریق پراکسی را ندارد.
یکی از اشتباهاتی که دوستان ما در هنگام استفاده از سوئیچ –proxy انجام میدهند، این است که به اشتباه فکر میکنند که با هدایت ترافیک sqlmap به پراکسی، مشکل authentication نیز حل میشود (تصور میکنند sqlmap، session را از پراکسی به ارث میبرد.) در حالی که بطور پیشفرض این قابلیت وجود ندارد. میتوانیم با تنظیم پراکسی خود، این مشکل را حل کنیم.
sqlmap: Riding ZAP/Burp Sessions
تصاویر زیر نشان میدهند که چگونه در ZAP و Burp ترافیک sqlmap را انتقال دهیم. در ZAP ، با انتخاب گزینه “Enable Session Tracking (Cookies)” به sqlmap کمک میکنیم تا session خود را ست کند.
در Burp ، نیاز داریم تا در قسمت Project Options -> Sessions ، Session Handling Rules را آپدیت کنیم تا شامل پراکسی شود.
بصورت پیشفرض تنها Scanner شامل این قسمت میشود.
توجه داشته باشید که این تغییرات ممکن است در کارکرد پراکسی شما تاثیرگذار باشد، بنابراین پیشنهاد میکنیم فقط در زمان نیاز از این تنظیمات استفاده کنید.
sqlmap: HTTP Headers
یکی دیگر از قابلیتهای sqlmap ، امکان ویرایش هدرهای HTTP است. گاهی با تغییر هدرها، رفتار اپلیکیشن عوض میشود. این هدرها شامل user agent و referrer میباشند.
–user-agent : در sqlmap بطور پیشفرض user agent به شکل sqlmap/#.# میباشد که به اندازه کافی نامحسوس نیست!
اگر میخواهید توسط WAF ها و ادمینهایی که مراقب user agent ها هستند، شناسایی نشوید، میتوانید با این سوئیچ user agent خود را عوض کنید.
–referrer : معمولا اپلیکیشنها و WAF ها چک میکنند که HTTP Referrer با جریان مورد نظر مطابقت داشته باشد.
خوب است که بتوانید با این سوئیچ بصورت دستی referrer خود را تعیین کنید، اما با استفاده از سوئیچ –r (قبلا راجع به آن صحبت کردیم) و یا با یکپارچه کردن sqlmap با پراکسی، نیز این کار انجام میشود.
sqlmap: DB Enumeration
بیرون کشیدن schema/metadata از دیتابیس، گام کلیدی برای اکسپلویت SQLi است. خوشبختانه دیگر نیازی نیست خودمان را درگیر قواعد نحوی دستورات هر دیتابیس کنیم چون sqlmap این کار را برای ما آسان نموده است.
–schema : نام کل دیتابیسها، جداول و ستونهای DBMS را بدست میآورد.
–exclude-sysdbs : دیتابیسهای سیستمی را در نظر نمیگیرد.
–dbs / –tables / –columns : این سوئیچها برای زمانی که کل اطلاعات schema را نمیخواهید، کاربردی هستند.
-D / -T : میتوانند با سوئیچهای بالا ترکیب شوند. مثلا فقط جداول دیتابیس مشتری را لیست کن. (-D Customer –tables)
sqlmap: DB Data Exfil
بیشترین نگرانی سازمانها در مواجهه با SQL injection ، دزدیده شدن اطلاعات است. حالا که توانستیم metadata را بدست آوریم، میتوانیم با بکارگیری سوئیچ های زیر، اطلاعات دیتابیسها، جداول یا ستونهای جالب را استخراج کنیم. حتی میتوانیم بدون اینکه واقعا دیتایی استخراج کنیم، به کمک سوئیچ –count ثابت کنیم که دیتای سازمان قابل دزدیده شدن است.
–all : همه دیتا و metadata های موجود را استخراج کن.
–count : دیتایی استخراج نشده و تنها تعداد رکوردها بدست میآید.
–dump : دیتای مربوط به دیتابیس/جدول/ستون مشخص شده را استخراج میکند. (-D Orders –T Customers –dump)
–dump-all : دیتای همه جداول را بیرون میکشد.
–search :در دیتابیس/جدول/ستون به دنبال یک رشته خاص میگردد. مثلا user یا pass
سوئیچهای اصلی: فراتر از استخراج دیتا
گرچه معمولا تمرکز اصلی بر استخراج دیتا است اما سوئیچهای زیر قابلیتهای بیشتر sqlmap را نمایش میدهند. این سوئیچها مخصوصا برای تارگتهایی که دیتابیس آنها دیتای خاصی ندارد، بیشتر به کار میآید.
–users : اکانت کاربران دیتابیس را بدست میآورد.
–passwords : hash پسورد کاربران دیتابیس را نشان میدهد.
–file-read : فایلهای سرور را دانلود میکند.
–file-write : بر روی سیستم DB فایل آپلود میکند.
–reg-read / –reg-write : کلیدهای رجیستری ویندوز را میخواند/مینویسد.
–reg-add/–reg-del : کلیدهای رجیستری ویندوز را اضافه/کم میکند.
سوئیچهای اصلی: عملیات Post Exploitation
بدون شک گزینههای زیر، معروفترین قابلیتهای sqlmap هستند. بسیاری از سازمانها و حتی متخصصان امنیت، از پتانسیل SQL injection برای رسیدن به این قابلیتها بیخبرند.
–priv-esc : بالا بردن سطح دسترسی DB
–sql-query / –sql-shell : یک کوئری SQL اجرا کن یا یک شل interactive از SQL شبیهسازی کن.
–os-cmd / –os-shell : یک دستور OS اجرا کن یا یک شل interactive از OS شبیهسازی کن.
–os-pwn : OOB Metasploit shell/VNC/Meterpreter
هشدار: این تکنیکها برای اجرا شدن اغلب نیاز دارند تا سرور دیتابیس، یک وبسرور با یک web root داشته باشد و کاربر دیتابیس در مسیر web root اجازه write داشته باشد و ما بتوانیم آن را ببینیم. در سناریوهای مختلف ممکن است شرایط خاصی برای کار کردن تکنیک وجود داشته باشد. اما بیشترین کارایی این تکنیکها بعد از عملیات pivot یا در تست داخلی است که در آن دسترسی مستقیم ما به سرور دیتابیس بیشتر است. علاوه بر اینها، سوئیچ –os-pwn به یک کانکشن out-of-band نیاز دارد تا به درستی اجرا شود.
مطالب این بخش توسط سرکار خانم فهیمه رضایی تهیه شده است.