پیاده سازی Sql Injection با استفاده از Query String و روش جلوگیری از آن

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

پیاده سازی Sql Injection با استفاده از Query String و روش جلوگیری از آن

Query String زمانی برای ما کارآمد است و مورد استفاده قرار می گیرد که ما قصد انتقال اطلاعات از صفحه ای به صفحه ای دیگر را داشته باشیم .

برای مثال : http://example.com/over/there?id=4 

در اینجا ، ما در حال ارسال id = 4  هستیم . که در صفحه اطلاعات مربوط به id =4 نمایش داده خواهد شد.

دلیل استفاده از sql Injection ؟

اطلاعات درون query String برای همه قابل مشاهده است ، که همین امر باعث آسیب پذیری آن میشود . به همین دلیل query string برای انتقال اطلاعات حساس به هیچ وجه مناسب نمی باشد .

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

SQL Injection در Query String 
در حالت کلی ، ما نام کاربری و رمز و شماره عابر بانک و اطلاعات حساس را از طریق Query String ارسال نمی کنیم . اگر شما این کار را انجام دهید ، خواهید دید که هکر ها چگونه اطلاعات حساس کاربران شما را به سرقت خواهند برد .

هکرها براحتی توانایی SQL Injection در Query String ها دارند .

برای مثال : http://testwebsite.com/testdetails.aspx?emailId=testmail@gmail.com

 

String strEmail = Request.QueryString("emailId")  
String SqlQuery = "SELECT * FROM temp_table WHERE emailID = '" + strEmail + "'"  

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

 

SELECT * FROM temp_table WHERE emailID = testmail@gmail.com  


از query ای که در بالا داده شده است ، توقع داریم که ،  اطلاعات شخصی را که ایمیل آن در بالا داده شده است را به ما برگرداند . مقادیر داده هایی که در query string موجود هستند رمزگذاری نشده اند ، که این یه مزیت برای Hacker است و براحتی میتواند با اعمال تغییرات بر روی query String به اطلاعات دیگر موجود در پایگاه داده ما دسترسی پیدا کتد .
 
برای مثال :
Hacker میتواند تغییراتی همانند زیر را بر روی URL با SQL Injection ،  اعمال کند :

http://testwebsite.com/testdetails.aspx?emailId=testmail@gmail.com';DROP DATABASE userdb--

توجه داشته باشید که Hacker چگونه ';DROP DATABASE userdb-- vh  را  به "کوئری بد" در مقادیر query strng ضمیمه کرد ، , و برای پایان دادن به جمله sql فعلی از کاراکتر ";"  و در ادامه کوئری دلخواه خودش را به query String اضافه میکند . بعد از ثبت درخواست ، ابتدا ، درخواست ارسالی برای جدول User اجرا خواهد شد ، سپس کل پایگاه داده Userdb را حذف میکند  . در اینجا اگر دقت کنید ، Hacker در انتهای SQL Injectione که در query string قرار داده است در انتهای آن -- را ضمیمه کرده است ، که بدین معناست که بعد از این کاراکترها ، بقیه اظهارات و درخواست های Query را نادیده بگیرد .

Hacker همچنین میتواند عمل های ADD ، UPDATE , INSERT , ALTER را بروی پایگاه داده انجام دهد و اطلاعات کاربران را بدست آورد.
در زیر ، کدی در راستای چگونگی جلوگیری کردن از نفوذ و دست کاری پایگاه داده ، آمده است :



 مواردی که باید از sql injection در query string مورد بررسی قرار بگیرند :

آدرس حقیقی :  http://localhost:2001/querystringinjection.aspx?userName=testUser

تست مورد اول :
اگر کاربر یک پارامتر query string  مانند userName = testUser ارسال کرد ، آن کاربر هیچ رکوردی را نخواهد دید ، به این دلیل که ، هیچ داده ای شبیه متنی که در input وارد شده است در پایگاه داده ما وجود ندارد . اگر ما userName = testUser یا 1=1 را ارسال کنیم تمام رکوردهای پایگاه داده را خواهیم دید ، به این دلیل که ، ما 1=1 را ارسال کردیم و این بدان معناست که ، همیشه مقدار True را بازمیگرداند .

تست مورد دوم :
اگر ما  در input متن 
userName = testUser'; update PO_USER_DETAILS_MASTER set user email='testUser@gmail.com-- 
را وارد کردیم مقدار فیلد ایمیل تمام کاربران به Email='testUser@gmail.com--  تغییر خواهد کرد .

تست مورد سوم :
اگر ما  user Name = sampleUser' drop table sampleTable-- ارسال کنیم ، اطلاعات کاربران را نمیتوانیم ببینیم . در پایگاه داده ، Hacker جدول ما را drop کرده است .

تست مورد چهارم :
اگر ما user Name = sampleUser' or ‘1’=’1’ drop table sampleTable -- را ارسال کنیم ما میتوانیم اطلاعات کاربران را مشاهده کنیم . در پایگاه داده  ، جدول ما drop شده است .


تست مورد پنجم :
اگر ما userName = <script src="http://localhost:2001/Attackerscript.js"></script> را ارسال کنیم ما میتوانیم "اسکریپت های بد " را به query string ضمیمه کنیم .
 

دانلود نسخه ی PDF این مطلب