<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های پرنیا اسحاقی</title>
        <link>https://virgool.io/feed/@parniaeshaghi</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-18 01:43:33</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1595505/avatar/cnCwdf.jpeg?height=120&amp;width=120</url>
            <title>پرنیا اسحاقی</title>
            <link>https://virgool.io/@parniaeshaghi</link>
        </image>

                    <item>
                <title>اجرای SQL Injection روی OWASP Juice Shop</title>
                <link>https://virgool.io/@parniaeshaghi/%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-sql-injection-%D8%B1%D9%88%DB%8C-owasp-juice-shop-hhrzfeqp2cmi</link>
                <description>هر کسی با هر پیش‌زمینه‌ای هستید، وقت‌های پیش می‌آید که ممکن است بخواهید یک حمله SQL Injection را روی یک سایت اجرایی کنید. چه یک برنامه‌نویس فریلنسر یا مستقل باشید که می‌خواهید از امنیت سایت خود مطمئن شوید، چه یک متخصص امنیتی یا یک هکر کلاه سفید باشید که با اجازه صاحب سایت می‌خواهید به آن نفوذ کنید و یا حتی اگر فردی بدون هیچ ارتباطی با علوم کامپیوتر و cybersecurity باشید که صرفاً دنبال یک سرگرمی عصرانه در یک محیط کنترل‌شده است. البته احتمالا کسانی هم هستند که به قصد بدی می‌خواهند این حمله را انجام دهند؛ اگر شما جز این دسته هستید پیشنهاد می‌کنم که دست نگه دارید و کمی بیشتر فکر کنید و این صفحه را هم به کل ببندید! اما اگر تازه‌کاری از دسته‌های قبل هستید که لازم است این حمله را یاد بگیرید، می‌توانید یک حمله‌ی ساده را با دنبال کردن مطلب زیر پیاده‌سازی کنید. البته فرض این مطلب بر آن است که مقدمات سیکوئل اینجکشن را بلد هستید. اگر هیچ آشنایی‌ای با این حمله ندارید با خواندن مقاله‌ی «حمله SQL Injection چیست و چگونه عمل می‌کند؟» برای مطالب این مطلب آماده می‌شوید. علاوه بر SQL کمی هم از دانش وب استفاده می‌کنیم که در خود مطلب توضیح آن داده می‌شود.در این مقاله می‌خواهیم به طور عملی چند حمله‌ی SQL Injection روی وب اپلیکیشن OWASP Juice Shop پیاده‌سازی کنیم. نگران نباشید کار خلافی نمی‌کنیم! این وب اپلیکیشن اصلا برای همین کارها ساخته شده است! به گفته‌ی خودشان جوس شاپ مدرن‌ترین وب‌اپلیکیشن ناامن است! جوس شاپ شامل انواع مشکلات امنیتی هست اما ما می‌خواهیم فقط روی ضعف‌های sql injection تمرکز کنیم. برای یادگیری بهتر می‌توانید همراه من پیش بیایید و خودتان انجام دهید. راه‌اندازی و استفاده از این وب اپلیکشن روش‌های مختلفی دارد مثلا می‌شود از node.js یا Docker و یا Vagrant یا خیلی روش‌های دیگر استفاده کرد که توضیحات آن‌ها را به صورت دقیق در گیت‌هاب جوس شاپ می‌توانید پیدا کنید. اما در این مطلب برای اینکه درگیر یادگیری این ابزار‌ها نشویم از گزینه‌ی راحت‌تر Heroku استفاده می‌کنیم که همه‌ی کارهای راه‌اندازی اپلیکیشن را برای ما انجام می‌دهد. کافی است در Heroku ثبت نام کنید، وارد اکانتتان شوید و سپس در صفحه گیت‌هاب جوس شاپ گزینه‌ی Deploy to Heroku رو بزنید. احتمالا بسته به زمانی که این مطلب را می‌خوانید حتی نیاز به ساخت اکانت نداشته باشید و بتوانید وارد جوس شاپی که به اکانت من در Heroku وصل است بشوید: peaceful-beach-07946.herokuapp.comپس از آن صفحه‌ای می‌آید که در آن می‌تواند نام و ریجن اپ خود را تغییر دهید (یا ندهید!) و صبر کنید تا اپلیکیشن ساخته شود. پس از اتمام آن گزینه‌ی Manage App را بزنید که وارد صفحه اپلیکیشن خود شوید. حالا برای باز کردن جوس شاپ کافی است روی گزینه‌ی Open app را در بالا سمت راست کلیک کنید و کار تمام است! حالا یک ساخت وب اپلیکیشن جوس شاپ در اختیار داریم تا هر حمله‌ای که می‌خواهیم روی آن پیاده کنیم!اخطار: البته اگر همراه این مقاله از Heroku استفاده می‌کنید این نکته یادتان باشد که در این روش نمی‌توان (و نباید) حمله‌ی DDoS اجرا کرد چون سرورها برای Heroku اند و نه جوس شاپ.حالا بعد از بستن پیام توضیحات و قبول کردن کوکی‌ها، (برای ذخیره کردن پیشرفت در نفوذ به سایت از کوکی استفاده می‌شود) با صفحه‌ی اصلی جوس شاپ که یک سایت خرید آبمیوه هست روبه‌رو می‌شویم که در عکس پایین می‌توانید آن را ببینید. (که در صورتی که خودتان در Heroku اکانت ساخته باشید آدرس متفاوتی در مرورگر می‌بینید.) اگر همراه با من پیش می‌آیید در جوس شاپ خودتان کمی گشت و گذار کنید تا ببینید چه مشکلات احتمالی‌ای پیدا می‌کنید.خب دیگر دست دست نکنیم و کاری که برایش اینجاییم را شروع کنیم! در بالا سمت راست در قسمت اکانت وارد صفحه‌ای لوگین شوید. اول با امتحان کردن لوگین شروع می‌کنیم و فقط در قسمت یوزر و پسورد یک تک کوتیشن خالی می‌گذاریم تا ببینیم سایت چگونه با آن برخورد می‌کند. می‌بینیم که سایت ارور می‌دهد که این نشانه‌ی خوبی هست. از طرف جوس شاپ پیامی هم می‌گیریم که یک چالش سایت را حل کردیم که گرفتن اروری است که خوب هندل نشده.ارور [object Object] مربوط به سیکوئل نیست بلکه از طرف جاواسکریپت و احتمالا فانکشن stringify می‌آید پس راجع به RDBMS به ما اطلاعاتی نمی‌دهد. قبل از اینکه ادامه مطلب و راه حل را بخوانید سعی کنید خودتان وارد شوید. چون نمی‌دانیم کوئری‌ چیست باید ورودی‌های مختلفی را امتحان کنیم تا به ورودی درست برسیم. تک کوتیشن یا دابل کوتیشن، -- یا # برای کامنت کردن، کوئری یوزر و پسوورد جدا از هم‌اند یا نه و گزینه‌های دیگر را امتحان کنید.خب حالا که برگشتید (یا شاید هم اصلا نرفته بودید!)‌ راه حل اصلی را می‌توانید در زیر ببینید.بعد از امتحان کردن ورودی‌های مختلف این یکی از روش‌هایی است که می‌توان وارد اکانتی در جوس شاپ شد. LIMIT از آن روش‌هایی است که اکثرا یا اصلا از آن اطلاع ندارند و یا فراموشش می‌کنند. اکثر سایت‌ها سیستمی دارند که اگر کوئری لوگین نتیجه‌ای به جز یک یا هیچ خط داشته‌ باشد اجازه دسترسی نمی‌دهند، یک راه دور زدن این در بعضی موارد استفاده از LIMIT است که نتیجه را به خط اول محدود می‌کند و یک پوئن مثبت دیگرش این است که خط اول معمولا اولین اکانت ثبت شده در دیتابیس است که در بیشتر مواقع اکانتی با دسترسی ادمین است که در جوس شاپ هم ما دقیقا به همین نتیجه می‌رسیم. اگر LIMIT در این موقعیت به یادتان نیامد هم مشکلی نیست صفحه اصلی جوس شاپ را اگر کمی با دقت گشته باشید، در بعضی محصولات نظراتی وجود دارند که ایمیل نظردهنده (که ایمیل ادمینستر علاوه‌ بر یوزرهای دیگری بین آن‌ها هست) هم در آن‌ها وجود دارد که با استفاده از آن‌ها به روش معمول بدون لیمیت هم می‌توانیم وارد اکانتی در سایت شویم.پی‌نوشت: ظاهرا اصلا در اینجا نیازی به لیمیت نداریم زیرا سایت نتیجه کوئری را به صفر و یک محدود نکرده است و با نتیجه چند خط وارد کاربر اولین خط می‌شود. (همان ادمین) این ورودمان هم چالش دیگری در جوس شاپ بود. اگر کمی اطلاعات مربوط به جوس شاپ را بخوانیم می‌فهمیم که این سایت قسمت امتیازات یا اسکوربوردی هم دارد که این پیشرفتمان در چالش‌ها را در آن‌ها (با استفاده از کوکی) ثبت می‌کند. اما با کمی گشت و گذار در سایت می‌بینیم که نمی‌توانیم همچین صفحه و اسکوربوردی در جایی پیدا کنیم! شاید پیدا کردن این صفحه هم به کمی کارآگاهی نیاز دارد! راه‌ها یا pathهای یک سایت معمولا در جاوااسکریپت فرانت‌اند آن‌ها وجود دارد پس شاید بتوانیم با کمی گشت و گذار در سورس چیزی پیدا کنیم. اگر نمی‌دانید از چی حرف می‌زنم اشکالی ندارد قدم به قدم راه را نشان می‌دهیم.برای دیدن جاوااسکریپت و سورس صفحه و اطلاعات راجع به فرانت‌اند یک سایت و خیلی چیزهای دیگر می‌توانیم از Developer Tools مرورگر استفاده کنیم. در کروم برای باز کردن آن چند روش داریم. سه نقطه‌ی بالا سمت چپ را بزنید More tools و سپس Developer tools را انتخاب کنید، روی صفحه کلیک راست کنید و گزینه‌ی Inspect را انتخاب کنید و یا راحت‌تر از همه کنترل، شیفت و حرف I را با هم بزنید. (Ctrl+Shift+I) باز کردن آن در مرورگرهای دیگر هم به همین راحتیست اما جزئیاتش را به خودتان می‌سپارم. حالا ‌‌تب Sources را انتخاب کنید.در Sources کنترل + P بزنید تا لیست‌ فایل‌ها را ببینیم. معمولا pathهای یک سایت در فایل جاوااسکریپت main هستند پس main.js را باز کنید.حالا فایل main را داریم اما زیاد خواندنش راحت نیست. در کروم می‌توانید در قسمت پایین سمت چپ کد علامت {} را ببینید که اگر روی آن بزنید فایل را برایتان به فرمت قابل خواندن در می‌آورد. حالا کافی است در این فایل سرچ کنیم تا ببینیم مسیری به اسکوربورد وجود دارد یا نه. ctrl + shift + f جعبه‌ی سرچی را باز می‌کند. حالا کلمه score را سرچ می‌کنیم تا ببینیم چیزی به تورمان می‌خورد یا نه. در نتایج اگر نگاه کنید می‌بینیم که یک path داریم به نام score-board یعنی کافی است در لینک سایت score-board اضافه کنیم تا به صفحه امتیازات برویم. (بعد از این گزینه‌ی score board را در منوی سمت چپ سایت هم داریم)این مطلب برای یادگیری SQL Injection است پس بگذارید ببینیم چالش‌های جوس شاپ برای این حمله چیستند. در ردیف بالا Show all را بزنید سپس در ردیف پایین ابتدا Hide all و سپس روی Injection کلیک کنید. حالا لیستی از چالش‌های نوع اینجکشن داریم.خب حالا بریم تا چالش با سختی سه ستاره پیدا کردن اسکیمای دیتابیس را انجام دهیم. معمولا چنین نفوذی را از صفحه سرچ انجام می‌دهند پس بریم یک نگاهی به امنیت آن بیاندازیم. اگر در سرچ بار و یا متغییر q در لینک تک کوتیشن، دابل کوتیشن، نقطه ویرگول، علامت‌های کامنت کردن و ترکیب آن‌ها را امتحان کنیم می‌بینیم که جستجو در مقابل نفوذ امن است. حالا چی؟ شاید باز هم باید ذره‌بین کارآگاهی دستمان بگیریم. Dev tools را دوباره باز کنید اما این بار به تب network بروید. صفحه را ریلود کنید تا ریکوئست‌ها لاگ بشوند. اگر کمی در ریکوئست‌ها نگاه کنیم یک ریکوئست GET با url زیر می‌بینیم:https://peaceful-beach-07946.herokuapp.com/rest/products/search?q=این لینک با لینکی که موقع سرچ در خود سایت می‌بینیم فرق می‌کند. ممکن است لینکی باشد که از ورژن‌های قبلی سایت باقی مانده باشد یا چیز دیگر. به هر حال لینک را کپی کنید و در مرورگر پیست و اجرا کنید. می‌بینیم که با صفحه‌ی عجیبی مواجه می‌شویم. اما با کمی دقت می‌توان فهمید که در واقع همان نتایج سرچ را به صورت نوشته داریم می‌بینیم.حالا باید ببینیم این سرچ هم در مقابل نفوذ امن است یا نه. (باید در مقابل q در لینک ورودی‌های مد نظرتان را وارد کنید) خودتان اول سعی کنید اروری بگیرید و بعد برگردید.احتمالا خودتان توانستین ارور بگیرید اگر نه یکی از راه‌های گرفتن آن قرار دادن «;&#x27;» است که با آن ارور زیر را می‌گیریم.خب داریم جلوتر می‌رویم، با این ارور هم می‌فهمیم که این سرچ بر خلاف سرچ اصلی سایت در مقابل نفوذ امن نیست و هم اینکه DBMS استفاده شده SQLite است که این دانش برای قسمت بعدی مهم است. می‌خواهیم DB schema جوس شاپ را پیدا کنیم. این اطلاعات در کجا ثبت می‌شود. اگر به faq سایت sqlite بروید در سوال هفتم این جواب را پیدا می‌کنیم. SQLITE_SCHEMA جدولی مخصوص sqlite است که نام تمام جدول‌های پایگاه داده در ستون tbl_name آن ثبت می‌شود. علاوه بر آن ستونی به نام sql دارد که کوئری اولیه ساخت جدول‌ها در آن است که با آن هم نام جدول‌ها و هم نام ستون‌هایشان را پیدا می‌کنیم. حالا کافی است با استفاده از UNION نام این جدول‌ها را پیدا کنیم. پس از امتحان کردن خودتان به بخش بعد بروید تا راه حل را ببینید.اول از همه راه بستن کوئری را باید پیدا کنیم که بعد از بررسی عبارت‌های معمول به «--((&#x27;» می‌رسیم که همه‌ی اجسام فروشگاه را به ما برمی‌گرداند. حالا برای یونیون کردن باید بفهمیم نتیجه‌ی سرچ چند ستون برمی‌گرداند. معمولا برای این کار نیاز به امتحان و خطا داریم تا تعداد ستون‌ها را پیدا کنیم. اما در این مورد به خصوص کافی است تعداد نتایج یک جسم را بشماریم.{&amp;quotid&amp;quot:1,
 &amp;quotname&amp;quot:&amp;quotApple Juice (1000ml)&amp;quot,
 &amp;quotdescription&amp;quot:&amp;quotThe all-time classic.&amp;quot,
 &amp;quotprice&amp;quot:1.99,
 &amp;quotdeluxePrice&amp;quot:0.99,
 &amp;quotimage&amp;quot:&amp;quotapple_juice.jpg&amp;quot,
 &amp;quotcreatedAt&amp;quot:&amp;quot2022-06-20 16:00:31.888 +00:00&amp;quot,
 &amp;quotupdatedAt&amp;quot:&amp;quot2022-06-20 16:00:31.888 +00:00&amp;quot,
 &amp;quotdeletedAt&amp;quot:null}در بالا آبمیوه‌ی سیب را داریم که در آن قسمت‌های بولد شده نام ستون‌ها هستند و با شمردن آن‌ها می‌فهمیم که در UNION باید ۹ ستون داشته باشیم. برای امتحان کوئری زیر را در لینک می‌نویسیم که در نتیجه می‌توانیم ببینیم که اولی خطمان نتایج‌ اعدادی که گذاشتیم را دارد: https://peaceful-beach-07946.herokuapp.com/rest/products/search?q=&#039;)) UNION SELECT 1, 2, 3, 4, 5, 6, 7, 8, 9 --نکته: اگر کوئری را به طور معمولی در قسمت url بنویسید کروم به طور خودکار آن را تبدیل به url صحیح می‌کند.حالا کافی است ستون‌ sql از SQLITE_SCHEMA را با کوئری زیر به دست آوریم. جهت کم شدن نتایج و خواناتر شدن لیست قبل کوتیشن کلمه‌ای بی‌معنی اضافه کنید که نتیجه‌ای از اجسام نداشته باشیم.https://peaceful-beach-07946.herokuapp.com/rest/products/search?q=nothing&#039;)) UNION SELECT sql, 2, 3, 4, 5, 6, 7, 8, 9 FROM sqlite_schema --و بالاخره اسکیمای دیتابیس را به دست آوردیم. هرچند کمی خواندنش سخت است!اگر الان به اسکوربورد نگاه کنید می‌بینیم که چالش اسکیما را حل کرده‌ایم اما صبر کنید هنوز همین‌جا که هستید بمانید! یک چالش دیگر پیدا کردن اطلاعات ورود کاربرهاست. حالا که اسکیما را داریم به راحتی از همین روش می‌توانیم این چالش را نیز حل کنیم. این هم خودتان حل کنید و بعد ادامه را بخوانید.راهنمایی: برای فرمت کردن JSON (نتایج این سرچ به صورت JSON است) ابزارهای آنلاین زیادی وجود دارد. مثلا می‌توانید از این سایت استفاده کنید.با خواندن اسکیما می‌بینیم که جدولی به نام Users داریم با ستون‌های username email password. (پسوردها به صورت هش شده‌اند.)https://peaceful-beach-07946.herokuapp.com/rest/products/search?q=nothing&#039;)) UNION SELECT username, email, password, 4, 5, 6, 7, 8, 9 FROM Users --حالا می‌توانید قسمت سرچ را ترک کنید اما ستون‌های جدول Users را یادتان بماند در ادامه آن‌ها را لازم داریم. اگر الان اسکوربورد را ببینید هر دو چالش‌های قبلی حل شده‌اند. خب حالا قبل از اتمام مطلب یک چالش نهایی جالب را حل می‌کنیم. چالشی که خواسته با کاربری با ایمیل acc0unt4nt@juice-sh.op که در حال حاضر وجود ندارد بدون ثبت نام وارد سایت شوید. دوباره به صفحه‌ی لوگین برگردید و Dev tools را باز کنید و باز به تب نتورک بروید. حالا ارور [object Object] را دوباره بگیرید. حالا در تب نتورک به login بروید. در اینجا می‌توانیم کوئری‌ای که لوگین استفاده می‌کند را پیدا کنیم. (بله در قسمت لوگین هم می‌شد از این طریق کوئری را پیدا کرد و با آزمون و خطا پیش نرفت!)SELECT * FROM Users WHERE email = &#039; &#039; AND password = &#039; &#039; AND deletedAt IS NULLکمی فکر کنیم. چطور می‌توانیم سایت را گول بزنیم که با اکانتی که در جدول یوزرز نیست وارد شویم؟ مثلا اگر بتوانیم با روشی خطی به نتایج اضافه کنیم که در اصل در جدول Users نباشد... بله درست است! این بار هم یار همیشگیمان UNION به کارمان می‌آید. دقت کنید که کوئری با * خط را می‌آورد. یعنی اگر بخواهیم یونیونمان موفق باشد باید همه‌ی ستون‌های یوزرز را بیاوریم که هم تعداد درست باشه هم سایت با موفقیت گول بخورد و برایمان session ایجاد کند. ستون‌های یوزرز را در مرحله قبل پیدا کردیم حال کافی است از آن استفاده کنیم. قبل از خواندن راه حل، خودتان سعی کنید کوئری درست را بنویسید.&#039; UNION SELECT * FROM 
(SELECT 15 as &#039;id&#039;,
 &#039;&#039; as &#039;username&#039;,
 &#039;acc0unt4nt@juice-sh.op&#039; as &#039;email&#039;,
 &#039;12345&#039; as &#039;password&#039;,
 &#039;accounting&#039; as &#039;role&#039;,
 &#039;123&#039; as &#039;deluxeToken&#039;,
 &#039;1.2.3.4&#039; as &#039;lastLoginIp&#039; ,
 &#039;&#039; as &#039;profileImage&#039;,
 &#039;&#039; as &#039;totpSecret&#039;,
 1 as &#039;isActive&#039;,
 &#039;1999-08-16 14:14:41.644 +00:00&#039; as &#039;createdAt&#039;,
 &#039;1999-08-16 14:33:41.930 +00:00&#039; as &#039;updatedAt&#039;,
 null as &#039;deletedAt&#039;)--امیدوارم این مطلب برایتان مفید واقع شده باشد.معرفی، توضیح، راهنمایی و راه حل همه‌ی چالش‌های جوس شاپچالش‌های SQL Injection بیشتر:RedTigers HackitRingZer0 Online CTF Challengesنویسنده: پرنیا اسحاقی | Parnia Eshaghiدانشگاه آزاد اسلامی تهران مرکزکلاس پایگاه دادهاستاد: دکتر مریم حاجی اسمعیلی | دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam Hajiesmaeili | PhD of computer science from Kingston university of Londonدر لینکدین ببینید.</description>
                <category>پرنیا اسحاقی</category>
                <author>پرنیا اسحاقی</author>
                <pubDate>Mon, 20 Jun 2022 22:44:34 +0430</pubDate>
            </item>
                    <item>
                <title>حمله SQL Injection چیست و چگونه عمل می‌کند؟</title>
                <link>https://virgool.io/@parniaeshaghi/%D8%AD%D9%85%D9%84%D9%87-sql-injection-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%B9%D9%85%D9%84-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF-vykuobdkb26n</link>
                <description>تصویر از سایت geekflareاین مقاله توضیحات تئوری مختصری راجع به SQL Injection است که حتی کسی که کوچک‌ترین دانسته‌ای راجع به SQL و پایگاه داده ندارد بتواند مطلب را بفهمد. قبل از این‌که بفهمیم SQL Injection چیست بهتر است بدانیم هرکدام از اجزای تشیکل‌دهنده اصطلاحش به چه معناست. زبان SQL چیست؟کلمه SQL مخفف شده‌ی Structured Query Language است که تقریبا به «زبان پرسمان سختار یافته» ترجمه می‌شود. این زبان یک زبان استاندارد جهانی است که برای مدیریت و دسترسی به پایگاه‌های داده یا دیتابیس‌ها استفاده می‌شود. چه داده‌های یک وبسایت، چه داده‌های یک اپلیکیشن و چه داده‌های یک بازی باشد، به احتمال زیادی از SQL برای ذخیره کردن و دسترسی به این داده‌ها استفاده می‌کنند. داده‌های درون SQL به صورت جدولی و در tableهای مختلف با ستون‌های مختلف که صفت یا attribute نام دارند، ذخیره می‌شوند که از طریق کلیدهایی با هم ارتباط دارند.اس‌کیو‌اِل یا سیکوئل؟ اگر با این زبان آشنا باشید احتمالا پیش آمده است که دو نوع مختلف گویش اسمش را شنیده باشید و برایتان سوال پیش بیاید که بالاخره کدام درست است! اولین نسخه‌ی این زبان در دهه هفتاد میلادی به اسم Structured English Query Language یا SEQUEL منتشر شد. اما چون این اسم نام تجاری یک شرکت تولید هواپیما بود مجبور شدند حروف صدادارش را حذف کنند و به SQL تبدیل شد. (و کمی بعدتر English هم از اصطلاح کلی حذف شد) امروزه اکثر منابع رسمی اس‌کیوال را نوع تلفظ درست معرفی می‌کنند اما همچنان میان برنامه‌نویس‌ها سیکوئل رواج دارد و مورد قبول است.البته برای استفاده از زبان SQL یک RDBMS هم لازم داریم. یعنی چی؟ یعنی Relational Database Management System یا سیستم مدیریت پایگاه‌ داده‌ی رابطه‌ای. به یک RDBMS احتیاج داریم که بتوانیم یک پایگاه داده بسازیم و داده‌های درونش را اضافه و کم کنیم و به طور کلی داده‌ها را  راحت‌تر مدیریت کنیم. RDBMSهای مختلفی برای استفاده وجود دارند چندتا از معروف‌ترین‌ها MySQL، MS SQL Server، PostgreSQL و Oracle هستند. زبانی که این RDBSMها استفاده می‌کنند تقریبا شبیه هم هستند اما بعضی جزئیات آن‌ها با هم فرق می‌کند که در حمله‌های SQL Injection از آن‌ها برای حمله‌ی دقیق‌تر استفاده می‌شود.حمله Injection چیست؟حمله‌ی Injection یک دسته‌ی گسترده از حمله‌های سایبری است که در آن‌ها اتکر (Attacker) با استفاده از قسمت‌های ورودی کاربر یا هر جای دیگر نرم‌افزار که به درستی توسط برنامه‌نویس محافظت نشده، کد و اطلاعات جدیدی را وارد برنامه می‌کند که مسیر اجرایی آن را تغییر می‌کند. این دسته از حمله‌ها به علت راحتی پیدا کردن و  شناسایی آن‌ها به علاوه‌ی قابلیت تخریب و خسارات بالایی که می‌توانند بزنند از خطرناک‌ترین حمله‌ها هستند. با این وجود همچنان هم سهل‌انگاری‌های زیادی در محافظت در مقابل آن‌ها وجود دارد. به طوری که هنوز جز ۱۰ پر ریسک‌ترین مشکلات امنیتی برنامه‌هاست. طبق لیست OWASP که در زیر مشاهده می‌کنید در سال ۲۰۱۷ شماره‌ی یک و در ۲۰۲۱ شماره‌ی ۴ است.Top 10 Web Application Security Risksحمله‌ی Injection انواع مختلفی دارد که یکی از معروف‌ترین آن‌ها SQL Injection هست که این مقاله راجع به آن است.حمله SQL Injection چیست؟بالاخره رسیدیم به تیتر مقاله! از تعریف اجزای اسمش احتمالا تا الان فهمیدید که قضیه چیست. در این حمله اتکر با استفاده از قسمت‌های ورودی کاربر یا هرجای دیگری که مستقیما با پایگاه داده از طریق زبان SQL ارتباط دارد، دستورات جدیدی را وارد برنامه می‌کند که می‌تواند پایگاه داده‌ی نرم‌افزار را کنترل کند مثلا اطلاعات کاربران را بدزدد یا به طور مخرب‌تر کل پایگاه داده را از بیخ و بن پاک کند! برای درک بهتر این حمله کمی دستورات SQL را و طوری که ممکن است در یک سایت و برنامه از آن استفاده شود را با مثال‌های ساده در پایین توضیح می‌دهیم.چند مثالسیکوئل به اندازه زبان‌های برنامه‌نویسی دیگر دستورات خیلی زیادی ندارد چون یک زبان مخصوص پایگاه داده است و فقط برای آن استفاده می‌شود. یکی از پراستفاده‌ترین دستوراتش SELECT است که داده‌های به خصوصی را در پایگاه داده پیدا می‌کند یا به اصطلاح select می‌کند! چیز‌هایی که جلوی SELECT می‌آید در واقع مشخصات داده‌ای است که باید دنبال آن بگردد. این همان کوئری یا پرسمانی است که در کلمه‌ی SQL است. به کد زیر توجه کنید:SELECT * FROM table_name;از سمت چپ به راست اول SELECT را داریم که راجع به آن توضیح دادیم. بعد «*» را داریم که در SQL به معنی‌ همه‌چیز است یعنی همه‌ی‌ داده‌ها یا دقیق‌تر در اینجا همه‌ی ستون‌ها یا صفت‌ها. FROM که یعنی «از». table_name که همانطور که واضح است اسم یک جدول در پایگاه داده‌ی ماست و در آخر «;» که به نشانه‌ی اتمام کوئری است. دستورات SQL اکثرا مانند یک جمله‌ی انگلیسی در می‌آیند به همین علت درک آن‌ها بسیار ساده هست. یک نکته هم که احتمالا به آن توجه کردید این است که بر اساس استایل گاید رسمی این زبان دستورات SQL باید با حروف تمام درشت نوشته شوند و هر چیزی به جز دستور با حروف تمام کوچک. این کار برای درک بهتر کوئری‌ها در نگاه اول است اما بدون عمل کردن به آن هم دستورات اجرا می‌شوند. پس به طور خلاصه دستور بالا به این معناست که همه‌ی ستون‌های موجود در جدول یا تیبل table_name برایم بیاور. قسمت ورود کاربران - Loginحالا بیاید فرض کنیم که یک برنامه‌نویس هستیم و می‌خواهیم موقع ورود کاربران نام کاربری و رمز آن‌ها را با پایگاه داده چک کنیم و اگر موجود بود اجازه‌ی ورود به آن‌ها بدهیم. کدمان ممکن است در php یا هر زبان دیگری باشد اما قسمت سیکوئل آن مثلا را به طور زیر می‌نویسیم:SELECT * FROM users WHERE username = &#039; &#039; AND pass = &#039; &#039; ;دستور WHERE و AND در اینجا اضافه شدند که اولی شرطمان است و دومی به معنی «و». پس به طور کلی این بار کوئری ما این است: «همه‌ی داده‌ها از جدول یوزرز (جدولی که اطلاعات کاربرها در آن ثبت شده) برگردان که در آن‌ها یوزرنیم برابر -جای خالی- و پسوورد برابر -جای خالی- باشد.» که جاهای خالی در کوئری با ورودی کاربر پر می‌شوند. به عبارت دیگر وقتی کاربر اسم و رمز خود را وارد می‌کند در پشت صحنه ورودی‌هایش مستقیم وارد سیکوئل می‌شود (که از همین جا مشکل کد ما پیداست) و اگر اسم و رمزش در پایگاه داده باشد و فقط یک نتیجه از جدول برگردد کاربر می‌تواند وارد اکانتش شود. اما اگر کوئری نتیجه‌ای نداشته باشد یعنی اسم یا رمز یا هر دو اشتباه‌اند و همچین کاربری در پایگاه‌ داده پیدا نشد.البته ممکن هم هست که کوئری بیشتر از یک نتیجه داشته باشد که در آن صورت هم کاربران موقع ورود به مشکل می‌خورند. شاید نتوانند وارد شوند و شاید هم به اکانت دیگری وارد شوند. یکی از دلایلی که اکثر سایت‌ها اجازه‌ی یکسان بودن یوزرنیم را نمی‌دهند هم همین است. چون یوزرنیم شما در دیتابیس‌ها به عنوان کلید و id شما عمل می‌کند. سایت‌هایی که به کاربران اجازه می‌دهند یوزرنیم یکسان داشته باشند احتمالا از یک عدد یا اطلاعات دیگری از کاربر که خاص باشد مثل ایمیل برای key یا id آن کاربر استفاده می‌کنند. البته که در وبسایت‌های مدرن خیلی کم پیش می‌آید یوزرنیم را به عنوان کلید اصلی انتخاب کنند چون در صورت داشتن قابلیت تغییر آن آپدیت کردن پایگاه داده سخت‌تر از موقعیتی خواهد بود که کلید اصلی یک id عددی باشد و یوزرنیم یک unique identifier که می‌تواند به عنوان alternate key عمل کند.فرض کنید تصویر بالا قسمت لاگین سایت ما است که در بکندش کدی که نوشتیم هست. حالا بیاید فکر کنیم و ببینیم که چگونه می‌توانیم از همچین کد ناامنی سواستفاده کنیم! کد بالا رو وارد یک سیکوئل ادیتور می‌کنیم که راحت‌تر درک کنیم. شما هم می‌توانید هم زمان ما را در یک ادیتور همراهی کنید تا بهتر متوجه مطلب شوید. به رنگ‌ها دقت کنید!فرض کنید کاربر در جایگاه ورودی username یک &#x27; قرار دهد. در این صورت برای کوئری ما چه اتفاقی می‌افتد؟ همانطور که می‌بینید با قرار گرفتن &#x27; در کوئری کوتیشن اول بسته می‌شود و تک کوتیشن دوم باز می‌ماند. چنین ورودی‌ای احتمالا به ما ارور می‌دهد. اگر با وارد کردن &#x27; کاربر ارور بگیرد آن موقع می‌فهمد که سایت ما در مقابل سیکوئل اینجکشن محافظت نشده و می‌تواند از آن سواستفاده کند. حالا کوئری پایین را ببینید.الان چه اتفاقی افتاد؟! این یکی از ساده‌ترین تریک‌های SQL Injection است. (که احتمالا به همین دلیل کمتر جایی پیدا می‌شود که هنوز در مقابل آن ایمن نباشد) اتکر با این روش تک کوتیشن کوئری خود سایت را می‌بندد و با OR به معنای «یا» یک شرط جدید به Query اضافه می‌کند. همه‌چیز را از یوزرز انتخاب کن که در آن یوزرنیم = خالی باشد یا یک مساوی یک! یک دومی فقط یک کوتیشن اولش دارد به این دلیل که می‌خواهیم کوتیشن باقی‌مانده خود کوئری را با آن ببندیم. احتمالا می‌توانید حدس بزنید که چنین کوئری‌ای تمام داده‌های یوزرز را برمی‌گرداند. البته اگر یادتان باشد بالاتر گفتیم که چند نتیجه از کوئری هنگام لاگین خیلی وقت‌ها به ارور منتهی می‌شود و اجازه‌ی ورود به ما نمی‌دهد. مثلا ممکن است برنامه‌نویس شرطی گذاشته باشد که در مواردی که تعداد نتیجه به جز ۰ و ۱ است (صفر برای اطلاعات ورودی غلط و ۱ برای ورودی درست) سایت ارور دهد. اگر چنین شرطی نباشد به احتمال زیاد ما وارد اولین اکانت ساخته شده می‌شویم که در بیشتر موارد یک اکانت ادمینی است. اگر شرط تنها ۰ و ۱ نتیجه وجود داشته باشد از روش زیر هم می‌توانیم استفاده کنیم:لیمیت LIMIT یک دستور دیگر سیکوئل است که کارش محدود کردن تعداد نتیجه‌هاست LIMIT 1 یعنی فقط یک خط از جدول را به ما برگردان (خط اول) که با این کار می‌توانیم بعضی ارورها را دور بزنیم. اما نکته‌ی جالب‌تر در ورودی پسوورد بالا بعد از لیمیت است یعنی «--;». کارایی نقطه ویرگول یا سمی‌کالن(semicolon) و دو خط فاصله یا دش(dash) در اینجا چیست؟ اگر به قبل از لیمیت هم توجه کنید دیگر یک دوم فقط یک کوتیشن ندارد بلکه هر دو کوتیشن‌های اول و دومش را قرار دادیم. چرا؟  به شکلی که کوئری ما با این ورودی‌ها درآمده نگاه کنید. اگر به همان دستور قبلیمان در بالاتر فقط لیمیت اضافه می‌کردیم سیکوئل آن را داخل نقل قولمان یعنی تک کوتیشن‌ها به حساب می‌آورد پس یک تک کوتیشن بعد از ۱ اضافه می‌کنیم که آن را ببندیم. اما اینکار کافی نیست چون تک کوتیشن کوئری ثابت سایت باقی‌مانده است و اجرای این کوئری ارور می‌دهد. پس چطور از شر آن خلاص شویم؟ یک سمی‌کالن قرار می‌دهیم که کوئری را تمام کند و دو دش می‌گذاریم که بقیه‌ی دستوراتی که خود برنامه‌نویس نوشته را به کامنت تبدیل کند! (اگر به رنگ‌ها توجه کنید -- و بعد از آن به رنگ دیگری درآمده که نشان از کامنت بودن و اجرا نشدن آن است) به همین راحتی! البته همه‌ی RDBMSها علامت کامنتشان یکسان نیست ممکن است # یا چیز دیگری باشند پس SQL Injection به کمی آزمون و خطا و صبر نیاز دارد. مقدار کمی در اینجا و مقدار خیلی بیشتری در حمله‌های سخت‌تر و حرفه‌ای‌تر. با یاد گرفتن این سینتکس‌های جدید احتمالا می‌توانید حدس بزنید که در بعضی موارد که دیگر سایت خیلی ناامن باشد (!) می‌توان حتی با فقط پر کردن قسمت یوزرنیم هم وارد یک سایت شد:البته این روش در بیشتر مواقع به صورتی اجرا می‌شود که یوزرنیم را داریم و می‌خواهیم بدون رمز وارد شویم. مثلا می‌خواهیم وارد اکانت ادمین یا یوزری به اسم علی شویم:آخرین مثال این قسمت یک کامیک طنز و برای نشان دادن این است که ایمن نبودن در برابر چنین حمله‌ای می‌تواند چقدر مخرب باشد: (DROP TABLE دستوری از سیکوئل است که کل یک جدول در پایگاه داده را پاک می‌کند)Exploits of a Momقسمت جست‌وجو - searchفرض کنید که یک سایت فروش لوازم تحریر خیلی خیلی ساده (!) داریم و در قسمت جستجوی آن به دنبال خودکار می‌گردیم و نتیجه‌ی زیر به دست می‌آید. (احتمالا از ظاهر غیر حرفه‌ای همچین سایتی هم می‌توان تشخیص داد ناامن است!)بیاید حدسی بزنیم که پشت این نتیجه چه کوئری‌ای نهفته است:SELECT ? FROM ? WHERE ? LIKE &#039;Pen&#039;;علامت سوال‌ها که معنایشان مشخص است؛ فقط آن‌ها را قرار داده‌ایم چون اسم‌های جدول و ستون‌هایمان را نمی‌دانیم. (در واقع در مثال‌های قبلی هم آن‌ها را به عنوان یک اتکر که کوئری پشت سایت را ندیده‌ است نمی‌دانیم و فقط برای درک بهتر اسم‌های ساده‌ای برای آن‌ها قرار دادیم.) اما LIKE چیست؟ لایک هم یک دستور سیکوئل است به این معنا که در پیدا کردن نتایج حروف کوچک و بزرگ را نادیده بگیر. (یعنی مثلا اگر کلمه ورودی کاربر pen بود و محصول Pen‌ آن را نمایش بده و هر حالت دیگری به جز این)حالا بیاید فکر کنیم که چطور می‌توانیم از این کو‌ئری سواستفاده کنیم. اول می‌توانیم از همان روش‌های بالا برای تست کردن ایمنی سایت در مقابل SQL Injection استفاده کنیم. مثلا تک کوتیشن بگذاریم و ببینیم که ارور می‌گیریم یا نه و یا از یک شرط همیشه درست استفاده کنیم که ببینیم تمام محصولات را می‌بینیم یا نه. اما نکته‌ی جدیدی که در این قسمت یاد می‌گیریم روش استفاده از UNION است. UNION دستوری است که با آن می‌توان ردیف‌های جداول مختلف را با هم ترکیب کرد در صورتی که تعداد ستون‌هایشان یکی باشد. یعنی داده‌هایی از جدول دیگری به پایین جدول ما به صورت سطری اضافه می‌شوند. بذارید با مثال ببینیم البته هنوز از جدول دیگری استفاده نمی‌کنیم چون اسم جدولی را نمی‌دانیم:SELECT ? FROM ? WHERE ? LIKE &#039; &#039; UNION SELECT 1, 2; -- &#039;;با این ورودی حالا ما همه‌ی محصولات را داریم به علاوه‌ی یک ردیف دیگر که در آن ۱ و ۲ وجود دارد. (سایتمان تازه افتتاح شده فقط ۴ محصول دارد!) شاید بگویید خب ۱ و ۲ به چه دردمان می‌خورد؟! حق با شماست به طور مستقیم به کارمان نمی‌آید اما یک کارایی که دارد این است که می‌فهمیم سرچ این سایت نسبت به سیکوئل اینجکشن ناامن است و می‌توانیم با UNION اطلاعات دیگری به دست آوریم فقط کافی است نام جدول‌های پایگاه داده‌ی سایت را بدانیم. خب اینجا سوالی که پیش می‌آید این است که از کجا؟ RDBMSها را یادتان هست؟ در بخش سیکوئل گفتیم این‌ها در بعضی از جزئیات فرق می‌کنند که می‌توان برای حمله‌ی دقیق‌تر از آن‌ها استفاده کرد. خب بالاخره به قسمتی که این جزئیات قابل استفاده‌اند رسیدیم. تمام ‌RDBMSها به طور دیفالت خودشان جداولی دارند که اطلاعاتی راجع به دیتابیس در آن‌ها ثبت شده است که در‍ این اطلاعات نام جدول‌ها و جزئیاتشان است! البته قبل از اینکه بتوانیم از این‌ها استفاده کنیم باید بفهمیم که اصلا سایت از چه RDBSMای استفاده می‌کند که پیدا کردن آن هم با استفاده از تفاوت‌های آن‌هاست. مثلا ارورهای مختلف (اگر ارورهای سایت بیش از اندازه به کاربر اطلاعات دهند) یا نتیجه‌ دادن سینتکس‌های مختلف چیزی مثل کامنت‌ها و یا امتحان کردن دستورهایی که فقط در سیستم خاص خود وجود دارند.مثلا فرض کنید با کمک سرچ بار دستور زیر را وارد کوئری می‌کنیم:SELECT ? FROM ? WHERE ? LIKE &#039;Pen&#039; AND 0 = SLEEP(3); -- &#039;;اسلیپ دستوری در MySQL است که وقفه‌ی زمانی ایجاد می‌کند. در اینجا می‌گوییم خط‌هایی را برایم بیاور که در آن‌ها Pen باشد و اسلیپ مساوی صفر که صفر خروجی‌ای است که اسلیپ می‌دهد. یعنی به ازای هر سطری که در نتیجه باشد ۳ ثانیه مکث داریم که در اینجا جمعا ۶ ثانیه. یعنی اگر ۶ ثانیه طول بکشد که صفحه نتایج لود شود می‌فهمیم که سایت از سیستم MySQL استفاده می‌کند. همه‌ی RDBMSها دستوری مشابه این و یا دستورات دیگری دارند که با آن‌ها می‌توانیم بفهمیم دیتابیس روی کدام سیستم است. فرض کنید حالا این کارها را کردیم و  با امتحان و خطا فهمیدیم پایگاه داده‌ی مد نظر ما MySQL است حالا چی؟ حالا می‌رویم سراغ آن جدولی که نام جدو‌ل‌های پایگاه در آن ثبت شده است. در مای‌اس‌کیوال این جدول را در information_schema.tables و به خصوص در ستون TABLE_NAME می‌توانیم پیدا کنیم.SELECT ? FROM ? WHERE ? LIKE &#039; &#039; UNION (SELECT TABLE_NAME, 2 FROM information_schema.tables); -- &#039;;خب حالا اسم جدول‌هایمان را داریم. یک جدول دیگر در MySQL وجود دارد که در آن اسم ستون‌ها آمده و با استفاده از آن می‌توانیم ستون‌های جدول users را به طور زیر پیدا کنیم.SELECT ? FROM ? WHERE ? LIKE &#039; &#039; UNION (SELECT COLUMN_NAME, 2 FROM information_schema.columns WHERE  TABLE_NAME = &#039;users&#039;); -- &#039;;این کوئری در نتیجه به ما ستون‌های جدول کاربران را در پایین محصولات می‌دهد که می‌تواند در آن‌ها نام کاربری، نوع کاربری، کد ملی، شماره موبایل، پسوورد hash‌ شده و خیلی چیزهای دیگر باشد که اتکر به راحتی می‌تواند آن‌ها را به دست آورد. البته اگر همچین وبسایت ضعیفی اصلا وجود داشته باشد شاید حتی رمز کاربران را هم هش نکرده باشد! در واقعیت کمتر سایتی همچین شکلی دارد. سایت دیجی‌کالا را در نظر بگیرید:البته سایت دیجی‌کالا قطعا در مقابل همچین حمله‌های ساده‌ای ایمن است و این صرفا مثالی است برای اینکه ببینید چنین حمله‌ای در واقعیت ممکن است چه شکلی داشته باشد وقتی سایتمان به این سادگی نیست. یک ویژگی خیلی مهم دستور UNION این است که تعداد ستون‌هایی کوئری که ما وارد می‌کنیم باید با ستون‌های کوئری خود سایت برابر باشد که پیدا کردن این تعداد در سایت‌های واقعی به راحتی سایت ساده مثال ما که با نگاه می‌فهمیدیم دو ستون دارد نیست. در چنین وقت‌هایی فقط با امتحان کردن و حدس زدن عدد‌های مختلف می‌توانیم تعداد آن را پیدا کنیم. قسمت‌هایی که در عکس بالا علامت خوردند را ببینید. از این می‌فهمیم که کوئری حداقل ۶ ستون دارد. اما در سایت‌ها معمولا هنگام جستجوها علاوه بر اطلاعاتی که می‌بینیم ستون‌های دیگری هم از دیتابیس برگردانده می‌شود که همین باعث این است که به امتحان و خطا نیاز داشته باشیم. بعد از اینکه تعداد ستون‌ را با عدد گذاشتن پیدا کردیم باید ببینیم اطلاعاتی که نمایش داده می‌شوند در کدام ستون قرار دارند که از آن ستون‌ها از نمایش داده‌هایی که می‌خواهیم استفاده کنیم. مثلا اگر اسم محصول ستون بازگشتی ۴ است TABLE_NAME را در ستون ۴ قرار دهیم که بتوانیم ببینیم.به جز ورود بی‌اجازه، دزدیدن اطلاعات و پاک کردن کامل دیتابیس، کارهای دیگری هم می‌توان با این حمله کرد. مثلا می‌توان از دستور INSERT INTO که برای وارد کردن داده به دیتابیس است، فردی خودش را به جایی که به آن تعلق ندارد اضافه کند مثلا از یک سرویس اشتراکی بدون پول اشتراک بگیرد. یا با دستور UPDATE داده‌های دیتابیس را تغییر دهد مثلا یک دانش‌آموز در سیستم مدرسه نمرات خودش را ۲۰ کند یا فرد دیگری با نفوذ به سیستم بانک به موجودی خود چند صفر اضافه کند! یا هرکار دیگری که با استفاده از دستورهای سیکوئل قابل اجرا باشد.امیدوارم این مثال‌های ساده کمک کرده باشند که بهتر درک کنید SQL Injection چگونه عمل می‌کند هرچند که این مثال‌ها فقط حمله‌های خیلی ساده‌ای بودند که در واقعیت کمتر استفاده می‌شوند. همان طور که می‌بینید هرچه حمله پیچیده‌تر می‌شود به صبر و وقت بیشتری نیاز دارد البته ابزارهایی وجود دارند برای تست کردن امنیت سایت‌ها مثل sqlmap که این کارها را به صورت اتوماتیک در می‌آورند که سرعت کار را بالا می‌برد.انواع SQLiاین حمله به سه دسته کلی In-band‌ و Inferential و Out of Band تقسیم می‌شود.دسته‌ی In-band که به آن سیکوئل اینجکشن کلاسیک هم می‌گویند، شناخته‌شده‌ترین و راحت‌ترین نوع این حمله است. این نوع حمله وقتی است که اتکر نتیجه‌‌هایی که می‌خواهد را از همان کانال ارتباطی‌ای که دستورات سیکوئل را وارد می‌کند پس بگیرد و نتایج را به طور مستقیم ببیند. اکثر مثال‌هایی که در بالا زدیم در این دسته قرار می‌گیرند. این دسته خود نیز انواع مختلفی دارد که UNION Base‌d و Errors Based از معروف‌ترین آن‌هاست. Union Based نوعی از حمله است که از دستور UNION برای اضافه کردن اطلاعاتی که خواست خود برنامه‌نویس نبوده‌ است به داده‌های نمایشی نرم‌افزار استفاده می‌کند و همان حمله‌ای است که در قسمت جستجو از آن استفاده کردیم. در نوع Error Based اتکر سعی می‌کند با وارد کردن دستور‌های اشتباه انواع ارور‌ها را از سیستم بگیرد و از طریق آن راجع به پایگاه داده اطلاعات کسب کند.دسته‌ی Inferential که به اسم Blind SQL Injection بیشتر شناخته می‌شود، حمله‌ای است که در آن بر خلاف حمله‌ی In band اتکر با دستوراتش نتیجه‌ای را مستقیما در برنامه مشاهده نمی‌کند. (که به همین دلیل به حمله‌ی blind به معنای نابینا معروف است) در این حمله اتکر به جای دیدن نتیجه‌ی مستقیم اطلاعاتی از دیتابیس را توسط پاسخ سرور و نرم‌افزار به دستوراتش به دست می‌آورد. به همین دلیل هم این دسته از دسته‌ی In-band زمان بیشتری می‌برد. از انواع این دسته حمله می‌توان به ‌Boolean based و Time based اشاره کرد. ‌بولین نوعی داده است که دو عضو درست و غلط یعنی True و False دارد. در این نوع اتکر با وارد کردن دستوراتی و پس گرفتن True یا False اطلاعات کسب می‌کند. Time based هم مشابه همین است که در آن اتکر با ترکیب کردن یک دستور وقفه با یک دستور درست و غلط مشابه قبلی با مشاهده‌ی وقفه نرم‌افزار یا عدم وقفه اطلاعاتش را به دست می‌آورد. اگر از مثال‌های بالا یادتان باشد در یکی از آن‌ها از دستور SLEEP استفاده کردیم که با استفاده از آن نوع RDBMS را فهمیدیم. آن مثال یک Blind سیکوئل اینجکشن Time-based بود.دسته‌ی Out of Bound از دو دسته‌ی قبل خیلی کمیاب‌تر است. در این نوع حمله اتکر نتایج دستوراتش را در خود برنامه نمی‌گیرد و باید یک سرور دیگر خودش برای دریافت اطلاعات داشته باشد. (Listening Server) دلیل کمتر استفاده شدن حمله‌ی Out of Bound این است که لازم است در سروری که مورد حمله است تنظیماتی فعال باشد و همچنین اینکه از دو روش بالا سخت‌تر و زمان‌برتر است و به مهارب بیشتری نیاز دارد.ممکن است جدا از چیزهایی که گفتیم؛ نام‌ها، دسته‌بندی‌ها و انواع دیگری هم از این حمله به گوشتان خورده باشد که آن‌ها در این سه دسته کلی یا ترکیبی از آن‌ها قرار می‌گیرند. مثلا Second Order SQL Injection حمله‌ای است که در آن اتکر چیزی را داخل دیتابیس اینجکت می‌کند که بعدا موقع انجام دادن عملیات کاربر دیگری در برنامه اجرا می‌شود.کلام آخرتقریبا از زمانی که SQL Injection در سال ۱۹۹۸ میلادی در مقاله‌ی جف فوریستال برای اولین بار ثبت شد بیشتر از ۲۰ سال می‌گذرد اما همچنان یکی از رایج‌ترین و خطرناک‌ترین حمله‌هاست و حتی در سال ۲۰۲۱ هم قربانیانی داشته است. انواع سایت‌ها و برنامه‌های بزرگ قربانی این حمله شده‌اند و این مقاله به دلیل این نوشته‌ شده است که راحتی و قابلیت فراوان این حمله را نشان دهد و برنامه‌نویسان را به خطرات ایمن نساختن برنامه خود به آن آگاه سازد. این مقاله تمرکزش بر جلوگیری نیست پس وارد روش‌های جلوگیری نمی‌شویم اما برای مطالعه بیشتر می‌توانید راجع به Parameterized statements و Input Validation و Escaping و Stored Procedures تحقیق کنید. البته همیشه بهتر است جدیدترین روش‌های جلوگیری را دنبال کنید و از مقالات قدیمی استفاده نکنید. مهم‌ترین نکته برای جلوگیری از سیکوئل اینجکشن این است: به ورودی‌های کاربر اعتماد نکنید!منابع استفاده شده در این مقالهپیچ ویکیپدیای SQL Injection و SQLویدیوهای یوتیوب computerphile: یک Hacking Websites with SQL Injection و دو Running an SQL Injection Attackویدیوی یوتیوب freecodecamp ‌‌Basics of SQL Injectionتاپ تن OWASPکامیک Exploits of a Mom از xkcdاطلاعات نویسنده جمع شده از منابع مختلفمنابع پیشنهادی برای مطالعه بیشتراز بهترین و جامع‌ترین مقالات فارسی مجله irandnn نوشته‌ی شهریار شریفیمقالات خوب freecodecamp: یک و دوتمرین سایت hacksplaining که به طور عملی یک حمله‌ی ساده را آموزش می‌دهدنویسنده: پرنیا اسحاقی | Parnia Eshaghiدانشگاه آزاد اسلامی تهران مرکزکلاس پایگاه دادهاستاد: دکتر مریم حاجی اسمعیلی | دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam Hajiesmaeili | PhD of computer science from Kingston university of Londonدر لینکدین ببینید.</description>
                <category>پرنیا اسحاقی</category>
                <author>پرنیا اسحاقی</author>
                <pubDate>Thu, 21 Apr 2022 19:23:06 +0430</pubDate>
            </item>
            </channel>
</rss>