এসকিউএল ইনজেকশন

এসকিউএল ইনজেকশন একটি কোড ঢোকানোর প্রয়োগ কৌশল যেটি উপাত্ত চালিত অ্যাপ্লিকেশন আক্রমণ করতে ব্যবহৃত হয়। এই পদ্ধতিতে অসৎ উদ্দেশ্যমূলক এসকিউএল স্টেটমেন্ট/বিবৃতিসমূহ, এন্ট্রি ফিল্ডে সম্পাদন করার জন্য প্রবেশ করান হয় (উদাহরণস্বরূপ ডাটাবেসের সমস্ত তথ্য আক্রমণকারীর কাছে পাঠিয়ে দেয়)। এসকিউএল ইনজেকশন একটি অ্যাপ্লিকেশন সফ্টওয়্যারের কোন একটি নিরাপত্তা ঝুঁকিকে কাজে লাগায়-উদাহরণস্বরূপ যখন:-
বেশিরভাগ সময় এসকিউএল ইনজেকশন ওয়েবসাইটগুলির জন্য একটি আক্রমণ বাহক হিসাবে পরিচিত কিন্তু এটি এসকিউএলের যে কোন প্রকার ডাটাবেস আক্রমণ করতেও ব্যবহৃত হতে পারে।
এসকিউএল ইনজেকশন আক্রমণ, আক্রমণকারীদের পরিচয় ফাঁকি দিতে, বিদ্যমান তথ্য বিনষ্ট বা বদলাবার সুযোগ করে দিতে, অগ্রাহ্যমূলক সমস্যার সৃষ্টি করে যেমন ট্রান্সাক্সান/লেনদেন নাকচ করা অথবা ব্যালেন্স/উদ্বৃত্ত পরিবর্তন করা, সিস্টেমের সব তথ্য সম্পূর্ণ প্রকাশের অনুমতি, উপাত্ত/তথ্য নষ্ট করে ফেলা অথবা এটি অন্যত্র অনুপলব্ধ করা এবং ডাটাবেজ সার্ভারের প্রশাসক হওয়া ইত্যাদির অনুমতি দেয়।
২০১২র একটি সমীক্ষায় দেখা গেছে যে গড় ওয়েব অ্যাপ্লিকেশন প্রতি মাসে ৪টি আক্রমণের প্রচারণা পেয়েছে, খুচরো ব্যবসায়ী ও অন্যান্য ব্যাবসায়ীদের গড়ে ২টি আক্রান্ত হবার সম্ভাবনা দেখা গেছে।
১৯৯৮ সালে এসকিউএল ইনজেকশনের প্রথম প্রকাশ্য আলোচনার শুরু; উদাহরণস্বরূপ, ১৯৯৮ সালের ফ্র্যাক ম্যাগাজিনেের একটি নিবন্ধ।
ওপেন ওয়েব অ্যাপ্লিকেশন সিকিউরিটি প্রকল্প দ্বারা ২০০৭ এবং ২০১০ সালের ওয়েব অ্যাপ্লিকেশনের আক্রান্ত হবার শীর্ষ ১০টি ঝুঁকির একটি এসকিউএল ইনজেকশন (এসকিউএলআই) বিবেচনা করা হয়। ২০১৩ সালে, এসকিউএলআই ওপেন ওয়েব অ্যাপ্লিকেশন সিকিউরিটি প্রকল্পে আক্রান্ত হবার শীর্ষ ১০টি ঝুঁকির প্রথম নম্বরে ছিল। এসকিউএল ইনজেকশনের প্রধান চারটি উপ-শ্রেণী আছে:
স্টর্ম ওয়ার্ম কম্পাঊন্ড এস কিউ এল আইয়ের একটি প্রতিরূপ।
২০১০ পর্যন্ত এসকিউএলআইএর বিবর্তন অনুসারে, এই শ্রেণিবিভাগ এসকিউএলআই এর অবস্থা উপস্থাপন করে— পরবর্তী পরিমার্জনের কাজ চলছে।
এই ধরনের এসকিউএল ইনজেকশন ঘটে যখন ব্যবহারকারীর ইনপুট অব্যাহতি অক্ষরগুলির জন্য পরিশ্রুত হয় না এবং তখন এটি একটি এসকিউএল স্টেটমেন্ট/বিবৃতিতে পাস/অতিক্রান্ত হয়। এটি এই অ্যাপ্লিকেশনটির এন্ড ইউসার(প্রান্তিক ব্যবহারকারী) দ্বারা ডাটাবেস সম্পাদনায়, স্টেটমেন্টে সম্ভাব্য কারচুপির ফলাফল।
কোডের নিম্নলিখিত লাইন এই ঝুঁকিটি তুলে ধরে:
স্টেটমেন্ট/বিবৃতি = "SELECT * FROM users WHERE name = '" + userName + "';"
এই এসকিউএল কোডটি ব্যবহারকারীদের টেবিল থেকে নির্দিষ্ট নামের ব্যবহারকারীর তথ্যগুলি টেনে আনার জন্য নির্মিত। যদিও "ব্যবহারকারীর নাম" ভেরিএবেলটি, একটি ক্ষতিকারক ব্যবহারকারীর দ্বারা নির্দিষ্ট ভাবে নির্মিত হয়, এসকিউএল স্টেটমেন্ট কোডটি, নির্মান কর্তার অভীষ্টর চেয়ে বেশি কিছু করতে পারে। উদাহরণ হিসেবে বলা যায়, যেমন "ব্যবহারকারীর নাম" ভেরিএবেল নির্দিষ্টকরণ এইভাবে:
অথবা এমনকি বাকি কুয়েরি ব্লক করতে কমেন্টস/মন্তব্য ব্যবহার করা( এসকিউএল কমেন্টস তিন ধরনের হয়)। তিনটির সবকটি লাইনের শেষে একটি ফাঁকা স্থান আছে:
ঊর্ধ্বতন ভাষা দ্বারা নিম্নলিখিত একটি এসকিউএল স্টেটমেন্ট এইপ্রকার:
SELECT * FROM users WHERE name = " OR '1'='1';
SELECT * FROM users WHERE name = " OR '1'='1' -- ';
এই কোড একটি অনুমোদনের কার্যপ্রণালীরূপে ব্যবহার করা হলে এই উদাহরণটি একজন নির্দিষ্ট ব্যবহারকারীর নামের বদলে 'সমস্ত' ব্যবহারকারীদের প্রত্যেকটি ডাটা ফিল্ড (*) নির্বাচনে ব্যবহার হতে পারে যেমন কোডার(যিনি কোড লিখেছিলেন) চেয়েছিলেন।, কারণ '1' = '1' মূল্যায়ন সবসময় সত্য (শর্ট সার্কিট মূল্যায়ণ)
নিচের বিবৃতিতে "ব্যবহারকারীর নাম" এর নিম্নলিখিত মান, "ব্যবহারকারী" টেবিল মুছে ফেলার পাশাপাশি "userinfo" টেবিল থেকে সমস্ত ডেটা নির্বাচন করতে পারে, একটি এপিআই ব্যবহার করে যেটি একাধিক স্টেটমেন্টের অনুমতি দেয় (সারাংশ হল প্রতিটি ব্যবহারকারীর তথ্য প্রকাশ করতে পারে):
এই ইনপুটটি নিম্নলিখিত চূড়ান্ত ও নিদিষ্ট এসকিউএল স্টেটমেন্ট উপস্থাপনা করে।
SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't';
যদিও বেশির ভাগ SQL সার্ভার প্রয়োগ ব্যবস্থাগুলো একাধিক বিবৃতি এই ভাবে একটি কলের মাধ্যমে কার্যকর করার অনুমতি দেয়। কিছু এসকিউএল এপিয়াই যেমন পিএইচপির codice_1 ফাংশনটি নিরাপত্তার কারণে এটার অনুমতি দেয় না। এটি সম্পূর্ণরূপে আলাদা ক্যোয়ারী ইনজেকশনের থেকে আক্রমণকারীদের বাধা দেয়, কিন্তু তাদের ক্যোয়ারী পরিবর্তন করার থেকে আটকাতে পারে না।
এই ধরনের এসকিউএল ইনজেকশন ঘটে যখন একটি " 'ইউসার সাপ্লাায়েড' "/ব্যবহারকারী দ্বারা লিখিত ফিল্ডটি শক্তিশালী ভাবে টাইপ করা হয় না অথবা টাইপ কন্সট্রেন্টের এর জন্য যাচাই করা থাকে না। এইটি ঘটতে পারে যখন একটি সাংখ্যিক ক্ষেত্র, একটি এসকিউএল স্টেটমেন্টে ব্যবহার করা হয়, কিন্তু প্রোগ্রামার ব্যবহারকারীর সরবরাহকৃত ইনপুটটি সাংখ্যিক কিনা তা যাচাই করতে কোন চেক লাগান না। যেমন:
এই বিবৃতি থেকে স্পষ্ট যে প্রণেতা "id" ক্ষেত্রটির সঙ্গে সংযুক্ত a_variable টি একটি সংখ্যাই হোক এমনটি চেয়েছিলেন। যাইহোক, এটি আসলে একটি স্ট্রিং হলে এন্ড ইউসার এস্কেপ কারেক্টারের প্রয়োজনকে বাদ দিয়ে স্টেটমেন্টটি ইচ্ছামত বদলাতে পারেন। উদাহরণস্বরূপ a_variable কে সেট করে
ডাটাবেস থেকে "ব্যবহারকারীদের" টেবিলটি ড্রপ করে দেবে(মুছে দেবে) যেহেতু এসকিউএলটি দাঁড়িয়েছে:
SELECT * FROM userinfo WHERE id=1; DROP TABLE users;
ব্লাইন্ড এসকিউএল ইনজেকশন সেক্ষেত্রে ব্যবহার হয়, যখন একটি ওয়েব অ্যাপ্লিকেশন একটি এসকিউএল ইনজেকশন ঝুঁকির মুখে থাকে কিন্তু ইনজেকশনটির ফলাফল আক্রমণকারী কাছে দৃশ্যমান নয়। ঝুঁকিযুক্ত পাতাটি উপাত্ত প্রদর্শনকারী পাতা নাও হতে পারে কিন্তু ওই পাতাটি কল করার জন্য যে বৈধ এসকিউএল স্টেটমেন্টটি আছে তাতে যে যৌক্তিক বিবৃতি ইনজেকট করা হয়েছে, তার ফলাফলের উপর নির্ভর করে, ভিন্নভাবে উপাত্ত প্রদর্শিত হতে পারে। আক্রমণের এই ধরনটি প্রথাগতভাবে সময় সাপেক্ষ কারণ প্রতিটি বিট উদ্ধার করার জন্য একটি নতুন বিবৃতি তৈরি করা প্রয়োজন হয় এবং পাতাটির কাঠামোর উপর নির্ভর করে, আক্রমণ অনেক সময় অসফল হতে পারে। সাম্প্রতিক ক্রমবিকাশে আরো সামঞ্জস্যপূর্ণ এবং দক্ষ নিষ্কাশনের অনুমতি সহ প্রতিটি অনুরোধে একাধিক বিট পুনরুদ্ধার করতে অনুমতি দেয়, কোন অসফল অনুরোধ ছাড়া। একবার ঝুঁকির স্থান এবং লক্ষ্যস্থলের তথ্যটি প্রতিষ্ঠিত হলে বিভিন্ন সরঞ্জাম দণ্ডের সাহায্যে এই আক্রমণগুলি স্বয়ংক্রিয়ভাবে হতে পারে।
এক ধরনের ব্লাইন্ড এসকিউএল ইনজেকশন ডাটাবেসকে একজন সাধারণ অ্যাপ্লিকেশন পাতায় একটি যৌক্তিক বিবৃতি মূল্যায়ন করতে বাধ্য করে। উদাহরণস্বরূপ একটি বই পর্যালোচনা ওয়েবসাইট, যেটি বই পর্যালোচনা প্রদর্শন নির্ধারণ করার জন্য একটি কোয়েরি স্ট্রিং ব্যবহার করে। সেইজন্য codice_2 ইউয়ারএল কুয়েরিটি সার্ভারে রান করাবে।
SELECT * FROM bookreviews WHERE ID = 'Value(ID)'; যা থেকে বুকরিভিউ টেবিলের মধ্যে সংরক্ষিত আইডি ৫ এর পর্যালোচনা ডেটা দিয়ে পর্যালোচনা পাতা ভরবে, কুয়েরিটি সার্ভারে সম্পূর্ণরূপে ঘটবে; ব্যবহারকারী ডাটাবেস, টেবিল, বা ফিল্ডের নামগুলো, কিংবা কোয়েরি স্ট্রিং কোনটাই জানে না। ব্যবহারকারী শুধুমাত্র দেখেন যে উপর্যুক্ত ইউয়ারএল- এ একটি বই পর্যালোচনা ফেরৎ আসছে। একজন হ্যাকার ইউআরএলগুলি লোড করতে পারেন। codice_3 এবং codice_4, যথাক্রমে যে ক্যোয়ারীগুলি ঘটতে পারে
SELECT * FROM bookreviews WHERE ID = '5' OR '1'='1';
SELECT * FROM bookreviews WHERE ID = '5' AND '1'='2';
"1=1" URL দ্বারা যদি মূল পর্যালোচনা লোড হয় এবং "1 = 2" URL থেকে একটি খালি অথবা ত্রুটি পাতায় ফিরিয়ে দেওয়া হয় এবং ব্যবহারকারীকে ইনপুটটি অবৈধ সতর্ক করার জন্য ফেরত পৃষ্ঠা তৈরি করা নেই অথবা অন্য কথায়, একটি ইনপুট টেস্ট স্ক্রিপ্ট দ্বারা ফাঁদে পড়েছে, সাইটটি সম্ভবত একটি এসকিউএল ইনজেকশন আক্রমণের ঝুঁকির সম্মুখীন হতে পারে যেহেতু কুয়েরি সম্ভবত উভয় ক্ষেত্রেই সফলভাবে গৃহীত হবে। হ্যাকার মাইএসকিউএল সার্ভারে চলমান সংস্করণ নম্বরটি প্রকাশ করার জন্য এই কুয়েরি স্ট্রিং দ্বারা পরিকল্পিত পথে এগিয়ে যেতে পারেন: codice_5, যা একটি সার্ভারে চলমান মাইএসকিউএল ৪ তে বই পর্যালোচনা এবং অন্যথায় একটি খালি অথবা ত্রুটি পৃষ্ঠা দেখাবে। হ্যাকার আক্রমণের আরেকটি পথ আবিষ্কার অথবা তার লক্ষ্য পূর্ণ না হওয়া পর্য্যন্ত সার্ভার থেকে আরও তথ্যের সংগ্রহের জন্য কুয়েরি স্ট্রিংএর ভিতর কোড ব্যবহার চালিয়ে যেতে পারেন।
দ্বিতীয় সারির এসকিউএল ইনজেকশন ঘটে, যখন অবিলম্বে নির্বাহ হবার বদলে, জমা দেওয়া ভ্যালুতে/মানে, সংরক্ষিত ক্ষতিকারক কমান্ডটি থাকে। কিছু কিছু ক্ষেত্রে, অ্যাপ্লিকেশন সঠিকভাবে একটি এসকিউএল বিবৃতি এনকোড করে এবং বৈধ এসকিউএল হিসাবে সংরক্ষণ করতে পারে। এরপরে, অ্যাপ্লিকেসানের অন্য অংশ এসকিউএল ইনজেকশন সুরক্ষা নিয়ন্ত্রণ ছাড়া, এই সংরক্ষিত এসকিউএল বিবৃতিটি চালাতে পারে। এই আক্রমণে, কীভাবে জমা দেওয়া মান পরে ব্যবহার করা হয়, তার আরো জ্ঞান প্রয়োজন। অটোমেটেড ওয়েব অ্যাপ্লিকেশন নিরাপত্তা স্ক্যানারগুলি, এই ধরনের এসকিউএল ইনজেকশন সহজে শনাক্ত করে না এবং ম্যানুয়ালভাবে নির্দেশ দেওয়ার দরকার হতে পারে, কোথায় তথ্যপ্রমাণের জন্য চেক করতে হবে, যেখানে এই ধরনের চেষ্টা করা হচ্ছে।
এসকিউএল ইনজেকশন একটি সুপরিচিত আক্রমণ এবং সহজে সরল পদক্ষেপ দ্বারা আটকানো সম্ভব। টকটকের উপর ২০১৫ সালে এসকিউএল ইনজেকশনের একটি আপাত হামলার পর, বিবিসির রিপোর্ট নিরাপত্তা বিশেষজ্ঞরা স্তম্ভিত হন, যে এই ধরনের একটি বৃহৎ কোম্পানিও এটার দ্বারা ঝুঁকিপ্রবন হতে পারে। 
সবচেয়ে উন্নত প্ল্যাটফর্মগুলিতে, প্যারামিটারযুক্ত বিবৃতি যেগুলি প্যারামিটার দ্বারা কাজ করে সেটির বিবৃতিতে ব্যবহারকারীর ইনপুট এম্বেডিং/সন্নিবদ্ধ করার পরিবর্তে (কখনও কখনও বলা হয় প্লেসহোল্ডার বা ব্লাইন্ড ভেরিয়েব্‌ল গুলি) ব্যবহার করা যেতে পারে। একটি প্লেসহোল্ডার, একটি অযৌক্তিক এসকিউএল টুকরা নয় শুধুমাত্র উল্লেখিত টাইপের/ধরনের মান সংরক্ষণ করতে পারে। অতএব এসকিউএল ইনজেকশন কেবল একটি অদ্ভুত (এবং সম্ভবত অবৈধ) পরামিতি মান হিসাবে গণ্য করা হবে।
অনেক ক্ষেত্রে, এসকিউএল স্টেটমেন্ট নির্দিষ্ট এবং প্রতিটি প্যারামিটার এক একটি ভেরিএব্‌ল, একটি টেবিল নয়। ব্যবহারকারীর ইনপুট তখন একটি প্যারামিটারে নির্ধারিত(আবদ্ধ) হয়।
অবজেক্ট রিলেশনাল ম্যাপিং ব্যবহার করে লাইব্রেরিগুলি এসকিউএল কোড লেখার প্রয়োজন এড়ায়। তখন কার্যকরীভাবে ORM লাইব্রেরী অবজেক্ট ওরিয়েন্টেড কোড থেকে পরামিতিযুক্ত এসকিউএল স্টেটমেন্ট উৎপন্ন করবে।
ইনজেকশন থেকে রক্ষা পাবার একটি সহজবোধ্য, যদিও ত্রুটি-প্রবণ পথ হল সেইসব অক্ষর না ব্যবহার করা যেগুলির SQL এ একটি বিশেষ মানে হয়। একটি SQL DBMS এর জন্য প্রয়োজনীয় নির্দেশাবলী সহায়িকায় ব্যাখ্যা করা আছে যে, কোন অক্ষরগুলির একটি বিশেষ অর্থ আছে, যা অক্ষরগুলির একটি বিস্তৃত কালোতালিকা তৈরির মঞ্জুরি প্রদান করে সেগুলির অনুবাদের প্রয়োজন। উদাহরণ হিসেবে বলা যায়, একটি বৈধ এসকিউএল স্ট্রিং লিটারাল গঠনের জন্য, একটি প্যারামিটারে, একটি একক উদ্ধৃতি ( ') প্রতিটি বারের জন্য দুটি একক উদ্ধৃতি (") দ্বারা প্রতিস্থাপন করা উচিত। উদাহরণস্বরূপ, পিএইচপি তে SQL কোয়েরি পাঠানোর আগে, সাধারনত প্যারামিটারগুলি এড়াতে; codice_6 ফাংশন ব্যবহার করা হয় :
$mysqli = new mysqli('hostname', 'db_username', 'db_password', 'db_name');
$query = sprintf("SELECT * FROM `Users` WHERE UserName='%s' AND Password='%s'",
$mysqli->query($query);
এই ফাংশনটি অক্ষরের আগে ব্যাকস্ল্যাশ শুরুতে যোগ করে:codice_7, codice_8, codice_9, codice_10, codice_11, codice_12 and codice_13।
এই ফাংশনটি সাধারনত মাইএসকিউএল -এ একটি কোয়েরি পাঠানোর আগে ডেটা সুরক্ষিত করতে ব্যবহৃত হয়। পিএইচপিতে বিভিন্ন ডাটাবেসের ধরনের জন্য অন্যান্য ফাংসানগুলি আছে যেমন PostgreSQL এর জন্য pg_escape_string()। ফাংশন codice_14 অক্ষর এড়ানোর জন্য কাজ করে, এবং পিএইচপিতে যেখানে এস্কেপিং ফাংশানটি নেই সেখানে ডাটাবেস উপর কুয়েরীর জন্য বিশেষভাবে ব্যবহার করা হয়। এটি ডাটাবেসের কুয়েরীগুলিতে উদ্ধৃত করা প্রয়োজনীয় অক্ষরের আগে, ব্যাকস্ল্যাশের সঙ্গে একটি স্ট্রিং ফেরৎ দেয়। এই অক্ষরগুলি হল একক উদ্ধৃতি ( '), ডবল উদ্ধৃতি ("), ব্যাকস্ল্যাশ (\) এবং NUL (নাল বাইট)।
নিয়মিতভাবে এসকিউএল এ স্ট্রিং এড়ান, ত্রুটিপ্রবণ কারণ একটি প্রদত্ত স্ট্রিং কে এড়ান ভুলে যাওয়া স্বাভাবিক। ইনপুটকে নিরাপদ করার জন্য একটি স্বচ্ছ স্তর তৈরি করলে, যদি এটা সম্পূর্ণভাবে নির্মূল নাও হয়, ত্রুটি-প্রবণতা কমান যায়।
পূর্ণসংখ্যা, ফ্লোট বা বুলিয়ান, স্ট্রিং পরামিতিগুলি পরীক্ষা করা সম্ভব যদি তাদের মান প্রদত্ত টাইপের জন্য বৈধ প্রতিরূপ হয়। স্ট্রিংসগুলি কিছু জটিল প্যাটার্ন (তারিখ, UUID, শুধুমাত্র আলফানিউমেরিক ইত্যাদি) অনুসরণ করলে সেই প্যাটার্নের সঙ্গে মিলিয়ে পরীক্ষা করা সম্ভব হবে।
ওয়েব অ্যাপ্লিকেশন দ্বারা ব্যবহার করা ডাটাবেসের লগইন অনুমতি প্রয়োজন মাফিক সীমিত করলে, ওয়েব অ্যাপ্লিকেশনের কোন বাগ কাজে লাগিয়ে এসকিউএল ইনজেকশন আক্রমণের কার্যকারিতা কমান যেতে পারে। উদাহরণস্বরূপ, মাইক্রোসফট এসকিউএল সার্ভার, একটি ডাটাবেস লগঅন পদ্ধতি দ্বারা কিছু সিস্টেম টেবিল নির্বাচন করার ক্ষেত্রে রক্ষণশীলতা,ডাটাবেসের সমস্ত কলামে জাভাস্ক্রিপ্ট সন্নিবেশ করে সমস্যা তৈরীর চেষ্টাটি কিছুটা নিয়ন্ত্রিত করে।
deny select on sys.sysobjects to webdatabaselogon;
deny select on sys.objects to webdatabaselogon;
deny select on sys.tables to webdatabaselogon;
deny select on sys.views to webdatabaselogon;
deny select on sys.packages to webdatabaselogon;