PHP सत्र निर्धारण / अपहरण


145

मैं PHP सत्र निर्धारण और अपहरण के बारे में अधिक समझने की कोशिश कर रहा हूं और इन समस्याओं को कैसे रोका जा सकता है। मैं क्रिस शिफलेट की वेबसाइट पर निम्नलिखित दो लेख पढ़ रहा हूं:

हालांकि, मुझे यकीन नहीं है कि मैं चीजों को सही ढंग से समझ रहा हूं।

सत्र निर्धारण को रोकने में मदद करने के लिए यह session_regenerate_id (सत्य) को कॉल करने के लिए पर्याप्त है; सफलतापूर्वक किसी को लॉग इन करने के बाद? मुझे लगता है कि मैं इसे सही ढंग से समझता हूं।

उन्होंने सत्र अपहरण को रोकने के लिए $ _GET के माध्यम से url में पारित टोकन का उपयोग करने के बारे में भी बात की। यह वास्तव में कैसे किया जाएगा? मैं अनुमान लगा रहा हूं कि जब कोई व्यक्ति आपके लॉग इन करता है, तो वह अपना टोकन बनाता है और सत्र चर में संग्रहीत करता है, तो प्रत्येक पृष्ठ पर आप उस सत्र चर की तुलना $ _GET चर के मूल्य से करेंगे?

क्या इस टोकन को प्रति सत्र या प्रत्येक पृष्ठ लोड पर केवल एक बार बदलना होगा?

इसके अलावा, उरलों में मूल्य को पास किए बिना अपहरण को रोकने का एक अच्छा तरीका है? यह बहुत आसान होगा।


हो सकता है कि आप उन पेजों से लिंक जोड़ सकते हैं जहाँ आपको ये सिफारिशें मिली हैं।
गमबो

जवाबों:


219

ठीक है, दो अलग-अलग लेकिन संबंधित समस्याएं हैं, और प्रत्येक को अलग तरीके से नियंत्रित किया जाता है।

सत्र निर्धारण

यह वह जगह है जहां एक हमलावर स्पष्ट रूप से उपयोगकर्ता के लिए सत्र के सत्र पहचानकर्ता को निर्धारित करता है। आमतौर पर PHP में यह उनके जैसे url देकर किया जाता है http://www.example.com/index...?session_name=sessionid। एक बार जब हमलावर ग्राहक को url देता है, तो हमला एक सत्र अपहरण अपहरण के समान होता है।

सत्र निर्धारण को रोकने के कुछ तरीके हैं (उन सभी को करें):

  • session.use_trans_sid = 0अपनी php.iniफ़ाइल में सेट करें । यह PHP को पहचानकर्ता को URL में शामिल नहीं करने, और पहचानकर्ताओं के लिए URL पढ़ने के लिए नहीं बताएगा।

  • session.use_only_cookies = 1अपनी php.iniफ़ाइल में सेट करें । यह PHP को बताएगा कि सत्र पहचानकर्ताओं के साथ कभी भी URL का उपयोग न करें।

  • सत्र की स्थिति में कभी भी परिवर्तन करने के लिए सत्र ID पुनर्जीवित करें। इसका मतलब निम्न में से कोई है:

    • प्रयोक्ता प्रमाणीकरण
    • सत्र में संवेदनशील जानकारी संग्रहीत करना
    • सत्र के बारे में कुछ भी बदलना
    • आदि...

सत्र अपहरण

यह वह जगह है जहां एक हमलावर को एक सत्र पहचानकर्ता की पकड़ मिलती है और अनुरोध भेजने में सक्षम होता है जैसे कि वे उस उपयोगकर्ता थे। इसका मतलब यह है कि चूंकि हमलावर के पास पहचानकर्ता है, इसलिए वे सर्वर के संबंध में वैध उपयोगकर्ता से अप्रभेद्य हैं।

आप सीधे सत्र अपहरण को नहीं रोक सकते। हालाँकि आप इसे उपयोग करने के लिए बहुत कठिन और कठिन बनाने के लिए कदम रख सकते हैं।

  • एक मजबूत सत्र हैश पहचानकर्ता का उपयोग करें: session.hash_functionमें php.ini। यदि PHP <5.3, इसे session.hash_function = 1SHA1 के लिए सेट करें । अगर PHP> = 5.3 है, तो इसे session.hash_function = sha256या पर सेट करें session.hash_function = sha512

  • एक मजबूत हैश भेजें: session.hash_bits_per_characterमें php.ini। इस पर सेट करें session.hash_bits_per_character = 5। हालांकि यह दरार करने के लिए किसी भी कठिन नहीं बनाता है , यह एक फर्क पड़ता है जब हमलावर सत्र पहचानकर्ता का अनुमान लगाने की कोशिश करता है। आईडी छोटी होगी, लेकिन अधिक वर्णों का उपयोग करती है।

  • अपनी फ़ाइल में session.entropy_fileऔर साथ एक अतिरिक्त एन्ट्रापी सेट करें । पूर्व और बाद के बाइट्स की संख्या को सेट करें, जो कि एंट्रॉपी फ़ाइल से पढ़ी जाएगी, उदाहरण के लिए ।session.entropy_lengthphp.inisession.entropy_file = /dev/urandomsession.entropy_length = 256

  • डिफ़ॉल्ट PHPSESSID से सत्र का नाम बदलें। यह कॉलिंग session_name()से पहले पहले पैरामीटर के रूप में अपने स्वयं के पहचानकर्ता नाम के साथ कॉल करके पूरा किया जाता है session_start

  • यदि आप वास्तव में पागल हैं तो आप सत्र के नाम को भी घुमा सकते हैं, लेकिन सावधान रहें कि यदि आप इसे बदलते हैं (उदाहरण के लिए, यदि आप इसे समय पर निर्भर करते हैं) तो सभी सत्र स्वतः अमान्य हो जाएंगे। लेकिन आपके उपयोग-मामले के आधार पर, यह एक विकल्प हो सकता है ...

  • अपने सत्र पहचानकर्ता को अक्सर घुमाएँ। मैं यह हर अनुरोध नहीं करूंगा (जब तक आपको वास्तव में सुरक्षा के उस स्तर की आवश्यकता नहीं है), लेकिन एक यादृच्छिक अंतराल पर। आप इसे अक्सर बदलना चाहते हैं यदि कोई हमलावर एक सत्र को हाइजैक करता है तो आप नहीं चाहते हैं कि वे इसे बहुत लंबे समय तक उपयोग करने में सक्षम हों।

  • सत्र में उपयोगकर्ता एजेंट$_SERVER['HTTP_USER_AGENT'] शामिल करें । मूल रूप से, जब सत्र शुरू होता है, तो इसे कुछ इस तरह से संग्रहीत करें $_SESSION['user_agent']। फिर, प्रत्येक बाद के अनुरोध पर जाँच करें कि यह मेल खाता है। ध्यान दें कि यह नकली हो सकता है इसलिए यह 100% विश्वसनीय नहीं है, लेकिन यह बेहतर है।

  • सत्र में उपयोगकर्ता का IP पता$_SERVER['REMOTE_ADDR'] शामिल करें । मूल रूप से, जब सत्र शुरू होता है, तो इसे कुछ इस तरह से संग्रहीत करें $_SESSION['remote_ip']। यह कुछ आईएसपी से समस्याग्रस्त हो सकता है जो अपने उपयोगकर्ताओं के लिए कई आईपी पते का उपयोग करते हैं (जैसे कि एओएल करते थे)। लेकिन अगर आप इसका उपयोग करते हैं, तो यह अधिक सुरक्षित होगा। एक हमलावर के लिए आईपी पते को नकली करने का एकमात्र तरीका वास्तविक उपयोगकर्ता और आपके बीच किसी बिंदु पर नेटवर्क से समझौता करना है। और अगर वे नेटवर्क से समझौता करते हैं, तो वे अपहरण (जैसे MITM हमलों, आदि) से कहीं अधिक बुरा कर सकते हैं।

  • सत्र में और ब्राउज़र साइड पर एक टोकन शामिल करें जिसे आप बढ़ाते हैं और अक्सर तुलना करते हैं। मूल रूप से, प्रत्येक अनुरोध के लिए $_SESSION['counter']++सर्वर की तरफ। जेएस में भी ब्राउज़रों की तरफ से कुछ ऐसा ही करें (स्थानीय भंडारण का उपयोग करके)। फिर, जब आप एक अनुरोध भेजते हैं, तो बस एक टोकन का नॉन ले लें, और सत्यापित करें कि सर्वर पर नॉनस समान है। ऐसा करने से, आपको एक अपहृत सत्र का पता लगाने में सक्षम होना चाहिए क्योंकि हमलावर के पास सटीक काउंटर नहीं होगा, या यदि वे करते हैं तो आपके पास एक ही गिनती को प्रसारित करने वाले 2 सिस्टम होंगे और बता सकते हैं कि जाली है। यह सभी अनुप्रयोगों के लिए काम नहीं करेगा, लेकिन समस्या का मुकाबला करने का एक तरीका है।

दो पर एक नोट

सत्र निर्धारण और अपहरण के बीच अंतर केवल यह है कि सत्र पहचानकर्ता के साथ समझौता कैसे किया जाता है। निर्धारण में, पहचानकर्ता को एक मूल्य पर सेट किया जाता है जिसे हमलावर हाथ से पहले जानता है। अपहरण में यह या तो अनुमान लगाया गया है या उपयोगकर्ता से चुराया गया है। अन्यथा पहचानकर्ता के समझौता करने के बाद दोनों के प्रभाव समान होते हैं।

सत्र आईडी पुनर्जनन

जब भी आप सत्र पहचानकर्ता को पुनर्जीवित करते हैं session_regenerate_idतो पुराने सत्र का उपयोग करना चाहिए। यह कोर सत्र हैंडलर के साथ पारदर्शी रूप से होता है। हालाँकि कुछ कस्टम सेशन हैंडलर इसका उपयोगsession_set_save_handler() नहीं करते हैं और पुराने सत्र पहचानकर्ताओं पर हमला करने के लिए खुले हैं। सुनिश्चित करें कि यदि आप एक कस्टम सत्र हैंडलर का उपयोग कर रहे हैं, तो आप अपने द्वारा खोले जाने वाले पहचानकर्ता का ध्यान रखें, और यदि यह वही नहीं है जिसे आप सहेजते हैं तो आप पुराने पर पहचानकर्ता को स्पष्ट रूप से हटा (या परिवर्तित) करते हैं।

डिफ़ॉल्ट सत्र हैंडलर का उपयोग करना, आप केवल कॉल करने के साथ ठीक हैं session_regenerate_id(true)। जो आपके लिए पुराने सत्र की जानकारी को हटा देगा। पुरानी आईडी अब मान्य नहीं है और यदि हमलावर (या उस मामले के लिए किसी और) ने इसका उपयोग करने की कोशिश की तो एक नया सत्र बनाया जाएगा। कस्टम सत्र संचालकों के साथ सावधान रहें, हालांकि ...।

एक सत्र को नष्ट करना

यदि आप एक सत्र (उदाहरण के लिए लॉगआउट पर) को नष्ट करने जा रहे हैं, तो सुनिश्चित करें कि आप इसे अच्छी तरह से नष्ट कर दें। इसमें कुकी को परेशान करना शामिल है। का उपयोग कर session_destroy:

function destroySession() {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
    session_destroy();
}

4
4 बिट्स प्रति वर्ण के बजाय 5 का उपयोग करने से किसी भी तरह से "ताकत" नहीं बदलती (जो भी इस मामले में "ताकत" का अर्थ है)। लेकिन यद्यपि आपके बिंदु सामान्य रूप से उचित हैं, लेकिन उनके पास कुछ महत्वपूर्ण विवरणों का अभाव है। उदाहरण के लिए, उस सत्र का क्या होता है जो पुराने सत्र आईडी से जुड़ा होता है या पुराने सत्र आईडी वाले सत्र को अमान्य होने के बाद कैसे संभाला जाना चाहिए।
गुमबो

2
@ बट्टल: नहीं, यह बात है। session_regenerate_idउस सत्र को अमान्य नहीं करता है जो अभी भी पुरानी आईडी से जुड़ा हुआ है; यदि सत्र सत्य है तो delete_old_session पैरामीटर सेट होने पर ही नष्ट हो जाएगा। लेकिन क्या होगा अगर एक हमलावर ने इस आईडी पुनर्जनन की पहल की?
गम्बू

6
जब आप सत्र चर को बदलते हैं तो मैं सत्र उत्थान से असहमत हूं, यह केवल लॉगिन / लॉगआउट पर होना चाहिए। उपयोगकर्ता-एजेंट की जाँच करना अर्थहीन है और REMOTE_ADDR की जाँच करना समस्याग्रस्त है। एक बात मैं जोड़ना चाहूंगा session.entropy_file = /dev/urandom। PHP की आंतरिक एन्ट्रापी पीढ़ी बेहद कमजोर साबित होती है और / dev / random या / dev / uranom द्वारा प्रदान किया जाने वाला एन्ट्रापी पूल सबसे अच्छा है जो आप बिना किसी हार्डवेयर रिग के वेब सर्वर पर प्राप्त कर सकते हैं।
बदमाश

4
इसके अलावा, आप जोड़ना चाहिए session.cookie_httponlyऔर session.cookie_secure। पहला वाला xwart xss में मदद करता है (लेकिन यह सही नहीं है)। 2 OWASP ए 9 को रोकने के लिए सबसे अच्छा तरीका है ...
किश्ती

4
इस तरह के एक महान जवाब को न समझें लेकिन सबसे अधिक आयात वाला टुकड़ा गायब है: SSL / HTTPS का उपयोग करें। काउंटर वेतन वृद्धि एक दूसरे के बाद कई अनुरोधों के साथ तेजी से समस्या का एक स्रोत है, एक उपयोगकर्ता दो बार एक पृष्ठ को ताज़ा करता है या दो बार सबमिट बटन दबाता है। IP एड्रेस सॉल्यूशन आजकल सभी मोबाइल यूजर्स के लिए और कभी-कभी IP के बदलने से एक समस्या है। आप आईपी के पहले सेट को देख सकते हैं, लेकिन फिर भी यह परेशानी पूछ रहा है। बेस्ट पहले सत्र में सत्र आईडी की खोज को रोक रहा है और वह एसएसएल / एचटीटीपीएस का उपयोग कर रहा है।
सैन

37

दोनों सत्र हमलों का एक ही लक्ष्य है: किसी अन्य उपयोगकर्ता के वैध सत्र तक पहुंच प्राप्त करना। लेकिन हमले के वैक्टर अलग हैं:

  • एक सत्र निर्धारण हमले में , हमलावर के पास पहले से ही एक वैध सत्र तक पहुंच है और पीड़ित को इस विशेष सत्र का उपयोग करने के लिए मजबूर करने की कोशिश करता है।

  • एक सत्र अपहरण हमले में , हमलावर अपने सत्र का उपयोग करने के लिए पीड़ित के सत्र की आईडी प्राप्त करने की कोशिश करता है।

दोनों हमलों में सत्र आईडी संवेदनशील डेटा है जो इन हमलों पर केंद्रित है। तो यह सत्र आईडी है जिसे पढ़ने की पहुंच (सत्र अपहरण) और लिखने की पहुंच (सत्र निर्धारण) दोनों के लिए संरक्षित करने की आवश्यकता है।

HTTPS का उपयोग करके संवेदनशील डेटा की सुरक्षा का सामान्य नियम इस मामले में भी लागू होता है। इसके अतिरिक्त, आपको निम्नलिखित कार्य करने चाहिए:

सत्र निर्धारण हमलों को रोकने के लिए , सुनिश्चित करें कि:

  • सत्र ID को केवल कुकी से सेट किया जाता है ( session.use_only_cookies को सेट करें true) और HTTPS के लिए इसे केवल तभी बनाएं जब संभव हो ( सेशन . cookie_secure सेट करें true); तुम दोनों के साथ क्या कर सकते हैं session_set_cookie_params

सत्र अपहरण अपहरण को रोकने के लिए , सुनिश्चित करें कि:

दोनों सत्र हमलों को रोकने के लिए , सुनिश्चित करें कि:

  • केवल उन सत्रों को स्वीकार करें जिन्हें आपके आवेदन ने शुरू किया है। आप क्लाइंट विशेष जानकारी के साथ दीक्षा पर एक सत्र का उपयोग करके ऐसा कर सकते हैं। आप उपयोगकर्ता-एजेंट आईडी का उपयोग कर सकते हैं, लेकिन दूरस्थ आईपी पते या किसी भी अन्य जानकारी का उपयोग न करें जो अनुरोधों के बीच बदल सकते हैं।
  • session_regenerate_id(true)प्रमाणीकरण प्रयास ( trueकेवल सफलता पर) या विशेषाधिकारों के परिवर्तन के बाद सत्र आईडी को बदलने और पुराने सत्र को नष्ट करने के लिए। ( यदि आप पुराने सर्वर से जुड़े सत्र को संरक्षित करना चाहते हैं, तो आईडी पुनर्जीवित $_SESSIONकरने session_write_close से पहले उपयोग करने के किसी भी बदलाव को संग्रहीत करना सुनिश्चित करें । अन्यथा नई आईडी वाला सत्र केवल उन परिवर्तनों से प्रभावित होगा।)
  • एक उचित सत्र समाप्ति कार्यान्वयन का उपयोग करने के लिए (देखें कि मैं 30 मिनट के बाद PHP सत्र कैसे समाप्त करूं? )।

बहुत बढ़िया पोस्ट, विशेष रूप से अंतिम अनुभाग।
Mattis

6

आपके द्वारा उल्लिखित टोकन एक "नॉनस" संख्या है - जिसका उपयोग एक बार किया जाता है। जरूरी नहीं कि उनका उपयोग केवल एक बार ही किया जाए, लेकिन जितनी देर तक वे उपयोग करते हैं, उतने ही ऊंचे स्तर पर कब्जा किया जा सकता है कि सत्र को हाइजैक किया जा सके।

नॉन के लिए एक और दोष यह है कि एक ऐसी प्रणाली का निर्माण करना बहुत कठिन है जो उनका उपयोग करता है और एक ही रूप में कई समानांतर खिड़कियों की अनुमति देता है। उदाहरण के लिए, उपयोगकर्ता एक मंच पर दो खिड़कियां खोलता है, और दो पदों पर काम करना शुरू करता है:

window 'A' loads first and gets nonce 'P'
window 'B' loads second and gets nonce 'Q'

यदि आपके पास कई खिड़कियों पर नज़र रखने का कोई तरीका नहीं है, तो आपने केवल एक नॉनस स्टोर किया होगा - वह विंडो B / Q का होगा। जब उपयोगकर्ता तब विंडो A से अपना पोस्ट सबमिट करता है और गैर 'P' में पास होता है, तो ths सिस्टम पोस्ट को अस्वीकार कर देगा P != Q


तो सत्र निर्धारण से इसका क्या लेना-देना है?
किश्ती

2
विशेष रूप से एक साथ कई AJAX अनुरोधों का उपयोग करने के दायरे में उनका एक मान्य बिंदु है।
डैनियल जीटी

2

मैंने शिफलेट का लेख नहीं पढ़ा, लेकिन मुझे लगता है कि आपने कुछ गलत समझा है।

जब भी क्लाइंट कुकीज़ स्वीकार नहीं करता है, तो डिफ़ॉल्ट रूप से PHP URL में सत्र टोकन को पारित करता है। सबसे आम मामले में Oherwise सत्र टोकन को कुकी के रूप में संग्रहीत किया जाता है।

इसका मतलब है कि यदि आप URL में एक सत्र टोकन डालते हैं तो इसे पहचान लेंगे और बाद में इसका उपयोग करने का प्रयास करेंगे। सत्र निर्धारण तब होता है जब कोई व्यक्ति सत्र बनाता है और फिर किसी अन्य उपयोगकर्ता को एक URL खोलकर साझा करने के लिए ट्रिक करता है जिसमें सत्र टोकन होता है। यदि उपयोगकर्ता किसी तरह से प्रमाणित करता है, तो दुर्भावनापूर्ण उपयोगकर्ता एक प्रमाणित व्यक्ति के सत्र टोकन को जानता है, जिसके पास विभिन्न विशेषाधिकार हो सकते हैं।

जैसा कि मुझे यकीन है कि शिफलेट बताते हैं, सामान्य बात यह है कि एक उपयोगकर्ता के बदलाव के विशेषाधिकारों को हर बार एक अलग टोकन प्राप्त करने के लिए।


इसे जोड़ने के लिए, कृपया पहले से खोले गए सत्रों को नष्ट करना सुनिश्चित करें क्योंकि वे अभी भी मौजूदा उपयोगकर्ता अनुमतियों के साथ मान्य होंगे।
corrodedmonkee

0

हाँ, आप लॉगिन पर एक बार सत्र आईडी को पुनः प्राप्त करके सत्र निर्धारण को रोक सकते हैं। इस तरह अगर हमलावर को नए प्रमाणित सत्र का कुकी मूल्य नहीं पता होगा। एक अन्य दृष्टिकोण जो समस्या को पूरी तरह से रोकता है वह session.use_only_cookies=Trueआपके रनटाइम कॉन्फ़िगरेशन में सेट है। एक हमलावर दूसरे डोमेन के संदर्भ में कुकी का मान सेट नहीं कर सकता है। सत्र निर्धारण कुकी मान को GET या POST के रूप में भेजने पर निर्भर करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.