Nginx + পিএইচপি-এফপিএম সহ পিএইচপি বিকল্পটি 'সিজি.ফিক্স_পথিনফো' কি সত্যিই বিপজ্জনক?


51

হয়েছে একটি অনেক এর কথা বলা সম্পর্কে একটি সুরক্ষা সমস্যা আপেক্ষিক cgi.fix_pathinfonginx (সাধারণত পিএইচপি-FPM, দ্রুত সিজিআই) সঙ্গে ব্যবহার পিএইচপি বিকল্প।

ফলস্বরূপ, ডিফল্ট nginx কনফিগারেশন ফাইলটি বলত:

# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

তবে, এখন "অফিসিয়াল" এনগিনেক্স উইকি জানিয়েছে যে উপরের পিএইচপি বিকল্পটি অক্ষম না করেই প্যাথটিএনপিও সঠিকভাবে পরিচালনা করা যায়। তাতে কি?

প্রশ্নাবলি

  • আপনি কি পরিষ্কারভাবে ব্যাখ্যা করতে cgi.fix_pathinfoপারেন? ( অফিসিয়াল ডকটি কেবল বলেছেন : "PATH_INFO সম্পর্কিত আরও তথ্যের জন্য সিজিআই স্পেস দেখুন")
  • পিএইচপি সত্যিই এই PATH_INFOএবং SCRIPT_FILENAMEভেরিয়েবলগুলির সাথে কী করবে ?
  • এনগিনেক্সের সাথে কেন এবং কীভাবে এটি বিপজ্জনক হতে পারে? ( বিস্তারিত উদাহরণ)
  • এই প্রোগ্রামগুলির সাম্প্রতিক সংস্করণগুলিতে এখনও সমস্যাটি বিদ্যমান?
  • অ্যাপাচি কি দুর্বল?

আমি প্রতিটি পদক্ষেপে বিষয়টি বোঝার চেষ্টা করছি। উদাহরণস্বরূপ, পিএইচপি-এফপিএম ইউনিক্স সকেট ব্যবহার করা কেন এই সমস্যাটি এড়াতে পারে তা আমি বুঝতে পারি না ।


উত্তর:


79

টিএল; ডিআর - ফিক্সটি (যা আপনার এমনকি প্রয়োজন নাও হতে পারে) হ'ল খুব সহজ এবং এই উত্তরের শেষে।

আমি আপনার নির্দিষ্ট প্রশ্নগুলিকে সম্বোধন করার চেষ্টা করব, তবে PATH_INFO কী তা সম্পর্কে আপনার ভুল ধারণা প্রশ্নগুলি নিজেরাই কিছুটা ভুল করে wrong

  • প্রথম প্রশ্নটি হওয়া উচিত "এই পথের তথ্য ব্যবসাটি কী?"

  • আপনার পরবর্তী প্রশ্নটি হওয়া উচিত ছিল: "পিএইচপি কীভাবে PATH_INFOএবং কীভাবে তা নির্ধারণ করে SCRIPT_FILENAME?"

    • পিএইচপি এর পূর্ববর্তী সংস্করণগুলি নিষ্পাপ ছিল এবং প্রযুক্তিগতভাবে এমনকি সমর্থন করে না PATH_INFO, তাই যা যা করার কথা PATH_INFOছিল তা হ'ল SCRIPT_FILENAME, যা হ্যাঁ, অনেক ক্ষেত্রেই ভেঙে গেছে। পরীক্ষার জন্য আমার কাছে পিএইচপি-র পুরোনো পর্যাপ্ত সংস্করণ নেই, তবে আমি বিশ্বাস করি এটি SCRIPT_FILENAMEপুরো শেবাংয়ের মতো দেখেছিল : উপরের উদাহরণে "/path/to/script.php/THIS/IS/PATH/INFO" (এর সাথে উপসর্গীকৃত যথারীতি ডোক্রোট)।
    • সিজি.ফিক্স_প্যাথিনফো সক্ষম করে, পিএইচপি এখন উপরের উদাহরণের জন্য সঠিকভাবে "/ THIS / IS / PATH / INFO" সন্ধান করে PATH_INFOএবং SCRIPT_FILENAMEএতে লিখিত অনুরোধ করা স্ক্রিপ্টের দিকে নির্দেশ করে এমন অংশটি পায় (অবশ্যই ডક્ર্রোটের সাথে উপসর্গযুক্ত)।
    • দ্রষ্টব্য: যখন পিএইচপি প্রকৃত পক্ষে সমর্থন পেয়েছে PATH_INFOতখন তাদের নতুন বৈশিষ্ট্যের জন্য একটি কনফিগারেশন সেটিংস যুক্ত করতে হয়েছিল যাতে পুরাতন আচরণের উপর নির্ভরশীল লোকেরা নতুন পিএইচপি সংস্করণ চালাতে পারে। এজন্য এমনকি এটির জন্য একটি কনফিগারেশন সুইচও রয়েছে। এটি শুরু থেকেই অন্তর্নির্মিত হওয়া উচিত ছিল ("বিপজ্জনক" আচরণের সাথে)।
  • তবে পিএইচপি কীভাবে জানবে যে স্ক্রিপ্টটি কোন অংশ এবং এটি কী তথ্য সম্পর্কিত? ইউআরআই যদি এমন কিছু হয় তবে:

    http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo

    • এটি কিছু পরিবেশে একটি জটিল প্রশ্ন হতে পারে। পিএইচপি-তে যা ঘটে তা হ'ল এটি ইউআরআই পথের প্রথম অংশটি সন্ধান করে যা সার্ভারের ডক্রোটের আওতায় থাকা কোনও কিছুর সাথে মিলে না। এই উদাহরণের জন্য, এটি দেখতে পাবে যে আপনার সার্ভারে আপনার কাছে "/docroot/path/to/script.php/THIS" নেই তবে আপনার কাছে অবশ্যই "/docroot/path/to/script.php" আছে তাই এখন SCRIPT_FILENAMEনির্ধারিত হয়েছে এবং PATH_INFOবাকিটি পেয়েছে।
    • সুতরাং এখন বিপদটির উত্তম উদাহরণ যা এনগিনেক্স ডক্সে এবং হ্রভোজিপ্পলজারের উত্তর (যে আপনি এরকম স্পষ্ট উদাহরণ সম্পর্কে উদ্বিগ্ন হতে পারেন না) এ আরও স্পষ্ট হয়ে উঠছেন : প্রদত্ত হারভোজের উদাহরণ (" http: // উদাহরণ)। com / foo.jpg / nonexistance.php "), পিএইচপি আপনার ডক্রুট" /foo.jpg "এ একটি ফাইল দেখে তবে এটি" /foo.jpg/nonexistance.php "বলে" কিছুই SCRIPT_FILENAMEপায় না "/foo.jpg" (আবার, ডক্রোটের সাথে উপসর্গযুক্ত) এবং PATH_INFO"/nonexistance.php" পাওয়া যায়।
  • কেন এবং কীভাবে এটি বিপজ্জনক হতে পারে তা এখন পরিষ্কার হওয়া উচিত:

    • ওয়েব সার্ভারটি সত্যই দোষের নয় - এটি নিছক ইউআরআইকে পিএইচপি-তে প্রক্সিং করছে, যা নির্দোষভাবে আবিষ্কার করে যে "foo.jpg" আসলে পিএইচপি সামগ্রী রয়েছে, সুতরাং এটি কার্যকর করে (এখন আপনি বন্ধ হয়ে গেছেন!)। এটি প্রতি সেগুনে এনগিনেক্সের পক্ষে বিশেষ নয়
  • বাস্তব সমস্যা হল আপনাকে ভেতরে যেতে অবিশ্বস্ত বিষয়বস্তু sanitizing ছাড়া কোথাও আপলোড করা এবং আপনার একই অবস্থানে, যা পিএইচপি সুখে যখন এটা করতে পারেন executes অন্যান্য নির্বিচারে অনুরোধ অনুমতি নেই।
  • এই কৌতুকটি ব্যবহার করে অনুরোধ রোধ করার জন্য এনগিনেক্স এবং অ্যাপাচি নির্মিত বা কনফিগার করা যেতে পারে এবং ব্যবহারকারীর 2372674 এর উত্তর সহ এটি কীভাবে করা যায় তার জন্য প্রচুর উদাহরণ রয়েছে । এই ব্লগ নিবন্ধটি সমস্যাটি সুন্দরভাবে ব্যাখ্যা করেছে, তবে এটি সঠিক সমাধানটি হারিয়েছে।

  • তবে সর্বোত্তম সমাধানটি হ'ল পিএইচপি-এফপিএম সঠিকভাবে কনফিগার করা হয়েছে তা নিশ্চিত করা যাতে এটি "। Php" দিয়ে শেষ না হয়ে কোনও ফাইল কখনই চালিত করতে পারে না। এটি লক্ষণীয় যে পিএইচপি-এফপিএম (~ 5.3.9 +?) এর সাম্প্রতিক সংস্করণগুলির এটি ডিফল্ট হিসাবে রয়েছে, তাই এই বিপদটি আর কোনও সমস্যা হয় না।

সমাধান

আপনার যদি পিএইচপি-এফপিএম (~ 5.3.9 +?) এর সাম্প্রতিক সংস্করণ থাকে তবে আপনাকে কিছুই করতে হবে না, কারণ নীচের নিরাপদ আচরণটি ইতিমধ্যে ডিফল্ট।

অন্যথায়, পিএইচপি-এফপিএম এর www.confফাইল (সম্ভবত /etc/php-fpm.d/www.conf, আপনার সিস্টেমে নির্ভর করে) সন্ধান করুন। আপনার এটি আছে তা নিশ্চিত করুন:

security.limit_extensions = .php

আবার, আজকাল অনেক জায়গায় এটি ডিফল্ট।

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


5
চমৎকার উত্তর! স্পষ্ট করার জন্য: যদি, আপনি যেমনটি বলেন, পিএইচপি কী SCRIPT_FILENAMEতা নির্ধারণ করে , fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;আমার nginxকনফিডে কেন একটি লাইন আছে ? এটি SCRIPT_FILENAMEনিজের দ্বারা মূল্য আবিষ্কার করার জন্য পিএইচপি এর প্রচেষ্টাটিকে ওভাররাইড করে?
টোটার

এর মান পেতে কোনও ফাংশন আছে security.limit_extensions? আমি চেষ্টা phpinfo(), ini_get(security.limit_extensions)এবং ini_get_all()কোন সাফল্যের সঙ্গে।
এলবোলোস্টারস্টারস্ট্যান্ড

আপনাকে ধন্যবাদ, যদি পিএইচপি-এফপিএম (~ 5.3.9 +?) এর সাম্প্রতিক সংস্করণগুলিতে এটি ডিফল্ট হিসাবে থাকে, তবে পিএইচপি 7.1 এর কী প্রয়োজন? নাকি এই নিবন্ধটি ভুল?
ইয়েভেগেনি আফানসিয়েভ

14

প্রকৃতপক্ষে এগুলি ছাড়াও আপনি ওয়েব সার্ভারে 'foo.jpg' এর মতো পিএইচপি কোড সহ ফাইল আপলোড করতে পারেন; তারপরে এটি অনুরোধ করুন http: //domain.tld/foo.jpg/nonexistance.php এবং ওয়েব সার্ভার স্ট্যাক ভুল করে ওহ বলে; এটি একটি পিএইচপি; আমার এটি প্রক্রিয়া করা দরকার, এটি foo.jpg / nonexistance.php সন্ধান করতে ব্যর্থ হবে যাতে এটি foo.jpg এ ফিরে আসে এবং পিএইচপি কোড হিসাবে foo.jpg প্রক্রিয়া করে। এটি বিপজ্জনক যেহেতু এটি সিস্টেমটি খুব সহজে প্রবেশের জন্য উন্মুক্ত করে; উদাহরণস্বরূপ চিত্র আপলোডের অনুমতি দেয় এমন কোনও ওয়েব অ্যাপ্লিকেশন ব্যাকডোর আপলোড করার সরঞ্জাম হয়ে ওঠে।

এটি এড়ানোর জন্য ইউনিক্স সকেটের সাথে পিএইচপি-এফএমপি ব্যবহার সম্পর্কে; আইএমও এটি সমস্যার সমাধান করবে না।


আমার দেওয়া লিঙ্কগুলিতে কী পড়তে পারে তা আপনি কেবল পুনরাবৃত্তি করেন। আপনি আসল প্রক্রিয়াটি ব্যাখ্যা করেন না। আপনার উত্তরের অতিরিক্ত মূল্য আইএমএইচও দরকার।
টোটার

6
এটি সত্য হতে পারে তবে আপনার শিরোনামটিতে প্রশ্ন রয়েছে এবং সেই প্রশ্নের উত্তর আমার প্রতিক্রিয়াতে। আপনি যদি এটি স্পষ্টভাবে চান; হ্যাঁ এটি বিপজ্জনক; খুব বিপজ্জনক
হ্রভোয়েপ্পলজার

1 / আমার উত্তরটি এর শিরোনামের মধ্যে সীমাবদ্ধ নয়: এর একটি শরীর রয়েছে। 2 / user109322 আপনি ভুল প্রমাণিত হয়েছে: যাই হোক না কেন জন্য ব্যবহৃত মান cgi.fix_pathinfoহয় না কারণ এর ডিফল্ট সার্ভার, বিপজ্জনক php-fpmনিরাপদ (এটি শুধুমাত্র ফাইল চালানো হবে .phpএক্সটেনশন)।
টোটার

2

ইন nginx উইকি নিরাপত্তা ব্যবস্থা যেমন

if (!-f $document_root$fastcgi_script_name) {
    return 404;
}

অবস্থান ব্লক অন্তর্ভুক্ত করা হয়। অন্যান্য টিউটোরিয়ালে

try_files $uri =404;

ব্যবহৃত হয়, যা একই কাজ করা উচিত, তবে এনগিনেক্স উইকির অনুযায়ী সমস্যা দেয়। এই বিকল্পগুলির সাথে, cgi.fix_pathinfo=1আর কোনও সমস্যা হওয়া উচিত নয়। আরও তথ্য এখানে পাওয়া যাবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.