یک مشتری می خواست که ما وب سایت داخلیش را که توسط کارکنان و مشتریان شرکت استفاده میشد را بازدید کنیم. این کار یک بررسی امنیتی (تضمینی) مهمتر بود، و هرچند قبلا ما برای نفوذ در یک شبکه واقعا از تکنیک تزریق SQL استفاده نکرده بودیم، ما با مفاهیم کلی نسبتا آشنا بودیم. ما در این کار کاملا موفق بودیم و به عنوان نمونه، می خواستیم گامهای برداشته شده را یک به یک برشماریم.
"تکنیک تزریق SQL " قسمتی از آسیب پذیری ورودی کاربری تایید نشده میباشد، (سرریزهای حافظه میانی (بافر) بخش متفاوتی هستند) و هدف ترغیب برنامه کاربردی برای اجرای کد SQL می باشد که مد نظر بوده است. اگر برنامه به سادگی رشته های SQL را سریعا ایجاد و سپس اجراء نماید، ایجاد کردن برخی شگفتیهای واقعی کاری ساده است.
ما در نظر می گیریم که این مسیری نسبتا پر پیچ و خم با بیش از یک پیچ اشتباه بود و بقیه با تجربه بیشتری قطعا دیدگاههای بهتر و متفاوتتری خواهند داشت. اما این حقیقت که ما موفق بودیم بیانگر این است که ما کاملا گمراه نبودیم.
مقالات دیگری درمورد تکنیک تزریق SQL وجود داشته از قبیل بعضی مقالات پر جزئیات، و این یکی فلسفه کشف را به اندازه فرآیند بهره برداری نشان می دهد.
شبکه داخلی مقصد
به نظر می رسید این یک برنامه کاملا سفارشی باشد، و ما هیچ دانش قبلی از این برنامه و هیچگونه دسترسی به کد مبداء نداشتیم: این یک هجوم "نامشخص" بود. اندکی کنجکاوی نشان داد که این سرور IIS 6 میکروسافت را همراه با ASP اجرا می کرد (microsoft’s internet information services along with mmicrosoft active server pages). برنامه نت(NET application)، بیان می کرد که بانک اطلاعاتی نرم افزار SQL server مایکروسافت بود. اما به نظر ما، این تکنیکها می توانند تقریبا برروی هر برنامه تحت وب که توسط هر نرم افزار SQL server پشتیبانی میشوند اعمال گردند.
صفحه شروع (login page) یا صفحه لاگین، نه تنها دارای یک فرم کلمه عبور و نام کاربری قدیمی(سنتی) بوده، بلکه دارای یک پیوند کلمه عبور من- ایمیل به من (email me-my password link) بوده است، مورد دوم علت اصلی زوال کل سیستم بود.
به هنگام وارد کردن آدرس ایمیل، سیستم در بانک اطلاعاتی کاربر آن آدرس ایمیل را جستجو می کرد و چیزی را بدان آدرس ارسال(ایمیل) می نمود. چون آدرس ایمیل من یافت نمی شود، سیستم نمی خواست هیچ چیز را برای من ارسال نماید.
بنابراین اولین تست در هر فرم SQL وارد کردن یک علامت نقل قول به عنوان بخشی از داده می باشد: منظور از مشاهده این است که آیا آنها یک رشته SQL را دقیقا بدون حذف کردن می سازند. هنگام تایید کردن فرم با یک علامت نقل قول در آدرس ایمیل، ما با یک خطای شماره پانصد مواجه میشویم (نقص یا خطای سرور)، و این موضوع بیانگر این است که ورودی نقض شده در حقیقت بطور جزء بجزء درحال تجزیه می باشد..
ما فکر می کنیم که کد اصلی SQL چیزی شبیه این به نظر می رسد:
SELECT fieldlist
FROM table
WHERE field= ‘email’;
در اینجا آدرس "ایمیل" تایید شده در فرم توسط کاربر می باشد، یک پرس و جوی گسترده تر دارای علائم نقل قولی می باشد که آن را بعنوان یک رشته اصلی نشان می دهد. ما نامهای فیلدها یا جدول مربوطه را نمی دانیم ولی ما فقط از ماهیت آنها مطلعیم، و ما در انتها حدسهای خوبی خواهیم زد.
هنگامی که ما آدرس ایمیل steve@unixwiz.net را وارد می کنیم – به علامت نقل قول بسته توجه می کنیم- این امر منجر به ایجاد نرم افزار ساخته شده SQL میشود:
SELECT fieldlist
FROM table
WHERE field= ‘steve@unixwiz.net’;
هنگامی که این عمل اجراء میشود، تجزیه کننده SQL علامت نقل قول زائد را پیدا می کند و با یک خطای نحوی متوقف می گردد. اینکه چطور خودش را برای کاربر بارز می نماید منوط به خطای درونی برنامه – پروسه های ترمیم و بازیابی است، اما معمولا آن از "آدرس ایمیل ناشناس" متفاوت است. این پاسخ خطا یک برون داد مهجور است که ورودی کاربر بطور صحیح حذف نمی شود و اینکه برنامه آماده بهره برداری می باشد.
چون که داده هایی که ما وارد می کنیم به نظر می رسد که در عبارت WHERE باشد، بیایید جوهره این عبارت ررا به روش قانونی و مجاز SQL تغییر دهیم و ببینیم که چه اتفاقی رخ خواهد داد. با وارد کردن هر مقدار ‘OR’x’x, SQL بدست آمده هست:
SELECT fieldlist
FROM table
WHERE field= ‘anything’ OR ‘x’= ‘x’;
برای اینکه برنامه واقعا به پرس و جو توجه نمی کند صرفا یک رشته را ایجاد می نماید- استفاده ما از نشانه های نقل قول یک عبارت ور تک مولفه ای را به یک عبارت ور دو مولفه ای تبدیل نموده است، و ‘x’مساوی است با عبارت ‘x’ که ضمانت میشود که درست باشد مهم نیست که اولین عبارت (clause) چیست (برای این قسمت روش بهتری وجود دارد"همیشه درست" که ما بعدا بدان خواهیم رسید).
اما برخلاف یک پرس و جوی"واقعی"، که هر بار باید تنها یک آیتم را برگرداند، این نسخه ضرورتا هر آیتمی را در بانک اطلاعاتی اعضا برمی گرداند. تست کردن آن، تنها روش برای فهمیدن این موضوع است که برنامه در این موقعیت چه خواهد کرد. با انجام چنین کاری، از ما قدردانی شد:
اطلاعات صفحه شروع(لاگ این) شما به آدرس ایمیل random.person@example.com. ارسال گردیده است.