PDA

نسخه کامل مشاهده نسخه کامل : درخواست مقاله در ارتباط با sql injection



mona&ghazal
27-10-2007, 01:29
:1:با سلام
من دانشجوی رشته کامپیوتر هستم و موضوع پروژه نهاییم در ارتباط انواع روشهای حک مخصوصا sql injection هست . ممنون میشم اگه به من در این مورد کمک کنید.منتظر جوابتون هستم:37:

R£ɀД
27-10-2007, 08:26
SQL Injection و مقابله با آن ...

همون طور که می دونید Query یک واسطه بین برنامه و DataBase هست ...
و همچنین می دونید که برای داشتن برنامه های Dynamic باید Query ها را با توجه به ورودی (های) کاربر تغییر بدیم ...

فرض کنید ما یه فرم Login داریم و برای ورود کاربر از قطعه کد زیر استفاده می کنیم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خوب مشاهده می کنید که به ظاهر همه چیز مرتبه و کاربر با وارد کردن user و pass خودش می تونه Login کنه و اگه اشتباه بود نمی تونه...

خوب یه کاربر شیطون اول می آد یه username که Single Quotation توش هست مثل jo'hn رو امتحان می کنه تا ببینه که میتونه از این روش استفاده ببره یا نه ... خوب بعد از فهمیدن ورودی ها رو به این شکل وارد می کنه:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خوب ببینیم SQL ما به چه شکل در می آد:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خوب نتیجه Query رو خودتون می دونید دیگه اگه حداقل یک کاربر عضو سایت باشه به راحتی می تونیم Login کنیم.

حالا به فرض این که هکر username رو می دونه

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خوب SQL:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همون طور که می دونید در MySQL -- علامت Comment هست
البته علامت های دیگری مثل /* ... */ و # هم در Mysql هستند...
یعنی در واقع Query ما به این شکل در می آد:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خوب این هم که بدیهیه و Login با موفقیت انجام می شه.
البته همه چیز به یک Login ختم نمی شه بلکه هکر می تونه کل اطلاعات مربوط به ساختار و داده های DataBase ما رو در بیاره ... به این شکل:
البته به این شکلی که نوشته شده MySQL خطا نمی ده ولی SQL server و ... خطا می دن


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد SQL :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پیغام خطایی که SQL server میده اینه:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که از اون می شه اسم Table و اولین فیلد جدول رو به دست آورد...
همین طور که میبینید هکر از Error ها خیلی بهره می بره...
به همین ترتیب می شه کار های دیگه ای هم کرد مثلا:

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

استفاده از UNION:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خطایی که سرور به ما میده اینه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خوب ما تعداد فیلد های SQL برنامه رو نمی دونیم به همین دلیل کار خودمون رو با افزودن یک فیلد دیگر در UNION ادامه میدیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
باز هم همون خطای قبلی رو میده ... این کار رو این قدر ادامه میدیم تا تعداد فیلد ها رو به دست بیاریم.
همچنین با استفاده از این باگ میتونیم اعمالی چون Insert, Delete, ... رو هم انجام بدیم...
در ضمن فقط فرم Login که نیست هر جایی که با دیتابیس کار کنه میتونه مورد حمله واقع بشه اما Login حساسیت بیشتری داره...

* * *

خوب حالا چاره چیه ...
اول بریم سراغ Login، کد مربوط به Login رو به این شکل تغییر می دیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اولا که Password رو حتما Hash کنید که الگوریتم های مختلفی در این زمینه وجود داره ... البته باز هم محدود به رد کردن یک یا چند بار از md5 نشید بلکه با چیزهای دیگری مثل تاریخ عضویت یا کد منحصر به فردی مخلوطش کنید تا حسابی قرو قاطی بشه ... مثلا این طوری:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خلاصه یه روال من در آوردی ... که حتی تو هر پروژه ای که می نویسید هم عوض بشه.

نکته بعد که خیلی مهمه اینه که نام کاربری فقط همونایی باشه که می خواییم و دیگه کاراکتر های اضافی توش نباشه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که البته موقع ثبت نام کاربر هم Username رو از این ----- رد میکنیم و بهش میگیم که از چه چیز هایی می تونه استفاده کنه.

نکته بعد طرض نوشتن SQL مون هست:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همون طور که می بینید فقط Password کاربر از دیتابیس بیرون کشیده شده (البته توی برنامه های واقعی چیزای دیگه ای هم هست که می خونیم) ... بعد هم به شرط SQL دقت کنید که فقط username رو مورد بررسی قرار می ده همچنین به LIMIT 0,1 هم دقت کنید که فقط یه رکورد رو بیرون می کشیم.

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

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یعنی اگه به هر شکل هکر بتواند SQL رو هم دور بزنه، این جا رو نمی تونه دور بزنه...

---

نکات دیگه ای هم هست که برای جاهای دیگه استفاده می شه و اون اینه که کاراکتر های اضافی رو از طریق استفاده از تابع زیر از ورودی هامون حذف کنیم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نکته بسیار مهم دیگه اینه که برای دیتابیسمون دوتا user بسازیم، یکی فقط می تونه SELECT رو انجام بده و دیگری فقط SELECT, UPDATE, INSERT, LOCK TABLE رو بتونه انجام بده، و موقعی که می خواهیم Query فقط خوندن رو اجرا کنیم با user اولی به دیتابیس Connect می شیم، که اگه هکر بتونه چیزی رو هم تزریق کنه که توی اطلاعات ما تغییر ایجاد کنه، خود DBMS اجازه همچین کاری رو نده ... در ضمن به user های دیتابیس دسترسی های خطر ناکی چون DROP TABLE, ALTER , ... رو ندیم.

یک نکته مهم دیگه اینه که مثلا در فیلد هایی که int هستند و بر اساس این فیلد جستجو انجام میدین ورودی GET یا POST رو چک کنید که حتما همون چیزی باشه که باید باشه مثلا اگه قراره int باشه اون رو از تابع intval رد کنید مثال:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و نکته بسیار مهم آخر اینه که نگذارید کسی خطاهای برنامه شما را ببیند (حتی اطلاعات سرور و زبان برنامه نویسی رو هم مخفی کنید خیلی خوبه)، چون همین خطاها هستند که به هکر ها اطلاعات میدن ... برای این کار بعد از این که کل پروژه ساخته شد و خواستید اون رو publish کنید بالای یکی از فایل هایی که توی همه فایل های برنامه include می شه تابع زیر رو به این شکل صدا بزنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


منبع : راست کلیک




-----------------------------------------------------------------------------------------------------------------------


آموزش Sql Injection كردن سرور ها و نفوذ به آنها (ASP)


يكي از نقطه ضعف هاي Sql رشته ي ساختار ان ميباشد كه هميشه آسيب پذير بوده و مورد حمله قرار ميگيرد اين آموزش به شما روشهايي ياد ميده كه بتوانيد اين ساختار را مورد حمله قرار بدهيد .
حالا ميتوانيد در گوگل عبارت زير را سرچ كنيد :
login.asp
در جواب براي شما تقريبا 17 هزار مورد پيدا ميكند . حالا به لينك يافته ها دقت كنيد مثلا چنين خواهيد يافت :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
يا چيزهايي مشابه اين . اين قسمتها را ميتوانيم مورد حمله قرار دهيم . حالا به ساده ترين قسمت رسيديم
كافي است براي رد كردن اين مانع بصورت زير عمل كنيد
بجاي يوزر نيم Admin را بزنيد و بجاي پسورد از اين عبارت استفاده كنيد
or 1=1—
شايد تا حالا كه مقاله را خوانده ايد تعجب كرده ايد كه اين امر چگونه امكان پذير است . در تمامي اين عمليات اطلاعات لاگين شما بصورت Query فرستاده ميشود . اگر اطلاعات درست باشد شما اجازه ي ورود خواهيد يافت وگرنه با پيغام Login Failed مواجه خواهيد شد . وقتي شما ارسالي را با يوزر ادمين و با پسورد 1234 را ارسال ميكنيد از حالت اول به حالت دوم تغيير پيدا ميكند :
حالت اول :
"select *from table1 where login=""&log&""and password=""pwd&"" '
حالت دوم‌:
"select *from table1 where login="Admin"and password="1234" '
حالا با استفاده از اين تركيبات شما ميتوانيد با توجه به ساختار اس كيو ال براي آن پسورد هايي ارسال كنيد كه در صورت قرار گرفتن در اين پسورد مورد قبول قرار گيرد و در واقع با استفاده از نقطه ضعف Query Stringsبه آن حمله كند . اين تركيبات كه با توجه به ساختار اس كيو ال نوشته شده به اين صورت ميباشد نمونه هايي از آن مشاهده ميكنيد :
admin'--
' or 0=0 --
" or 0=0 --
or 0=0 --
' or 0=0 #
" or 0=0 #
or 0=0 #
' or 'x'='x
" or "x"="x
') or ('x'='x
' or 1=1--
" or 1=1--
or 1=1--
' or a=a--
" or "a"="a
') or ('a'='a
" or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi' or 1=1 --
hi' or 'a'='a
hi') or ('a'='a
hi" or ("a"="a
همانطور كه مشاهده كرديد اين روش يك روش ساده اما ابتكاري مباشد كه احتياج به تفكر دقيق دارد البته ساختار ها متفاوت ميباشند و شما ميتوانيد همه ي اين تركيبات بالا را به عنوان پسورد امتحان كنيد و حتما به جواب خواهيد رسيد .


منبع : وبلاگ alihellboy



-----------------------------------------------------------------------------------------------------------------------


معرفی SQL Injection Attacks و نحوه پیشگیری از آن

بانکهای اطلاعاتی معمولا قلب یک وب سایت یا یک برنامه Web based و یا Web Enabled را تشکیل میدهند. زیرا اطلاعاتی که باید در سایت نمایش داده شوند در آنها ذخیره میگردد. بر اساس مدلهای مختلف برنامه سازی، ترکیبی از یک بانک اطلاعاتی و یک زبان اسکریپت یا کد نویسی و احتمالا چند لایه دیگر میتوان برنامه ای نوشت که مورد رضایت مشتری قرارگیرد و اورا قانع به پرداخت هزینه های برنامه نویسی نموده و از همه مهم تر کسب و کار ما را رونق دهد!.
گاه با اینکه تمام جوانب برنامه نویسی را رعایت کرده ایم ممکن است متوجه وجود برخی حفره ها و یا خطاها در برنامه های خود شویم. در صورتی که این حفره ها به دلیل اشکالات موجود در ابزارهای استفاده شده در برنامه ما، مانند بانکهای اطلاعاتی باشند، میتوان به نصب SERVICE PACK ها و یا ارتقاء به نگارش جدید این برنامه ها مشکل را حل نمود، اما در اکثر موارد اشکال و حفره های موجود در یک برنامه وبی به اشکالات مربوط به "تزریق کدهای SQL" یا همان SQL Injection مربوط میشود....

SQL Injection به چه کاری میگویند؟!
همان طور که میدانید زبان SQL شامل دستوراتی است که انجام عملیات بر روی داده های یک بانک اطلاعاتی را فراهم مینماید. هر عملیات (Query) بر روی بانک اطلاعاتی میتواند شامل چندین دستور (Command) باشد. معمول ترین این دستورات عبارتند از: Select, Insert, Update و Delete.
در صورتی که فردی بتواند بصورت غیر مجاز بر روی بانک اطلاعاتی ما با استفاده از این دستورات به اطلاعاتی دست پیدا کند یا اطلاعاتی وارد سایت نماید یا آنها را تغییر داده و یا احتمالا حذف نماید و این عمل را با استفاده از ضعف ما در تفکیک مقادیر ورودی های کاربر و دستورات SQL انجام دهد، اصطلاحا به این روش غیر مجاز اجرای دستورات SQL Injection Attack میگویند.


مثالی از SQL Injection Attacks
مثالها و ضعف های مختلفی را میتوان برای یک SQL Injection Attack بیان نمود، اما در ابنجا به یک نمونه ساده از نحوه عبور از یک فرم مخصوص اعتبار سنجی کاربران که به خوبی طراحی نشده آورده میشود.

معمولا برای ورود به یک سایت از طریق یک فرم کلمه عبور و نام کاربری خواسته شده و مقادیر وارد شده در صفحه دیگری ارزیابی شده و در صورت صحت اعتبار، کاربر به صفحه اصلی انتقال داده میشود. صفحه ورود اعتبار کدی مانند مثال زیر دارد: <form name="frmLogin" action="login.asp" method="post">
Username: <input type="text" name="userName">
Password: <input type="text" name="password">
<input type="submit">
</form>
اطلاعات فرم بالا پس از Submit به صفحه Login.asp ارسال شده و با کدی مانند آنچه در زیر آمده است مورد ارزیابی قرار میگیرد:
<%

dim userName, password, query
dim conn, rS

userName = Request.Form("userName")
password = Request.Form("password")

set conn = server.createObject("ADODB.Connection")
set rs = server.createObject("ADODB.Recordset")

query = "select * from users where userName='" &
userName & "' and userPass='" & password & "'"

conn.Open "Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=myDB; User Id=sa; Password="
rs.activeConnection = conn
rs.open query

if not rs.eof then
response.write "Logged In"
else
response.write "Bad Credentials"
end if

%>
در مثال بالا در صورتی که Username و Password وارد شده حداقل یک بار در بانک اطلاعاتی وجود داشته باشند، کاربر جمله "Logged In" و در غیر این صورت عبارت "Bad Credentials" را مشاهده خواهد نمود.
حال فرض کنید کاربر بجای وارد نمودن Username و Password خود عبارتهای زیر را تايپ نماید:
Username: ‘ or True –
Password: [Null]
در اینصورت دستور اجرا شده SQL ما بر روی بانک اطلاعاتي بصورت زیر خواهد بود:
select * from users where userName='' or True -– ' and userPass=''
همان طور که ملاحظه ميشود در صورت اجرای این کد بر روی بانک اطلاعاتی، همیشه کاربر قادر به ورود به سایت بوده و جمله "Logged In" را مشاهده مینماید! ماجرا همیشه به این سادگی نیست، کاربران غیر مجاز نه تنها از طریق فرمها، بلکه از طریق تغییر Query String های صفحات وبی و یا مقداردهی بهCookie ها نیز قادر به ارسال دستورات مخرب SQL به بانکهای اطلاعاتی میباشند! و گاه میتوانند اطلاعات ما را کاملا حذف نمایند، تغییر دهند، دیتای جدید وارد کنند و یا اطلاعات ما را مشاهده و دریافت نمایند.
بنابر این: همواره مراقب اجرای کدهای مخرب که از طریق کاربر به عنوان اطلاعات معمولي به سیستم تزریق میگردند باشید!

برخی پیشنهادات برای جلوگیری و مقابله با SQL Injection Attacks:
اگر ما به عنوان برنامه نویس وب، برنامه های خود را با دقت بیشتری بنویسیم، در اکثر مواقع میتوانیم جلوی حملات SQL Injection را بگیریم، معمولي ترین راه های مقابله با این نوع حملات میتواند شامل موارد زیر باشد:

1- محدود کردن سطح دسترسی کاربری که با آن اطلاعات وب را برای کاربر از بانک اطلاعاتی استخراج مینماید، بدین منظور بهتر است به چنین نام کاربری، تنها سطح دسترسی SELECT و INSERT برای جداولی که به چنین سطح اجرای دستوراتی نیاز دارند داده شود.

2- با استفاده از دستور Replace مقادیر مربوط به کوتیشن ‘ را پیش از ارسال مقادیر دریافت شده از طرف کاربر بر روی سرور، از جملات مربوطه حذف نماییم.

3- کلمات کلیدی و معنادار برای SQL مانند: Drop, Delete, Update و – را از ورودی های دریافت شده از کاربر حذف نماییم.

4- طول پارامتر ورودی توسط کاربر را محدود نماییم.

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


منبع : Perisan Networks

R£ɀД
27-10-2007, 08:28
همچنین دوست عزیز به تاپیک زیر سر بزنید :
SQL Injection in SQL Server ( يكي از شيوه هاي هك ) ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])