رفتن به مطلب
بازگشایی انجمن! ×
GuardIran

پست های پیشنهاد شده

سلام خدمت همه دوستان

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

نوعی از حملات که در آن اخلاگر با

تزریق دستورات SQL

به ورودی هایی که به

پایگاه داده

منتهی می شود، اطلاعات مورد نظر را از

پایگاه داده

استخراج کرده و اهداف خود را روی آن هدف اعمال می کند.

این

آسیب پذیری

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

سرور

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

برای درک اینکه این آسیب پذیری در عمل چگونه اتفاق می افتد، آدرس فرضی زیر را در نظر بگیرید:

This is the hidden content, please

در آدرس فرضی بالا قسمت page.php?id=5 یک Query را تشکیل می دهد که کد مربوط به آن بصورت زیر است:

This is the hidden content, please

در کد بالا

Query

مورد نظر در متغیر sql قرار گرفته و متغیر

sql

از طریق تابع mysql_query اجرا می شود و در واقع نتیجه کلی در داخل متغیر result قرار می گیرد. مشکل این کد اینجاست که بدون ایجاد محدودیت، پارامتر id از طریق $_GET فراخوانی شده است.

نکته: تابع mysql_query پرس جوهایی SQL را روی پایگاه داده MYSQL اجرا می کند.

پس شکل اصلی آدرس بالا قبل از اجرای کوئری به شکل زیر است:

This is the hidden content, please

و زمانی که ما در قسمت url سایت عمل تزریق را انجام می دهیم به شکل زیر می باشد:

This is the hidden content, please

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

برای مثال:

This is the hidden content, please

در این شبه* کد انتظار می*رود فقط هنگامی که نام* کاربری(Username) و رمزعبور(Password) به درستی وارد شوند عمل ورود به سایت انجام پذیرد، امابا یک ترفند ساده می*توان نام* کاربری را طوری وارد کرد که بدون کنترل شدن رمزعبور، عمل ورود به سایت انجام شود. کافی است به جای نام* کاربری و رمز عبور عبارت زیر را وارد کنیم:

This is the hidden content, please

در این صورت دستور SQL به صورت زیر اجرا خواهد شد:

This is the hidden content, please

در ساختار SQL عبارات بعد از – اجرا نمی شوند و 1=1 یک عبارتهمیشه درست است، پس کاربر تائید می*شود. به این طریق بدون داشتن نام کاربری و رمزعبور و تنها با استفاده از تزریق کد SQL به پایگاه داده توانستیم وارد محیط کاربری سایت شویم.

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


راههای کشف آسیب پذیری sql injection

بررسی کد های html

کدهای HTML صفحه اصلی و دیگر صفحات محتمل را بررسی و تست sql injection را، روی پرس و جوهایی که در قالب لینک و یا فرم ارسال داده قرار دارند انجام می دهیم.

This is the hidden content, please

برای مثال؛ در کدهای بالا لینکی موجود است که می تواند ناشی از یک پرس و جوی SQL باشد.

This is the hidden content, please

بنابراین تست sql injection را انجام می دهیم.

برای انجام این کار کاراکتر هایی (مثلا کوتیشن) را در انتهای آدرس (url) قرار می دهیم و اگر با خطاهای از قبل شناخته شده مواجه شدیم نسبت به sql injection آسیب پذیر می باشد.

This is the hidden content, please

خطاهای شناخته شده برای موجود بودن آسیب پذیری sql injection برای پایگاه داده های مختلف به شرح زیر می باشد:

 

 

MYSQL

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server

MSSQL

Unclosed quotation mark before thecharacter string

ORACLE

ORA-01756: quoted string not properly terminal

ORA-00933: SQL command not properly ended

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

- استفاده از اسکنر ها

با استفاده از نرم افزارهای اسکنر موجود، می توان وب سایت های مورد نظر را اسکن نمود.

یکی از معروفترین اسکنرها Accunetix Web Vulnerability Scaner است

بررسی کدهای http واقع در سرآیند

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

هنگام اتصال به سرور فایل سرآیندی در کنار درخواست ارسالی به سرور و پاسخ های بازگشتی از سرور قرار می گیرد که این فایل سرآیند شامل فیلدهایی می باشد که یکی از آنها کد HTTP می باشد.

مثلا زمانی که سایت guardiran.org را باز شود، درخواست به سرور رفته و نتیجه آن در قالب فایل سرآیند به مرورگر باز می*گردد:

 
This is the hidden content, please

نتیجه برگشتی:

This is the hidden content, please

در سرآیند بالا که اولی مربوط به درخواست و دومی مربوط به پاسخ سرور است،کد HTTP مربوط به پاسخ سرور٢٠٠ می باشد که یعنی درخواست به درستی دریافت شد، دو کد HTTP وجود دارد که بعد از تزریق کاراکتر به انتهای url، نشانه آسیب پذیری sql injection می باشد و آن کدهای ٣٠٢ و۵٠٠ می باشد

This is the hidden content, please

برای این که بتوانید این سرآیندها را ببینید می توانید افزونه Live HTTP Headers را روی مرورگر فایرفاکس نصب کنید.

This is the hidden content, please

بعد از نصب افزونه از قسمت Tools از آیتم های مرورگر فایرفاکس به آن دسترسی پیدا کرده و می توانید با این افزونه سرآیند را دیده، آن را آنالیز و حتی ویرایش کنید.

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


انواع حملات تزریق کد sql به پایگاه* داده

 

واکنش هایی که پایگاه داده ها در هنگام تزریق از خود نشان می دهند باعث شده تا به مرور زمان انواع مختلفی از تزریق ها به وجود آید. ما در زیر بدلیل طولانی نشدن شرح حملهرا به بعد موکول می کنیم و تنها به معرفی انواع حملات می پردازیم.
 
الف: UNION BASED SQL INJECTION (تزریق بر اساس ترکیب دو QUERY)
نوعی از تزریق که نتایج دو دستور sql از طریق union با هم ترکیب شده و نتیجه یک جا نمایش داده می شود.
 
This is the hidden content, please

در برخی ورژن های پایگاه داده ها، مثل MYSQL ورژن 5 به بالا یک جدول اضافی به نام information_schema وجود دارد که تمام اطلاعات سیستمی از جمله نام تمام جداول و ستون ها در آن یافت می شود که در سرعت بخشیدن به استخراج اطلاعات کمک شایانی می کند، زیرا زمانی که به کمک جدول information_schema از وجود جدولی با نام admin که دارای دو ستون passwo

rd, username است مطلع بود، تنها کاری که لازم است انتخاب داده های جدول و نمایش محتوای آنهاست

ب: ERROR –BASED SQL INJECTION (تزریق بر اساس خطا)

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

ج: BLIND- BASED SQL INJECTION (تزریق کور)

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

از لحاظ تقسیم بندی تزریق کور خود به دو دسته قابل تقسیم است:

1- Boolean Based : نتایج به شکل True/False می باشد.

2- Time Based: نتایج به شکل True/False مبتنی بر زمان می*باشد.

در هنگام تزریق اگر صفحه وب سایت به درستی نمایش داده شود دستور تزریق شده صحیح(True) و اگر درست نمایش داده نشود غلط(False) می باشد.

در هنگام تزریق اگر وب سایت بعد از تاخیر تعیین شده با استفاده از توابع تاخیر (مثلا 2 ثانیه) لود شود شرط صحیح(True) و درغیر اینصورت غلط(False) می باشد.

- خواندن فایل و ساخت فایل با SQL INJECTION

برخی توابع در sql این امکان را به ما می دهند تا بتوانیم فایلی از سیستم را خوانده یا فایل دلخواه خود را داخل سرور آپلود کنیم.

This is the hidden content, please

نتیجه این مثال این است که کدهای فایل php در صفحه وب سایت نمایش داده شود و اگر با خطا مواجه شد می توان مسیر فایل را به صورت hex کد گذاری کرد.

This is the hidden content, please

عمل ایجاد فایل هم با دستورات sql امکان پذیر می باشد:

This is the hidden content, please

اگر خطایی رخ داد مسیر را با استفاده از hex کدگذاری می کنیم:

This is the hidden content, please

تا اینجا یک فایل با نام cmd.php ساخته شده که امکان اجرای خط فرمان با آن است که برای اجرای آن از آدرس زیر استفاده می کنیم:

This is the hidden content, please

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

This is the hidden content, please

در اینجا فایل php از مسیری که تعیین شده روی host دانلود شده و می*توان آن را اجرا کرد.

This is the hidden content, please

نکته: تابع LOAD_FILE() برای خواندن و فراخوانی فایل های موجود مورد استفاده قرار می گیرد.

نکته: از طریق into outfile می توان محتویات X را داخل فایل تعیین شده ایجاد کرد.

This is the hidden content, please
لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


راه های مقابله با تزریق کد

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

در ابتدا و در طراحی و استفاده از پایگاه داده این دو نکته را مد نظر قرار دهید:

1- تا حد امکان از کاربرانی با سطح دسترسی کم برای اتصال به پایگاه دادهاستفاده کنید. این کار باعث جلوگیری از SQL Injection نمی*شود اما به اینموضوع کمک می*کند که کسی نتواند کدهای مخرب را روی بانک اطلاعاتی اجرا کند وبنابراین در صورت وجود SQL Injection نفوذگر قدرت مانور کمتری خواهد داشت.

2- همیشه اطلاعات مهم مانند رمزهای عبور را به صورت کدشده در پایگاهداده(Database) ذخیره کنید. این کار نیز باعث جلوگیری از SQL Injection نمی*شود اما باعث می*شود در صورتی که مهاجم به پایگاه داده نفوذ کرد،نتواند اطلاعاتی مانند رمزهای عبور را به راحتی به دست بیاورد.

3- سعی کنید دستورات اجرا شده در پایگاه داده را ثبت کنید. هر چند این امر به جلوگیری از SQL Injection کمکی نمی*کند، اما به شما این امکان را می*دهد تا با دیدن دستورات اجرا شده پی به اشتباهات خود برده و آنها را برطرف کنید. برای ثبت دستورات می*توانید از پایگاه*داده*هایی که این قابلیت را دارند استفاده یا با بهره* گیری از دستورات زبان برنامه نویسی که استفاده می کنید آنها را درجایی امن ذخیره کنید.

- جلوگیری از SQL INJECTION در PHP

1- همیشه از درستی نوع متغیر ورودی اطمینان حاصل کنید. در زبان PHP انواع متغیرها وجود دارند. می*توانید با استفاده از توابعی مانند ctype_digit و ctype_alnum و سایر توابع خانواده ctype یا تابع gettype نوع ورودی را کنترل کنید. همچنین می*توانید با استفاده از (regular expression (PCRE از صحت اطلاعات اطمینان حاصل* یابید.

2- اگر قرار است در دستور SQL عدد وارد شود، با توابعی مانند is_numeric اطمینان حاصل کنید که ورودی حتما عدد است یا همیشه نوع ورودی را با تابعی مانند settype یا intval یا floatval یا … تغییر دهید.

3- ورودی*هایی که از نوع رشته (string) هستند را با توابع پایگاه داده مورد نظر escape کنید (مانند mysql_real_escape_string یا sqlite_escape_string یا ...) و اگر برای پایگاه داده مورد نظر شما چنین تابعی موجود نیست با استفاده از توابعی مانند addslashes یا str_replace این کار را انجام دهید. این عمل باعث می*شود تا کاراکتری مانند ' در ساختار SQL تاثیری نگذارد و ورودی به عنوان متغیر به دستور داده شود و تاثیری بر دستور نداشته *باشد.

4- استفاده از stored procedures یکی از بهترین روش*های جلوگیری از SQL Injection در پایگاه داده*هایی است که این قابلیت را دارند. اما متاسفانه همه پایگاه*داده*ها این قابلیت را ندارند.

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

This is the hidden content, please

-جلوگیری از SQL INJECTION در ASP.NET

1- از ورودی*ها اطمینان حاصل کنید. سعی کنید تا جای ممکن تمامی ورودی*ها را از لحاظ نوع داده، طول رشته، بازهعددی و سایر موارد کنترل کنید. برای این کار می*توانید از Regex ،RegularExpressionValidator یا RangeValidator استفاده کنید.

2- استفاده از ورودی*ها در Stored Procedureها راه بسیار مناسبی است. توجه داشته باشید که استفاده از Stored Procedure ها بدون استفاده از ورودیباعث جلوگیری از SQL Injection نمی*شود. برای این کار می*توانیداز SqlParameter و SqlParameterCollection استفاده کنید.

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

3- سعی کنید تا جای ممکن از API هایی مانند ADO.Net و قابلیت*های آناستفاده کنید، چرا که با کمک این رابط*های برنامه*نویسی می*توان نوع دقیقداده*ها را مشخص کرد و همچنین این اطمینان را داشت که ورودی*ها به طرزصحیحی Escape می*شوند.

مثال: در نمونه کد با کمک روش*های گفته شده تا حد امکان جلوی این حفره گرفته شده است:

This is the hidden content, please
لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر


به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • ایجاد مورد جدید...