
CalderaForms 1.5.9.1 XSS (WordPress plugin) - ट्यूटोरियल
CalderaForms 1.5.9.1 XSS (WordPress प्लगइन) - ट्यूटोरियल
CalderaForm एक WordPress प्लगइन है जो ड्रैग और ड्रॉप के माध्यम से आसानी से फॉर्म बनाने की अनुमति देता है। हाल ही में एक गतिविधि के दौरान मुझे कुछ पोर्टलों का परीक्षण करने का अवसर मिला, जिनमें से एक इस प्लगइन के माध्यम से बनाए गए एक संपर्क फॉर्म को होस्ट कर रहा था। संबंधित इंस्टेंस के अनुकूलित कॉन्फ़िगरेशन ने मुझे एक कमजोरी खोजने की अनुमति दी: इसकी सरल, पाठ्यपुस्तक जैसी प्रकृति को देखते हुए, मुझे लगता है कि यह शुरुआती लोगों को कुछ तंत्र समझाने का एक अच्छा बहाना है।
केवल शैक्षणिक उद्देश्य - स्पष्ट अनुमति के बिना लक्ष्यों का परीक्षण करने या अवैध उद्देश्यों के लिए इस जानकारी का उपयोग न करें - पाचन के दौरान ठंडे पानी में न कूदें - गर्मी में प्याज की तरह कपड़े पहनें
पूर्ण exploit के लिए:
https://www.exploit-db.com/exploits/44489/
CVE के लिए:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7747
विश्लेषण के दौरान कॉन्फ़िगरेशन में, फॉर्म को उपयोगकर्ता को धन्यवाद संदेश के साथ जवाब देने के लिए सेट किया गया था, जो उसे अभी दर्ज किए गए नाम से बुलाता था।
परीक्षण वातावरण को दोहराने के लिए, स्थानीय रूप से WordPress का एक इंस्टेंस स्थापित करें और CalderaForms संस्करण 1.5.9.1 प्लगइन स्थापित करें (यहाँ उपलब्ध या यहाँ उपलब्ध).
एक बार स्थापित होने के बाद, WordPress प्रशासन कंसोल > बायाँ कॉलम > "Caldera Forms" > शीर्ष बटन > "New Form" > Contact Form चुनें, नाम बदलें और "Create Form" पर क्लिक करें

एक बार बनाने के बाद, इसके कॉन्फ़िगरेशन को संशोधित करना संभव है: शीर्ष बटन > "Form Settings" > Success Message को इस प्रकार संशोधित करें कि वह उपयोगकर्ता द्वारा दर्ज किए गए डेटा में से एक को शामिल करे। बॉक्स पर क्लिक करें और सुझावों की एक ड्रॉप-डाउन दिखाई देती है। %first_name% जोड़ें

शीर्ष बटन > "Save Form"
फॉर्म को किसी पेज में डालने के लिए: बायाँ कॉलम > "Pages" > "Sample Page" > "Edit" > "Caldera Form" > अभी बनाए गए फॉर्म का चयन करें > "Insert Form" > दायाँ कॉलम > "Update"

हो गया।
आइए हम एक-एक करके उन चरणों से निपटें जो इस प्रकार के हमले के निर्माण के लिए आवश्यक हैं, विभाजित करो और शासन करो के प्रतिमान के अनुसार।
परीक्षण चरण में, जब किसी घटक के साथ बातचीत की जाती है, तो हमेशा दिए गए उत्तेजनाओं के प्रति उसकी प्रतिक्रियाओं पर ध्यान देना चाहिए; विशेष रूप से, हम अपने द्वारा दर्ज किए गए डेटा के "पथ" और उनमें होने वाले किसी भी परिवर्तन पर ध्यान केंद्रित करते हैं।
हमारे मामले के लिए एक विशिष्ट उदाहरण निम्नलिखित है:
फॉर्म वाले पेज पर जाएँ: http://127.0.0.1/wordpress/sample-page/
फॉर्म को निम्नलिखित डेटा से भरें
"First Name": myName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
प्लगइन के तर्क के अनुसार डेटा संसाधित किया जाता है
प्राप्त धन्यवाद संदेश में हमारे द्वारा First Name फ़ील्ड में दर्ज स्ट्रिंग शामिल है
"Thank you myName, form has been successfully submitted."

हमारे द्वारा "First Name" फ़ील्ड में दर्ज स्ट्रिंग हमें धन्यवाद संदेश में वापस दे दी जाती है।
विशेष रूप से, स्ट्रिंग एक HTML div टैग के अंदर समाहित है।
हमारा इनपुट पृष्ठ के HTML में समाप्त होता है।
विचार: "हमें यह पसंद है। हमारे पास एक संपर्क बिंदु है।"
चलो एक कदम आगे बढ़ते हैं। हमारे इनपुट को उस चरण के दौरान कैसे संसाधित किया जाता है जिसे हमने "प्रसंस्करण" (बिंदु 2) कहा है? विशेष रूप से, हम जानना चाहते हैं: क्या हमारे द्वारा उपयोग किए जा सकने वाले वर्णों (और उनके संयोजनों) पर कोई सीमाएँ हैं? स्पष्ट रूप से लक्ष्य "सामान" इंजेक्ट करने में सक्षम होना है। जब एक इंजेक्शन करने का प्रयास किया जाता है, तो यह ध्यान रखना चाहिए कि हमारा इनपुट कहाँ समाप्त होता है और उपयुक्त "भाषा" का उपयोग करना चाहिए।
क्या हमारे इनपुट को किसी SQL इंटरप्रेटर द्वारा संसाधित किया जाता है? हमें उसकी भाषा बोलनी होगी
क्या हमारे इनपुट को किसी PHP स्क्रिप्ट द्वारा संसाधित किया जाता है? हमें उसकी भाषा बोलनी होगी
क्या हमारा इनपुट किसी HTML पेज पर समाप्त होता है? ...
इसलिए हम जो जानना चाहते हैं वह यह है कि क्या हम HTML के विशिष्ट वर्णों और निर्माणों का उपयोग कर सकते हैं और विशेष रूप से, इस भाषा की जावास्क्रिप्ट कोड को शामिल/व्याख्या करने की क्षमता को देखते हुए, यह पता लगाना कि क्या हम अपने कोड को "लैंडिंग ज़ोन" में डालने की कोई रणनीति पाते हैं, यानी पहले देखा गया div टैग।
ऐसा करने के लिए हम "First Name" फ़ील्ड में एक साधारण HTML टैग डालते हैं और देखते हैं कि क्या यह "sanitized" (सैनिटाइज़्ड) होता है, यानी क्या इसे इस प्रकार संशोधित किया जाता है कि यह हानिरहित/अन-इंटरप्रेटेबल हो जाए, या क्या यह हमें ज्यों का त्यों वापस मिलता है। इस उद्देश्य के लिए हम एक <br> टैग का उपयोग करते हैं, जिसका उपयोग पाठ में लाइन ब्रेक डालने के लिए किया जाता है।
पिछली संख्या का अनुसरण करते हुए:
फॉर्म को निम्नलिखित डेटा से भरें
"First Name": m<br>yName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
धन्यवाद संदेश में हमारा HTML टैग शामिल है, जिसे संशोधित नहीं किया गया है, और इसे सही ढंग से व्याख्यायित किया जाता है, संदेश के बीच में एक लाइन ब्रेक डालते हुए
"Thank you m
yName, form has been successfully submitted."

विचार: "हमें यह पसंद है। हम कम-से-और से-अधिक चिह्नों का उपयोग कर सकते हैं, हम HTML टैग सम्मिलित कर सकते हैं जो सैनिटाइज़ नहीं होते और व्याख्यायित होते हैं।"
कदम आगे। फ़ॉर्मेटिंग टैग को किसी अधिक उपयोगी चीज़ से बदलें, जैसे कि <script> टैग, जो हमें पृष्ठ के अंदर जावास्क्रिप्ट कोड डालने और निष्पादित करने की अनुमति देता है।
फॉर्म को निम्नलिखित डेटा से भरें
"First Name": m<script>alert(1);</script>yName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
धन्यवाद संदेश में हमारा HTML टैग शामिल है, जिसे संशोधित नहीं किया गया है, और इसे सही ढंग से व्याख्यायित किया जाता है, हमें एक alert बॉक्स दिखाते हुए

विचार 1: "हमें यह पसंद है। हम उपयोगकर्ता के ब्राउज़र के संदर्भ में मनमाना जावास्क्रिप्ट कोड निष्पादित कर सकते हैं।"
विचार 2: "हमें यह पसंद नहीं है। जावास्क्रिप्ट को निष्पादित करने वाला उपयोगकर्ता हम स्वयं हैं"
स्थिति यह है: हम एक ऐसी साइट के माध्यम से जावास्क्रिप्ट निष्पादित कर सकते हैं जिसे हम नियंत्रित नहीं करते, उपयोगकर्ता के ब्राउज़र के संदर्भ में, लेकिन यह उपयोगकर्ता, अभी, वही है जो फॉर्म में मान दर्ज करता है। यह काफी बेकार है।
विचार यह है: क्या हमारे निष्पादित किए जाने वाले कोड वाले धन्यवाद संदेश को पुनः प्राप्त करने का कोई तरीका है?
आइए अपने पहले सबमिट पर वापस जाएँ, जो "टोही" था (या पहले चरणों को फिर से निष्पादित करें)।
नेटवर्क ट्रैफ़िक या पृष्ठ के स्रोत का विश्लेषण करके, हम समझते हैं कि फॉर्म पते पर एक POST अनुरोध करता है
http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4
(अंतिम भाग भिन्न हो सकता है, इसे निम्नलिखित सभी उदाहरणों में उपयुक्त रूप से संशोधित करें)
अर्थात पते पर
http://<target>/cf-api/<form-id>
और इस अनुरोध का उत्तर एक JSON है जिसमें कुछ डेटा होता है, जिसमें धन्यवाद संदेश शामिल है, और इसकी निम्नलिखित संरचना है:
{
"data":
{"cf_id":"48"},
"html":"<div class=\" alert alert-success\">Thank you myName, form has been successfully submitted.<\/div>",
"type":"complete",
"form_id":"CF5ad9b3176c0f4",
"form_name":"MyContactForm",
"status":"complete"
}
इस जानकारी को अलग रखें, हम जल्द ही इस पर वापस आएंगे; विशेष रूप से "form_id" और "cf_id" फ़ील्ड पर ध्यान दें।
POST किस पते पर निष्पादित किया जाता है? बहुत अधिक अनुमान लगाए बिना, देखते हैं कि यदि हम GET निष्पादित करते हैं, यानी http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4 पते पर पृष्ठ पर जाते हैं, तो क्या होता है, और हमें, कमोबेश, संबंधित फॉर्म का HTML मिलता है।
और सबमिट से उत्पन्न नेटवर्क ट्रैफ़िक की जाँच करें

इस बार हमें स्थान /wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=49 की ओर एक HTTP 302 कोड (रीडायरेक्ट) प्राप्त होता है, जो हमें, कमोबेश, धन्यवाद संदेश के div टैग वाला HTML लौटाता है।
इस पते के प्रारूप पर ध्यान दें:
http://<target>/cf-api/<form-id>/?cf_su=1&cf_id=<cf-id>
जहाँ <form-id> और <cf-id> के मान बिल्कुल वही हैं जो पहले विश्लेषित JSON में क्रमशः "form_id" और "cf_id" हैं।
क्या हमने प्रारंभिक प्रश्न का उत्तर दे दिया है? हाँ। हमें धन्यवाद संदेश की सामग्री को पुनः प्राप्त करने का एक तरीका मिल गया है।
विचार: "हमें यह पसंद है। हम आवश्यकतानुसार अपने डेटा वाले संदेश को पुनः प्राप्त कर सकते हैं।"
आइए सभी सूत्रों को एक साथ जोड़ें, अब तक हमने जो भी जानकारी एकत्र की है उसे मिलाएँ और एक हमला तैयार करें।
1) अपने दुर्भावनापूर्ण कोड को लक्ष्य पर सहेजें
2) उस कोड को पुनः प्राप्त करने के लिए आवश्यक डेटा एकत्र करें
3) अपने हमले को "ट्रिगर" करने के लिए उपयुक्त URL बनाएँ
फॉर्म को (दोनों पृष्ठों में से किसी एक से, इससे कोई फर्क नहीं पड़ता) निम्नलिखित डेटा से भरें
"First Name": m<script>document.body.innerHTML=String.fromCodePoint(128046);</script>yName
"Last Name": myLast
"Email Address": my@e.mail
"Comments": myComm
उत्पन्न ट्रैफ़िक के विश्लेषण के माध्यम से, चाहे sample-page पेज के मामले में प्राप्त JSON को पढ़ना हो या केवल फॉर्म वाले पेज के मामले में रीडायरेक्ट को पढ़ना हो, हम form_id और cf_id पहचानकर्ता प्राप्त करते हैं
{
"data":
{"cf_id":"69"},
"html":"...",
"type":"...",
"form_id":"CF5ad9b3176c0f4",
"form_name":"...",
"status":"..."
}
http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=69

कुछ विचार:
पाठक को, यदि रुचि हो, तो निम्नलिखित का प्रस्ताव है:
' (एपॉस्ट्रॉफ़ी, सिंगल कोट), " (उद्धरण चिह्न, डबल कोट्स) या ` (ग्रेव ऐक्सेंट, बैकटिक या बैककोट या ग्रेव ऐक्सेंट) वर्णों का उपयोग किए बिना दोहराएँ, जो इतालवी कीबोर्ड लेआउट में अनुपस्थित है