flawopen.com/Vulnerabilities/Session Fixation और Cookie सुरक्षा
Session Fixation: लॉगिन पर ID बदलें (CWE-384)
कल्पना करें कि किसी यात्री को सामान का ऐसा दावा नंबर इस्तेमाल करने के लिए बहकाया गया जिसे हमलावर पहले से जानता है। अगर एयरलाइन सामान जमा होने के बाद भी वही नंबर रखे, तो हमलावर बैग ले सकता है। Session Fixation में ऐप ऐसा पहचानकर्ता स्वीकार करता है जिसे हमलावर पीड़ित से इस्तेमाल करवा सकता है, और फिर बिना बदले उसे authenticated session बना देता है। दोनों शर्तें आवश्यक हैं; साधारण phishing link अकेले session fix नहीं करता, जब तक ऐप उस पहचानकर्ता को स्वीकार या सेट न कर सके।
मुख्य अवधारणाएँ और subsystem शब्द
- Session Fixation
- Session प्रबंधन का दोष जिसमें ऐप हमलावर को ज्ञात पहचानकर्ता स्वीकार करता है और पीड़ित के login के बाद भी वही रखता है।
- Session ID rotation
- जब authentication session के विशेषाधिकार बढ़ाए, नई अप्रत्याशित ID जारी करें। केवल वही session data रखें जिसे ऐप को बनाए रखना है।
- Cookie attributes
Securecookie को HTTPS तक सीमित करता है;HttpOnlyJavaScript से cookie पढ़ने रोकता है;SameSiteकुछ cross-site cookie भेजने को नियंत्रित करता है। ये अलग जोखिमों पर काम करते हैं और ID rotation का विकल्प नहीं हैं।__Host-prefix- समर्थित browsers में HTTPS से सेट Secure cookie,
Path=/और बिनाDomainattribute की आवश्यकता होती है। इससे sibling subdomain के लिए parent domain पर उसी नाम की cookie सेट करना कठिन होता है।
चरण-दर-चरण हमले का प्रवाह
हमलावर session ID प्राप्त करता या चुनता है
कोई अलग कमजोरी या सुविधा हमलावर को ID पाने और पीड़ित के browser से उसे भेजवाने देती है। तरीका ऐप पर निर्भर है; यदि URL में session ID स्वीकार नहीं होती तो सामान्य phishing link पर्याप्त नहीं है।
पीड़ित हमलावर को ज्ञात पहचानकर्ता इस्तेमाल करता है
Browser वह ID ऐप को भेजता है और ऐप इसे मान्य anonymous session मानता है। हमलावर को उसी ID को पहचानने या फिर इस्तेमाल करने में सक्षम होना चाहिए।
Authentication session के अधिकार बदलता है
पीड़ित login करता है। यदि ऐप ID बदले बिना authenticated पहचान को मौजूदा ID से जोड़ता है, तो वही ज्ञात पहचानकर्ता authenticated session दर्शाने लगता है।
हमलावर अपरिवर्तित ID फिर इस्तेमाल करता है
यदि हमलावर ID भेज सकता है और server ने उसे अमान्य नहीं किया है, तो वह पीड़ित के session तक पहुँच सकता है। privilege बदलते समय ID rotation इस श्रृंखला को तोड़ता है।
तंत्र और मूल कारण
Session Fixation के लिए हमलावर का पीड़ित द्वारा इस्तेमाल की जाने वाली ID पर प्रभाव और login के बाद ऐप का उसे न बदलना—दोनों आवश्यक हैं। Cookie attributes अतिरिक्त सुरक्षा हैं, लेकिन rotation का विकल्प नहीं: HttpOnly script से पढ़ना सीमित करता है, Secure HTTPS लागू करता है, SameSite कुछ cross-site भेजने घटाता है और __Host- समर्थित browsers में cookie का दायरा सीमित करता है।
# VULNERABLE: custom session code keeps the pre-authentication ID.
def login_view(request):
user = authenticate(request, request.POST["username"],
request.POST["password"])
if user is not None:
# BUG: privilege changes, but the session ID does not.
request.session["user_id"] = user.pk
request.session["authenticated"] = True
return redirect("/account/")
return redirect("/login/")
# HARDENED: Django login() rotates the session key on authentication.
from django.contrib.auth import authenticate, login
def login_view(request):
user = authenticate(request, request.POST["username"],
request.POST["password"])
if user is not None:
# Uses Django's supported authentication/session integration.
login(request, user)
return redirect("/account/")
return redirect("/login/")
# settings.py: use HTTPS, host-only scope, and a deliberate SameSite policy.
SESSION_COOKIE_NAME = "__Host-sessionid"
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = "Lax"
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_DOMAIN = None
हमले का क्रम और वैचारिक उदाहरण
- 1पूर्वशर्त: अलग कमजोरी या सुविधा हमलावर को उस ID पर प्रभाव देती है जिसे पीड़ित का browser भेजेगा।
- 2ज्ञात ID: हमलावर उसी anonymous session ID को पहचान या दोबारा इस्तेमाल कर सकता है।
- 3Authentication: Browser ज्ञात ID भेजता रहता है और पीड़ित login करता है।
- 4Rotation नहीं: ऐप पहचानकर्ता बदलने के बजाय मौजूदा session के अधिकार बढ़ाता है।
- 5सशर्त प्रभाव: हमलावर केवल तब authenticated session तक पहुँचता है जब ज्ञात ID मान्य और उपयोग योग्य हो।
इंजीनियरिंग सुरक्षा और रोकथाम नियम
- ✓Privilege बदलने पर ID बदलें: Login और अन्य privilege elevation पर नई अप्रत्याशित ID जारी करें; framework के दस्तावेज़ित व्यवहार के अनुसार पुरानी ID अमान्य करें।
- ✓Framework authentication API अपनाएँ: Session में पहचान manually लिखने के बजाय समर्थित login/session integration इस्तेमाल करें (Django में
django.contrib.auth.login())। - ✓हमलावर-नियंत्रित ID अस्वीकारें: URL में session ID स्वीकार न करें। Sibling subdomain से cookie injection रोकें और custom cookie/session handling जाँचें।
- ✓Cookie attributes उनके उद्देश्य के अनुसार सेट करें:
SecureऔरHttpOnlyलगाएँ;Path=/और बिनाDomainवाले__Host-नाम पर विचार करें। वैध cross-site login के अनुसारSameSite=LaxयाStrictचुनें; जहाँ CSRF token चाहिए वहाँ SameSite उसका विकल्प नहीं है। - ✓Transition की जाँच करें: Automated test में anonymous ID दर्ज करें, authenticate करें, ID बदलने की पुष्टि करें और जाँचें कि पुरानी ID authenticated session नहीं खोलती।