امنیت در برنامه نویسی و تست نفوذ
- [ زمان انتشار : پنجشنبه 26 اردیبهشت 1398 ] [ برچسب ها: امنیت سایت، امنیت در کد نویسی، امنیت در php، امنیت در ASP، تست نفوذ، امنیت، امنیت در برنامه نویسی ، ] [ 449 بار مشاهده شده ]
سلام وقت بخیر
اگر یک برنامه نویس هستید، همیشه دغدغه داشتید که چطور امنیت رو داخل سایت یا برنامه اتون برقرار کنید؟؟
خب از قدیم قدیم گفتن امنیت هیچ موقع 100درصد نمیشه!! چرا؟ چون هرچی ما برنامه نویس ها می نویسیم یک نفر دیگه پیدا میشه و یه چیزی که ما فراموش کردیم ولی اون فراموش نکرده، این یه علت میشه که برنامه ما به فنا بره. اما حداقلش این هستش که ما جلوی اونایی اون فراموش نکرده رو هم بگیریم. زیاد توضیح ندم بریم سر بحث اصل مطلب.
دو نوع حمله متداول به سایت داریم :
1- Cross site scripting attacks || XSS
2- SQL Injection
حمله اول :
از طریق query string کوکی ها رو میدزدن و میبرن استفاده میکنن. (به خاطر همینه میگن وقتی کارتون با پنل اتون تموم شد خروج یا logout کنید تا کوکی هاتون دست هکر نیفته).
Response.Write("hello," + Request.QueryString("name"));
در ظاهر کد فوق هیچ گونه مشکلی نداره و طریقه کار و دست یابی به آن هماندد آدرس زیر است.
http://example.com/wellcome.aspx?name=ali
از طریق query string مقدار name دریافت شده و سپس یک پیام خوش آمدگویی برای کاربر ظاهر می شود. اما به کد زیر توجه کنید :
http://example.com/wellcoem.aspx?name=
کد فوق مخرب نیست و تنها پس از درخواست آدرس فوق به شکل داده شده یک Alert که Hi را نمایش می دهد ظاهر می گردد، اما تخریب از جایی شروع می شود که کاربری با دادن چنین لینکی در سایت ( برای مثال به مدیر سیستم و کلیک کردن طبیعی او بروی این لینک) محتویات کوکی مدیر سیستم را دزدیده و به آدرسی در سایتی دیگر منتقل و ثبت می کند ( از کوکی عموماً برای ثبت اطلاعات Login افراد استفاده می شود و به این صورت جعل خواهد شد).
حمله دوم :
تزریق SQL تکنیکی است که مهاجم (هکر) را قادر می سازد تا دستورات SQL غیر مجازی را با بهره گیری از ضعف چک نکردن داده های ورودی توسط برنامه نویس، که از این ورودی ها در عبارات SQL پویای خودش استفاده می نماید، روی بانک اطلاعاتی اجرا کند.
دو تا نمونه مثال بزنیم که در جریان کار این حمله باشید.
مثال اول از تزریق SQL injection
عموماً صفحات ورود کاربر یا احراز هویت از عبارات پویای SQL برای چک کردن این امر که آیا مشخصات کاربر در بانک اطلاعاتی موجود است یا خیر، استفاده می نمایندو لازم به ذکر است که این حملات با کمک گیری از دستورات SQL صورت می گیرد و صرفاً به یک زبان برنامه نویسی خاص وب محدود نمی شود.
در اینجا Uname و PASS کاربر دریافت شده و سپس توسط عبارات SQL ساخته شده بررسی می شود، که آیا رکوردی مربوط به این کاربر درون جدول tblUser وجود دارد یا خیر؟ اگر پاسخ مثبت باشد به پنل کاربر هدایت می شود در غیر اینصورت پیغام خطایی براش چاپ می شود.
SELECR * from tblUser WHERE username=Uname AND password=PASS
در نگاه اول کد فوق، کدی است عادی و هیچ گونه مشکل خاصی ندارد. اما اگر بجای Uname عبارت hi' or 1==1 و بجای پسورد نیز همان را وارد نماید (الزامی ندارد) به راحتی از احراز هویت با موفقیت عبور می کند!! چرا ؟؟
در حالت عادی ما انتظار داریم که با ورودی کاربر عبارت SQL هایی شبیه این عبارت ایجاد گردد :
SELECR * from tblUser WHERE username='mehran'AND password='12345'
اما خب در اینجا کاربر، عبارت زیر را ایجاد کرده است :
SELECR * from tblUser WHERE username='hi' or 1==1' AND password='hi' or 1==1'
خب حتما می دونید در عبارات SQL، رشته با single quote پایان می یابند و استفاده از -- در انتهای عبارات وارد شده نیز ایجاد خطا به دلیل استفاده از qoute marks بسته نشده را در SQL منتفی می کند. در زبان های برنامه نویسی وب معمولا از /**/ یا // یا # برای کامنت یا توضیحات استفاده می شود و در زبان SQL از -- (در حقیقت قسمت بعدی عبارات SQL نادیده گرفته خواهد شد).
و در عبارت فوق به دلیل استفاده از or و با توجه به اینکه 1==1 همواره برقرار است، رکوردهای مورد نظر مهاجم ایجاد گردیده (عبارات SQL حداقل یک رکورد را بر می گرداند(در اینجا تمام رکوردها) و شرایط آن تغییر به ture خواهد شد ) و در نهایت صفحه Login پشت سر گذاشته خواهد شد.
استفاده از تابع replace میتونه در این مورد کمکتون کنه . با این تابع میاد single quote را حذف میکنه. اما ممکن هست بعضی ها اسمشون رو با single quote وارد کرده باشن که میتونه مشکل ایجاد کنه، برای حل این مشکل هم می تونید موقع ثبت نام اجازه ندهید که حروف خاص بزنن و تنها به الفبا و اعداد محدود بشن یا اینکه حروف خاص دیگه بذارین کفایت میکنه.
مثال دوم از تزریق SQL injection
http://example.com/article.php?ID=155
استفاده از query string روشی است بسیار متداول در تمام زبان های برنامه نویسی سمت سرور. فرض می کنید می خواهید مقالات سایت خود را بصورت پویا یا داینامیک نمایش دهید. در یک صفحه عنوان تمام مقالات را از بانک های اطلاعاتی خوانده و بصورت لینک هایی که انتهای آنها حاوی query string ایی که بیانگر شماره منحصر به فرد این مقاله در دیتابیس است، در می آورید (همانند مثال فوق که مقاله ای با ID شماره 155 اشاره میکند). هنگامی که کاربر روی عنوان یک مقاله کلیک می نماید به صفحه article.php هدایت شده و در این صفحه قبل از هرچیزی مقدار id دریافت می شود، سپس بصورت پویا محتویات این مقاله از بانک اطلاعاتی خوانده شده و نمایش داده می شود. بنابراین عبارت SQL ما شبیه زیر خواهد شد :
SELECR * from tblArticle WHERE ID=$_GET
فرض کنید مهاجم به جای لینک عادی همچین چیزی رو درخواست کنه :
http://example.com/article.php?ID=0 or 1==1
در این حالت دستور SQL ما به این شکل خواهد بود :
SELECR * from tblArticle WHERE ID=0 or 1==1
این عبارت تمام مقالات موجود را برمیگرداند. البته این مورد شاید مطلب خطرناکی نباشد اما لینک زیر را در نظر بگیرید :
http://example.com/article.php?ID=155; DELETE FROM tblArticle
خودتان عبارت پویای SQL نهایی را حدس بزنید. لینک فوق سبب می شود کل محتویات جدول مقالات بدون هیچ گونه خطایی و کاملاً مطابق با دستور SQL حذف شود.
روش حفاظت :
ما انتظار داریم که کاربر عدد وارد کنه، پس بهتر هستش قبل از کوئری و درخواست از بانک مقدار وارد شده رو چک کنیم که آیا واقعاً عدد هست یا عبارت دیگه ای هم داحل هستش!!
یادم رفت بگم :: هیچ موقع به کاربر اجازه نوشتن انشا ندهید .
این یعنی هیچ لزومی ندارد که اندازه فیلدهای دریافت اطلاعات نامحدود باشن. با تعیین حداکثر سایز دریافت اطلاعات می توان از سعی و خطاهای مهاجمین جلوگیری کرد و یا حداقل کاهش داد. هر چند با 12 کارکتر هم میتوان SQL server را خاموش کرد. تنها کافی است بجای name وارد شود :
';shutdown-
خب تقریباً تمام اطلاعاتی که در این زمینه رو داشتم براتون نوشتم. امیدوارم 1درصد اطلاعاتتون رو در این زمینه افزایش داده باشم.
اگر سوال دارید از بخش نظرات کامنت کنید در صورتیکه پاسخ رو بدونم حتما جواب خواهم داد.