ऑथेंटिकेशन टेस्टिंग
Authentication testing यह जाँचती है कि system किसी user की पहचान verify करता है और किसी और की पहचान से अंदर घुसने के आम तरीकों का सामना करता है: passwords का अंदाज़ा लगाना, forgot-password flow का दुरुपयोग, second factor को skip करना, या application के अपने messages से यह पता लगाना कि कौन-से accounts मौजूद हैं। इसमें पाँच areas आते हैं: password policy, lockout और throttling, multi-factor authentication (MFA), reset flows और user enumeration।
एक ठोस उदाहरण: एक shop का login अनजान addresses के लिए "इस e-mail से कोई account नहीं" और जाने-पहचाने addresses के लिए "गलत password" जवाब देता है। दोनों messages functionally सही हैं, पर authentication tester की नज़र से यह जोड़ी एक defect है: अब attacker दस लाख addresses की list shop पर जाँच सकता है और सिर्फ़ असली customers पर हमला कर सकता है।
यह क्यों ज़रूरी है
Authentication सामने का दरवाज़ा है। OWASP Top 10 में authentication failures की अपनी अलग category है (OWASP Top 10 वाले lesson में आप इससे मिल चुके हैं), और कई असली break-ins को किसी चतुर exploit की ज़रूरत नहीं होती: किसी दूसरी site से leak हुआ password, कभी expire न होने वाला reset link, कभी धीमा न होने वाला login। कीमत है account takeover, और उसके साथ आने वाला fraud, data loss और regulatory नुकसान।
Tester के लिए यह एक productive area है: ज़्यादातर checks का साफ़ expected result किसी published guideline में लिखा है, passwords और attempt limits के लिए NIST SP 800-63B में और reset flows व enumeration के लिए OWASP cheat sheets में, और इसका लगभग सब कुछ सिर्फ़ एक browser, एक HTTP client और दो test accounts से हो जाता है। जो चीज़ सच में चाहिए, वह है permission: सिर्फ़ वही systems टेस्ट करें जो आपके हैं या जिन्हें टेस्ट करने की लिखित अनुमति आपके पास है, और testing के लिए बनाए गए accounts से।
एक sign-in attempt, और हर check कहाँ रहता है
एक आम login handler हमेशा वही steps उसी क्रम में चलाता है, और हर step वह जगह है जहाँ tests की एक class रहती है: account ढूँढना, attempt को एक limit के विरुद्ध गिनना, password की तुलना stored hash से करना (hash password का one-way fingerprint है, इसलिए server को password खुद रखने की ज़रूरत नहीं पड़ती), account में second factor हो तो उसे माँगना, और उसके बाद ही session बनाना। Password policy इससे पहले, sign-up और password change पर लागू होती है, और reset flow उसी account का एक side door है।
हर step पर दो सवाल पूछें: क्या check होता भी है, और क्या वह कुछ leak करता है — अलग message, status code या response time — जो attacker को "नहीं" से ज़्यादा बताता है?
- 1Account lookupE-mail या username से account ढूँढनाTest: enumeration
शाखा: Unknown account: वही generic error, status और timing जो गलत password पर मिलते हैं
- 2Attempt counterहर account की failures गिनना; limit के बाद slow करना या lock करनाTest: lockout और throttling
शाखा: Limit पार: delay, CAPTCHA या temporary lock, ऐसे message के साथ जो कुछ न बताए
- 3Password checkStored salted hash से तुलना, plain text से कभी नहींTest: storage और truncation
शाखा: गलत password: generic error, counter +1
- 4Second factorOne-time code या security key, एक बार accepted, अपनी attempt limit के साथTest: MFA
शाखा: गलत या दोबारा भेजा code: reject; step skip नहीं हो सकता
- 5Session issuedसिर्फ़ हर check पास होने के बाद; अगला lesson session को ही टेस्ट करता है
- Sign-up और password changeजहाँ policy लागू होती है: कम से कम 15 characters (MFA के साथ 8), 64 या ज़्यादा की अनुमति, Unicode और spaces, blocklist, composition rules नहीं
- Forgot passwordउसी account का side door: random, single-use, short-lived token; बदलाव के बाद पुराने sessions ख़त्म, या user को उन्हें ख़त्म करने का विकल्प
उदाहरण के तौर पर क्रम: सटीक steps प्रोडक्ट-दर-प्रोडक्ट अलग होते हैं।
Password policy: वह टेस्ट करें जो NIST SP 800-63B माँगता है
NIST SP 800-63B authentication के लिए अमेरिकी federal guideline है, जिसे सरकार के बाहर भी कई organisations अपनाते हैं, और यह कई पुरानी आदतों को उलट देती है। इसका current edition, revision 4 (2025), password के अकेला factor होने पर कम से कम 15 characters ज़रूरी करता है, और password सिर्फ़ second factor के साथ इस्तेमाल हो तो minimum 8 की अनुमति देता है; 2017 edition, जिस पर कई products बने हैं, दोनों के लिए 8 रखता था। Verifier (वह system जो password जाँचता है) को कम से कम 64 characters की अनुमति देनी चाहिए और हर printing ASCII character, space और Unicode accept करना चाहिए; उसे पूरा password जाँचना ज़रूरी है, कभी truncate किया हुआ हिस्सा नहीं, और हर नए password की तुलना commonly used, expected या compromised values की blocklist से करना ज़रूरी है। Revision 4 composition rules ("एक uppercase, एक digit, एक symbol") और compromise के सबूत के बिना forced periodic change को मना करता है, जिनके विरुद्ध 2017 edition पहले से सलाह देता था, और दोनों editions password hints और security questions को मना करते हैं। Password managers और autofill का काम करना ज़रूरी है, paste की अनुमति होनी चाहिए, और user typing के दौरान password दिखा सकना चाहिए।
यही आपका test oracle है, जब team बता दे कि product कौन-सा edition और कौन-सा case मानता है। Length पर boundary value analysis लगाएँ, हर Unicode code point को एक character गिनते हुए, जैसा SP 800-63B कहता है: सिर्फ़ password से सुरक्षित login के लिए 14, 15, 64 और 65, या जब second factor हमेशा ज़रूरी हो तो 14 और 15 की जगह 7 और 8। Spaces वाला एक Arabic या Devanagari password आज़माएँ, और ऐसी values भेजें जो blocklist में होनी चाहिए: minimum तक बढ़ाया गया एक common password, जैसे Password1234567, और उसी तरह बढ़ाया गया product का अपना नाम। फिर storage जाँचें: salt एक random value है जो हर user के साथ रखी जाती है ताकि दो एक जैसे passwords के hash अलग बनें, और Argon2, bcrypt या PBKDF2 जैसा जान-बूझकर slow algorithm table चुराने वाले attacker के लिए हर अंदाज़े को महँगा बना देता है। इसलिए test database की users table में salted hashes होने चाहिए, कभी plain text नहीं, और password logs या URLs में नहीं दिखना चाहिए।
# Input (password is the only factor) Expected
1 14 characters rejected: fewer than 15
2 15 characters accepted, and login works with it
3 64 characters accepted, and login works with it
4 65 characters rejected with a message, or accepted whole;
never silently truncated
5 Arabic words with spaces accepted (Unicode and the space)
6 Password1234567, product name padded rejected: blocklist
7 paste, autofill, show password all allowed
8 users table in a test database salted slow hash, not the passwordआज़माएँ: पासवर्ड जनरेटर आज़माएँ: स्ट्रिंग लेंथ काउंटर आज़माएँ: Unicode डेटासेट जनरेटर
Lockout, throttling और second factor
Lockout कुछ failed attempts के बाद account का sign-in बंद कर देता है, कुछ समय के लिए या जब तक कोई उसे unlock न करे; throttling इसके बजाय attempts को धीमा करती है: बढ़ता हुआ delay, कुछ failed attempts के बाद CAPTCHA, या हर account और हर source address पर एक limit। SP 800-63B verifier से माँगता है कि एक account पर लगातार failed attempts 100 से ज़्यादा न हो सकें। ऐसा lock जिसे कोई भी victim का e-mail और गलत passwords डालकर trigger कर सके, खुद denial of service के लिए इस्तेमाल हो सकता है, इसलिए दर्ज करें कि lock कैसे हटता है और कितनी देर रहता है।
MFA एक अलग category का check जोड़ती है, आम तौर पर कुछ ऐसा जो user के पास है: authenticator app का one-time code, एक security key, phone पर भेजा code। इस step को अपने आप में एक छोटी authentication की तरह टेस्ट करें: time-based code (TOTP) RFC 6238 के default के अनुसार हर 30 seconds में बदलता है, और 6-digit code की सिर्फ़ दस लाख values हैं, इसलिए step को अपनी attempt limit चाहिए; SP 800-63B यह भी माँगता है कि हर one-time code valid रहते हुए सिर्फ़ एक बार accept हो। वही guideline phone network को restricted channel मानता है, इसलिए SMS से भेजे codes को risk के रूप में दर्ज करें, defect के रूप में नहीं।
- दूसरे test account से गिनें कि throttle या lock trigger होने में कितने गलत passwords लगते हैं, और जाँचें कि counter server पर रहता है: page reload, नया browser session या cookies साफ़ करने से वह reset नहीं होना चाहिए, सिर्फ़ successful sign-in से या documented lock period ख़त्म होने पर।
- Failed attempts हर entry point से दोहराएँ — web form, mobile API, reset page, MFA step। Limit हर जगह लागू रहनी चाहिए, और message से यह पता नहीं चलना चाहिए कि account मौजूद है या नहीं।
- MFA: password step के ठीक बाद बिना code के post-login page या API call करें; वही code दो बार भेजें; कई time steps पहले expire हुआ code आज़माएँ, जो team की documented window से पुराना होते ही fail होना चाहिए (RFC 6238 network delay के लिए ज़्यादा से ज़्यादा एक पिछले time step और clock drift के लिए एक तय limit की सलाह देता है); जाँचें कि recovery codes single-use हैं, "remember this device" expire होता है, और password reset second factor को skip नहीं करता।
Worked example: एक shop के login पर reset flow और enumeration
एक shop में login, registration form और "Forgot password" page है। आपके पास दो test accounts हैं, qa.one@example.com और qa.two@example.com, और एक throwaway address जो कभी register नहीं हुआ। तीनों pages पर वही request एक known और एक unknown address के साथ भेजें, हर जोड़ी को पिछले lesson के intercepting proxy या किसी HTTP client से capture करें, और दोनों responses की हर चीज़ compare करें: message, HTTP status, redirect target, body size और लगा समय। नीचे वाली login जोड़ी पहली ही तुलना में fail हो जाती है।
- Login: known address पर 401 और unknown पर 404 user enumeration है। Expected: वही status, वही message और timing में कोई ध्यान देने लायक फ़र्क़ नहीं (unknown account अक्सर जल्दी जवाब देता है, क्योंकि server slow hash comparison छोड़ देता है)।
- Registration: "यह e-mail पहले से registered है" भी enumeration है। कुछ teams इसे usability के लिए स्वीकार करती हैं; विकल्प है हमेशा "अपना inbox देखें" जवाब देना और welcome mail या "आपका account पहले से है" mail भेजना। दर्ज करें कि product ने कौन-सा चुना।
- Forgot password: page को दोनों addresses के लिए एक जैसा जवाब देना चाहिए। फिर उसका e-mail किया token टेस्ट करें: link से नया password set करें और link फिर खोलें (fail होना चाहिए, क्योंकि token इस्तेमाल हो चुका है), expiry के बाद तक इंतज़ार करें, token का एक character बदलें, और दो resets request करके देखें कि पहला link अब भी चलता है या नहीं। Reset page को अपने URL का token
Refererheader में leak नहीं करना चाहिए, यानी उस header में जिसमें browser बताता है कि request किस page से आई: उसेReferrer-Policy: no-referrerset करना चाहिए, जैसी OWASP Forgot Password Cheat Sheet की सलाह है, ताकि उस page की कोई third-party script, image या link token न पा सके। - Successful reset के बाद: पुराना password काम करना बंद कर दे, reset से पहले खुले sessions ख़त्म हों (या कम से कम user को उन्हें ख़त्म करने का विकल्प मिले), और user को सूचना मिले कि password बदला गया।
# Known test account, wrong password
POST /api/login HTTP/1.1
Host: staging.shop.example
Content-Type: application/json
{"email": "qa.one@example.com", "password": "Not-the-password-1"}
HTTP/1.1 401 Unauthorized
{"error": "Invalid e-mail or password"}
# Same request, an address that never registered
POST /api/login HTTP/1.1
Host: staging.shop.example
Content-Type: application/json
{"email": "never.registered@example.com", "password": "Not-the-password-1"}
HTTP/1.1 404 Not Found
{"error": "No account for this e-mail"}आम गलतियाँ
- सिर्फ़ browser form टेस्ट करना और API, mobile client और reset page भूल जाना, जहाँ वही limits और messages लागू रहने चाहिए।
- "गलत password" और "अनजान e-mail" को दो सही messages की तरह पढ़ना, एक enumeration defect की तरह नहीं।
- Lockout को pass कर देना बिना यह पूछे कि वह कैसे हटता है और क्या कोई भी किसी भी account को मनमाने ढंग से lock कर सकता है।
- यह जाँचना कि reset link चलता है, पर यह नहीं कि वह इस्तेमाल के बाद, expiry के बाद, दूसरी request के बाद और password बदलने के बाद चलना बंद भी होता है।
- Composition rules या 90-day rotation की कमी को defect के रूप में report करना: SP 800-63B दोनों को खारिज करता है, इसलिए उनके बिना वाली policy guideline को मानती है, तोड़ती नहीं।
- Password-guessing या lockout tests production पर चलाना, या ऐसे किसी भी system पर जिसे टेस्ट करने की लिखित permission आपके पास नहीं है।
QA का नज़रिया
Team में authentication testing तब शुरू होती है जब login, sign-up या reset की story लिखी जाती है: policy को numbers में माँगें (minimum और maximum length, attempt limit, lock duration, token lifetime, MFA options), साथ ही यह कि वह SP 800-63B का कौन-सा edition मानती है, और उन्हें acceptance criteria में डालें, क्योंकि "secure login" टेस्ट नहीं किया जा सकता। Identity code को छूने वाली हर release पर ये checks चलाएँ और policy व enumeration cases को regression suite में रखें: जब कोई developer ज़्यादा मददगार error message जोड़ता है, वे चुपचाप टूट जाते हैं।
Findings को behaviour की तरह report करें, blame की तरह नहीं: exact requests, दोनों responses आमने-सामने, lock से पहले attempts की संख्या, नापी गई token lifetime। Severity इस आधार पर तय करें कि attacker को क्या मिलता है: अकेला enumeration आम तौर पर minor या major है, इस पर निर्भर करते हुए कि accounts कितने क़ीमती हैं; कभी expire न होने वाला reset token या skip हो सकने वाला MFA step critical है। Test accounts, पकड़े गए tokens और e-mail screenshots को sensitive data मानें और उन्हें वहाँ रखें जहाँ team secrets रखती है, ticket में नहीं।
अभ्यास
Forgot-password flow के test cases लिखें
एक job portal की requirement कहती है: "Users login page से अपना e-mail डालकर password reset कर सकते हैं। उन्हें एक link मिलता है जो 30 minutes तक valid है। नया password, password policy के अनुसार होना चाहिए।" इस flow के authentication test cases लिखें, जिनमें enumeration के लिए क्या compare करना है और link के साथ क्या आज़माना है, दोनों शामिल हों।
इसे कागज़ पर करें, या अपनी किसी application के reset flow पर, unknown account के लिए temporary e-mail tool के throwaway address के साथ।
- शामिल requests (reset form, e-mail किया link, new-password form) और हर एक के inputs लिखें।
- हर request के लिए known-account और unknown-account जोड़ी लिखें और यह कि क्या identical होना चाहिए।
- Token tests लिखें: single use, 30-minute expiry, लगातार दो requests, बदला हुआ token।
- Reset के बाद क्या सही होना चाहिए, लिखें: पुराना password, खुले sessions, notification, और नए password पर policy।
मॉडल उत्तर दिखाएँ
Enumeration: qa.one@example.com के लिए और कभी register न हुए address के लिए reset form को वही status, वही message ("अगर यह e-mail registered है, तो हमने link भेज दिया है") और उसी order का response time देना चाहिए; registration form भी इसी तरह जाँचें।
Token: नया password set होने के बाद link फिर खोलने पर fail होता है; 29 minutes पर इस्तेमाल किया link चलता है और 31 minutes बाद खोला link fail होता है; दूसरी request पहले link को invalid कर देती है, या product documents करता है कि दोनों इस्तेमाल तक valid रहते हैं; एक character बदला token fail होता है; और link जो page खोलता है वह Referrer-Policy: no-referrer set करता है, ताकि उस पर कोई third-party script, image या link Referer header में token न पा सके।
Reset के बाद: पुराना password reject होता है; reset से पहले दूसरे browser में खुला session sign out हो जाता है, या user को बाक़ी सभी sessions से sign out करने का विकल्प मिलता है; user को "आपका password बदला गया" e-mail मिलता है; नया password इस lesson की policy से जाँचा जाता है (password अकेला factor हो तो 14 characters reject, Unicode accept, blocklist की value reject); और MFA वाले user को अब भी second factor चाहिए, वरना सिर्फ़ inbox तक पहुँच account पर कब्ज़ा कर लेती है।
अक्सर पूछे जाने वाले सवाल
क्या authentication testing और penetration testing एक ही हैं?
नहीं। Penetration test specialists का एक time-boxed, authorised हमला है जो जितना दूर जा सके जाता है। यहाँ authentication testing सामान्य QA का हिस्सा है: आप policy, lockout, MFA और reset behaviour को लिखी हुई अपेक्षा से हर release पर जाँचते हैं। दोनों एक-दूसरे के पूरक हैं, और दोनों को लिखित permission चाहिए।
क्या sign-up form पर "यह e-mail पहले से registered है" को defect के रूप में report करूँ?
इसे finding के रूप में report करें और product को तय करने दें। यह user enumeration है, पर कई products usability के लिए sign-up पर इसे स्वीकार करते हैं। Login और forgot-password pages के पास ऐसा कोई बहाना नहीं: वहाँ known और unknown accounts के लिए response identical होना चाहिए।
App एक uppercase letter, एक digit और हर 90 दिन में बदलाव enforce करता है। क्या यह गलत है?
यह NIST SP 800-63B को नहीं मानता: revision 4 composition rules और periodic rotation को मना करता है (2017 edition इनके विरुद्ध सलाह देता था) और इनकी जगह length, blocklist और MFA पर भरोसा करता है। यह defect तभी है जब requirement SP 800-63B को अपनाती हो; वरना इसे usability और security recommendation के रूप में product owner के सामने रखें।
असली phone के बिना MFA कैसे टेस्ट करूँ?
एक test account को authenticator app में enrol करें, या enrolment पर दिखे secret से TOTP library के ज़रिए codes compute करें; codes calculate होते हैं, भेजे नहीं जाते। SMS के लिए developers से पूछें कि test environment code कहाँ दिखाता है, अक्सर किसी log या test message inbox में। किसी customer के number से कभी टेस्ट न करें।
संदर्भ
- NIST SP 800-63B: Digital Identity Guidelines — Authentication and Lifecycle Managementपासवर्ड और ऑथेंटिकेटर की आवश्यकताएँ: जटिलता नियमों से ज़्यादा लंबाई, लीक हुए पासवर्ड की ब्लॉकलिस्ट, रेट लिमिटिंग, ज़बरन रोटेशन नहीं।
- OWASP Cheat Sheet Series: Authenticationऑथेंटिकेशन नियंत्रण: सामान्य एरर मैसेज, लॉकआउट और थ्रॉटलिंग, MFA, क्रेडेंशियल रिकवरी।
- OWASP Web Security Testing Guide (WSTG)वेब एप्लिकेशन और API की सुरक्षा कमज़ोरियों को परखने की संदर्भ कार्यप्रणाली, एक-एक टेस्ट के रूप में।
- OWASP Cheat Sheet Series: Password Storageपासवर्ड कैसे स्टोर करें: Argon2id, scrypt या bcrypt सॉल्ट के साथ — कभी MD5, SHA-1 या बिना सॉल्ट के हैश नहीं।
Mutqan tools से अभ्यास करें
HTTP रिक्वेस्ट (method, URL, हेडर, auth, बॉडी) बनाएँ और भेजें, फिर रिस्पॉन्स जाँचें — आपके ब्राउज़र में हल्का-फुल्का Postman।
दो API रिस्पॉन्स (जैसे staging बनाम production) की तुलना करें और हर संरचनात्मक तथा वैल्यू का अंतर देखें।
समायोज्य लंबाई और कैरेक्टर वर्गों के साथ मज़बूत रैंडम पासवर्ड बनाएँ, साथ में स्ट्रेंथ मीटर।
स्ट्रिंग की लंबाई कैरेक्टर, कोड पॉइंट, UTF-8 बाइट और UTF-16 यूनिट में मापें।
कई लिपियों (अरबी, देवनागरी, CJK, सिरिलिक), emoji, संयोजक चिह्न और normalisation रूपों में Unicode टेस्ट स्ट्रिंग जनरेट करें।
एक डिस्पोज़ेबल ईमेल पता बनाएँ और आने वाले संदेश उसी पेज पर पढ़ें। उपयोग बंद करते ही पता अपने आप छोड़ दिया जाता है।
और गहराई से
इस topic में आपकी प्रगति
प्रगति ट्रैक करने के लिए साइन इन करें
Topics पूर्ण चिह्नित करें, जहाँ छोड़ा था वहीं से जारी रखें और specialisation परीक्षाएँ खोलें।