
CVE-2014-2323 SQL इंजेक्शन का शैक्षिक शोषण प्रदर्शन lighttpd के mod_mysql_vhost में, जिसमें Docker-आधारित लैब शामिल है जो व्यावहारिक भेद्यता विश्लेषण और पैचिंग के लिए है।
title: Ep4 - नेटवर्क से संबंधित भेद्यता members:
संबंधित भेद्यताएँ:
CVE-2014-2323 [1] was assigned to SQL injection bug.
CVE-2014-2324 [2] was assigned to the path traversal bug.
पुष्टि करें: http://download.lighttpd.net/lighttpd/security/lighttpd_sa_2014_01.txt
शोषण की जाने वाली सेवा Lighttpd है। यह एक ओपनसोर्स (BSD लाइसेंस) वेबसर्वर है जिसे हल्का और तेज़ होने के लिए अनुकूलित किया गया है। यह प्रसिद्ध c10k समस्या (एक सर्वर पर 10 हजार एक साथ कनेक्शनों को कैसे संभालें) के 'प्रूफ-ऑफ-कॉन्सेप्ट' के रूप में उभरा, जिससे उस समय (2003) काफी लोकप्रियता मिली, और वर्तमान में Whatsapp.com, Xkcd द्वारा तथा अतीत में YouTube द्वारा उपयोग किया जाता है। बाज़ार में इसकी स्थिति काफी दिलचस्प है, जैसा कि हम ग्राफ़ में देख सकते हैं:

सर्वर कई कनेक्शनों की समस्या से निपटने के लिए इवेंट-आधारित एसिंक्रोनस तंत्रों (kqueue BSDs पर, epoll Linux पर) का उपयोग करता है, जिससे कई थ्रेड्स की आवश्यकता कम हो जाती है, जिसके परिणामस्वरूप बहुत छोटी मेमोरी 'फुटप्रिंट' और बेहतर CPU उपयोग होता है (यह रणनीति Nginx सर्वरों द्वारा भी उपयोग की जाती है, जिनका उपयोग वर्षों में काफी बढ़ गया है):

lighty की एक विशेषता वर्चुअल होस्ट्स का आसान प्रबंधन है।
यह एक ऐसी विधि है जिसका उपयोग एक ही IP पर हल होने वाले एक से अधिक डोमेन नामों को होस्ट करने के लिए किया जाता है, जिससे वेबसाइटों की पेशकश करने वाली कंपनियों की होस्टिंग लागत कम हो जाती है, क्योंकि प्रत्येक वेबसाइट के लिए समर्पित सर्वर आरक्षित करना आवश्यक नहीं है।
यह तकनीक IP-आधारित (प्रत्येक होस्ट के लिए एक इंटरफ़ेस) या नाम-आधारित (इंटरफ़ेस साझा करते हुए प्रत्येक होस्ट के लिए एक नाम) हो सकती है - इस प्रस्तुति में खोजी गई।
Name-Based
: क्लाइंट द्वारा प्रदान किए गए 'Hostname' का उपयोग करके यह पहचानता है कि तदनुसार उत्तर देने के लिए किस सेवा का उपयोग करना है। इस विधि में दो कठिनाइयाँ हैं: सुरक्षित सत्रों (TLS) से निपटने में जटिलताएँ - हैंडशेक सर्वर को Host इंगित करने वाले किसी भी हेडर के पारित होने से पहले किया जाना चाहिए, जिससे हैंडशेक में प्रस्तुत किए जाने वाले प्रमाणपत्र का निर्धारण जटिल हो जाता है। इस समस्या का एक हल TLS का एक एक्सटेंशन है जिसे Server Name Indication (SNI) कहा जाता है, जो हैंडशेक की शुरुआत में नाम प्रस्तुत करने की अनुमति देता है, जिससे सही प्रमाणपत्र का चयन संभव हो जाता है। दूसरी समस्या अच्छी तरह से परिभाषित Host हेडर के बिना कनेक्शन के प्रयास के बारे में है, जिसके परिणामस्वरूप उपयोग की जाने वाली सेवा की अनिश्चितता उत्पन्न होती है।
IP-Based
: प्रत्येक अनुप्रयोग के लिए अलग-अलग IP का उपयोग करता है। वेबसर्वर को फिर कई भौतिक नेटवर्क इंटरफ़ेस (या एक ही इंटरफ़ेस के अंतर्गत वर्चुअल) के लिए कॉन्फ़िगर किया जाता है और फिर (गंतव्य) IP पते के अनुसार तदनुसार उत्तर देता है।
IP aliasing, हमें प्रत्येक सेवा के लिए वर्चुअल इंटरफ़ेस बनाने की अनुमति देता है।
एक बड़ी कंपनी के मामले में, ग्राहकों की संख्या के आधार पर ऐसी मैपिंग का प्रबंधन करना जटिल हो सकता है। Lighty फिर इस उद्देश्य के लिए डेटाबेस के उपयोग का समर्थन प्रदान करता है, जैसा कि हम आगे दिखाएँगे।
पहले, आइए देखें कि 'हाथ से' एक सर्वर की कॉन्फ़िगरेशन कैसे की जाती है और फिर vhosting कैसे जोड़ा जाता है।
एक बुनियादी lighttpd सर्वर तैयार करना बहुत आसान है। बस इसे इंस्टॉल करें और एक कॉन्फ़िगरेशन फ़ाइल बनाएं जो उपयोग किए जाने वाले पोर्ट को निर्धारित करती है, विशिष्ट अनुरोधों का जवाब कैसे देना है और अन्य कॉन्फ़िगरेशन।
हम एक कॉन्फ़िगरेशन उदाहरण तैयार कर सकते हैं जो केवल स्थिर फ़ाइलों (.html या .txt) के अनुरोध प्राप्त करने से संबंधित है:
server.document-root = "/usr/lighttpd/mysite.com/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
अब कल्पना करें कि हम वेबसाइटों की बिक्री पर आधारित व्यवसाय बनाना चाहते हैं और खरीदार को स्वयं का डोमेन प्रदान करते हैं। लागत कम करने के लिए हम प्रत्येक ग्राहक के लिए vhosts बनाना चाहते हैं। मान लें कि नेटवर्किंग पाठ्यक्रम तीन वेबसाइटें खरीदना चाहता है: redes.io, mac0448.io और mac5910.io। हमारी कंपनी फिर डोमेन पंजीकृत करती है, सभी हमारे एकमात्र सर्वर के IP की ओर इंगित करते हैं, जिसमें एक ही इंटरफ़ेस है।
ps: चूंकि हम इसका अनुकरण करना चाहते हैं, हम /etc/hosts फ़ाइल को बदल सकते हैं:
172.17.0.2 redes.io
172.17.0.2 mac0448.io
172.17.0.2 mac5910.io
एक ही IP से हल करते हुए ग्राहकों की विभिन्न वेबसाइटों की सेवा करने में सक्षम होने के लिए, हम सर्वर को मैन्युअल रूप से कॉन्फ़िगर कर सकते हैं:
server.document-root = "/usr/lighttpd/default/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
$HTTP["host"] == "redes.io" {
server.document-root = "/usr/lighttpd/redes/"
} else $HTTP["host"] == "mac0448.io" {
server.document-root = "/usr/lighttpd/mac0448/"
} else $HTTP["host"] == "mac5910.io" {
server.document-root = "/usr/lighttpd/mac5910/"
}
लेकिन, जैसा कि हम कल्पना कर सकते हैं, यह एक समस्या बन सकता है जब हम कई ग्राहकों से निपटना चाहते हैं और पहले बताए अनुसार प्रत्येक वेबसाइट को अलग-अलग कॉन्फ़िगरेशन प्रदान करना चाहते हैं।
mod_mysql_vhost मॉड्यूल के साथ हम अपने सर्वर को ऐसे मैपिंग के लिए जिम्मेदार mysql डेटाबेस से जोड़ सकते हैं। फिर हम डेटाबेस का नाम, इसे अपने नेटवर्क में कैसे पाया जाए, और खोज करने के लिए कौन सा कमांड उपयोग करना है, निर्दिष्ट करते हैं।
server.modules = (
"mod_accesslog",
"mod_mysql_vhost"
)
mysql-vhost.db = "NOME_DO_BANCO"
mysql-vhost.user = "USUARIO"
mysql-vhost.pass = "SENHA"
(!!!!!!!!!!!!!!!)
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"
(!!!!!!!!!!!!!!!)
mysql-vhost.hostname = "HOSTNAME"
mysql-vhost.port = "PORTA"
SQL रिलेशनल डेटाबेस के प्रबंधन के लिए एक घोषणात्मक भाषा है, जिसका उपयोग (...) आदि में किया जाता है।
TODO
TODO
समस्याएँ इस तथ्य के कारण उत्पन्न होती हैं कि SQL का उपयोग करने वाली डेटाबेस प्रबंधन प्रणालियाँ मान लेती हैं कि डाले गए कमांड व्यवस्थापक के ज्ञान वाले कमांड होंगे और उनके द्वारा अच्छी तरह से प्रबंधित किए जाएँगे। यह धारणा हमेशा सत्य नहीं होती है, क्योंकि DB प्रणाली के साथ इंटरैक्ट करने वाली प्रणालियों में विफलता दोष उत्पन्न कर सकती है, विशेष रूप से वेब पर, जहाँ उपयोगकर्ता के साथ इंटरैक्शन अधिक होता है।
SQL कमांड के साथ समस्या तब उत्पन्न होती है जब कमांड को उपयोगकर्ता द्वारा उत्पन्न टेक्स्ट का उपयोग करके बनाने का इरादा होता है, चाहे वह उपयोगकर्ता नाम, पासवर्ड या कोई अन्य गतिशील सामग्री हो।
(TODO)
कैसे हल करें? Escaping।
हमारे कॉन्फ़िगरेशन में, उदाहरण के लिए, हमारे पास एक बड़ी खामी है:
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"