2009-12-10 11 views
13

आजकल आप कोड इंजेक्शन, शोषण, बफर-, स्टैक- और हीप-ओवरफ्लो इत्यादि के बारे में बहुत कुछ पढ़ सकते हैं जिससे इंजेक्शन और रन कोड होता है। मुझे आश्चर्य है कि यह सामान जावा के लिए प्रासंगिक है।जावा में कोड इंजेक्शन संभव है?

मुझे पता है, जावा भाषा में कोई संकेतक नहीं हैं। लेकिन क्या JVM ढेर और/या ढेर में डेटा व्यवस्थित नहीं करता है? मुझे पता है कि कोई eval फ़ंक्शन नहीं है (जैसे PHP में) ताकि आप जावा-कोड के रूप में आसानी से इनपुट का उपयोग न कर सकें। मुझे यकीन नहीं है कि बाइटकोड स्तर पर क्या चल रहा है।

मुझे लगता है कि एक्सएसएस संभव है, उदाहरण के लिए जावा ईई अनुप्रयोग में, जब कोई इनपुट फ़िल्टर नहीं किया जाता है। लेकिन यह एक जावास्क्रिप्ट इंजेक्शन नहीं है, क्योंकि इंजेक्शन कोड ब्राउज़र में चलता है और JVM में नहीं?

तो जावा के साथ कौन से कोड इंजेक्शन संभव हैं और कौन नहीं हैं? और यह अन्य जावा प्लेटफार्म भाषाओं के लिए भी सच है?

अग्रिम धन्यवाद।

उत्तर

15

एक जावा प्रोग्राम स्वयं कोड इंजेक्शन के लिए बहुत कमजोर नहीं है। हालांकि, ऐप का समर्थन करने वाले सभी देशी कोड सभी प्रकार के कोड इंजेक्शन के लिए कमजोर हैं - इसमें एपी या उसके पुस्तकालयों में जेवीएम और सभी मूल कोड भाग शामिल हैं।

कुछ भी जहां जावा अन्य प्रणालियों के लिए दरवाजे खोल प्रयोग किया जाता है संभव है::

इसके अलावा, वहाँ कुछ और बातों पर विचार करने के लिए कर रहे हैं

SQL इंजेक्शन

XSS (जो अंत में है जावास्क्रिप्ट इंजेक्शन से अधिक कुछ नहीं)

यदि जावा प्रोग्राम स्वयं किसी प्रकार का दुभाषिया/कंपाइलर है, तो संभवतः आपकी व्याख्या की गई भाषा/संकलित प्रोग्राम में कोड इंजेक्ट करना संभव हो सकता है (इसमें आपके प्रोग्राम को जावा के रूप में उपयोग करना शामिल है एक कंपाइलर ...)

और निश्चित रूप से यदि आप जावा प्रोग्राम को डिस्क में फ़ाइल लिखने के लिए प्राप्त कर सकते हैं जिसमें कोड (मूल, जावा या कुछ और हो) हो तो आप इसे अन्य माध्यमों से निष्पादित कर पाएंगे (अपने अनुप्रयोग में एक अलग जोखिम हो सकता है, ओएस या किसी अन्य एप्लिकेशन) - यह नहीं प्रत्यक्ष कोड इंजेक्शन लेकिन प्रभाव में काफी समान है।

4

यदि सर्वर एप्लिकेशन रनटाइम पर बाइटकोड बनाता है (उदाहरण के लिए BCEL या Javassist के साथ), और यदि यह सृजन उपयोगकर्ता इनपुट से प्रभावित हो सकता है, तो कोड इंजेक्शन संभव है।

हालांकि, यदि आप कोई जादू का उपयोग नहीं करते हैं (जो सभी अनुप्रयोगों का 99% होना चाहिए), तो यह संभव नहीं होगा।

0

आप जावा इंजेक्ट नहीं कर सकते हैं। लेकिन अगर आप सावधान नहीं हैं, तो लोग जावास्क्रिप्ट को इंजेक्ट कर सकते हैं (यानी एक्सएसएस जैसा कि आप उल्लेख करते हैं) या एसक्यूएल। ढेर और ढेर हैं, लेकिन उन्हें पाने का कोई तरीका नहीं है।

3

आप एक वेब सेवा लिख ​​सकते हैं जो जावा कोड स्निपेट स्वीकार करता है, इसे कक्षा/विधि घोषणा में लपेटता है, इसे डिस्क पर सहेजा जाता है, उस पर कंपाइलर चलाता है और फिर गतिशील रूप से लोड होता है और परिणाम निष्पादित करता है। तो कोड इंजेक्शन निश्चित रूप से संभव है।

लेकिन सामान्य जावा कार्यान्वयन के साथ, यह अपेक्षाकृत हेवीवेट संकलन प्रक्रिया के कारण शायद बहुत प्रभावी नहीं है (हालांकि यह अभी भी कुछ ऐप्स के लिए व्यावहारिक हो सकता है)।

कोड इंजेक्शन एसक्यूएल के साथ अत्यधिक प्रासंगिक है क्योंकि कई शुरुआती लोगों का "पहला अनुमान" एक कथन में चर डालने के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग करना है। लेकिन यह जावा प्रोग्रामर के बीच शायद ही कभी एक विचार के रूप में फसल उगता है। इसलिए यही कारण है कि यह चिंता का विषय नहीं है।

यदि जावा कंपाइलर्स हल्के वजन पुस्तकालय सेवाओं के रूप में उजागर हो जाते हैं, तो आपके पास eval के समतुल्य के करीब कुछ और होगा और इसलिए यह एक प्रासंगिक चिंता बनना शुरू हो सकता है।

+0

के लिए चेक owasp वेबसाइट दक्षता के बारे में टिप्पणी इस संदर्भ में बहुत प्रासंगिक नहीं लगता है, कोड इंजेक्शन जरूरी कुशल होने की जरूरत नहीं है। अधिकांश शोषण के लिए उच्च प्रदर्शन की आवश्यकता नहीं है ...। मुद्दा यह है कि कई ऐप्स "स्वीकार कोड, इसे संकलित करें, इसे चलाएं" चीज नहीं करते हैं, लेकिन जो लोग करते हैं वे कमजोर होंगे। – sleske

+0

"यदि जावा कंपाइलर्स लाइट-वेट लाइब्रेरी सेवाओं के रूप में उजागर हो जाते हैं": ठीक है, वे पहले से ही हैं (javax.tools.JavaCompiler देखें, http://java.sun.com/javase/6/docs/api/javax/tools /JavaCompiler.html)। लेकिन फिर, कोड इंजेक्शन के लिए काम करने के लिए, हमले के तहत ऐप को * JavaCompiler का उपयोग करने की आवश्यकता है, जो सबसे सौभाग्य से नहीं करता है। – sleske

+1

-1 क्योंकि भेद्यता की चर्चा बल्कि उलझन में है ... – sleske

0

आप जावा इंजेक्षन नहीं कर सकता है, लेकिन सभी वेब एप्लिकेशन XSS की चपेट में हैं, तो इनपुट सही तरीके से फ़िल्टर नहीं है। एसक्यूएल डेटाबेस के साथ इंटरैक्ट करने वाला कोई भी एप्लीकेशन एसक्यूएल इंजेक्शन के लिए कमजोर हो सकता है। इससे बचने के लिए आप पैरामीटरेटेड क्वेरीज़ देखना चाहेंगे।

1

जब तक आप सर्वर (गतिशील पैदा कोड की तरह, आदि) पर अजीब बातें कर रहे हैं, यह कोड इंजेक्शन के लिए vunerable बो करना असंभव है।

हालांकि मैं एक (बदसूरत) स्थिति है जहाँ आवेदन गतिशील उपयोगकर्ता इनपुट के आधार पर एक JSP बनाता है के बारे में सोच सकते हैं। उस जेएसपी का जावा कोड में अनुवाद किया जाएगा, जिसे वेब कंटेनर द्वारा बाइट कोड में संकलित किया जा रहा है, और उसके बाद निष्पादित किया गया है। यह एक इंजेक्शन बिंदु पेश कर सकता है। लेकिन जेएसपी की गतिशील रूप से सामान्य रूप से उत्पन्न करना कोई समझ नहीं आता है।

2

यदि यह संभव हो गया था, जावा पहले ही मर चुका लंबे समय के लिए हो गया होता।

दूसरी ओर, एसक्यूएल इंजेक्शन PreparedStatement का उपयोग कर उपयोगकर्ता नियंत्रित इनपुट स्टोर करने के लिए से बचने के लिए बहुत आसान कर रहे हैं और XSS भी (फिर) वेबपेज पर उपयोगकर्ता नियंत्रित इनपुट प्रदर्शित करने के लिए <c:out/> का उपयोग करके से बचने के लिए बहुत आसान है।

2

कुछ तरीकों से जावा कोड को एप्लिकेशन में इंजेक्शन दिया जा सकता है जैसे स्क्रिप्टिंग एपीआई या गतिशील जेएसपी का उपयोग करना शामिल है।

नीचे कोड एक उपयोगकर्ता जावा की पटकथा इंजन में मनमाने ढंग से जावास्क्रिप्ट इंजेक्षन करने के लिए अनुमति देता है।

import javax.script.*; 

public class Example1 { 
    public static void main(String[] args) { 
     try { 
      ScriptEngineManager manager = new ScriptEngineManager(); 
      ScriptEngine engine = manager.getEngineByName("JavaScript"); 
      System.out.println(args[0]); 
      engine.eval("print('"+ args[0] + "')"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

इस मामले में, हमलावर कोड है कि फाइल सिस्टम पर एक फ़ाइल बनाता है इंजेक्षन का फैसला किया।

hallo'); var fImport = new JavaImporter(java.io.File); with(fImport) { var f = new File('new'); f.createNewFile(); } // 

अधिक उदाहरण

संबंधित मुद्दे