2013-01-09 21 views
20

हमारे पास हमारे कोड पर एक सुरक्षा लेखा परीक्षा थी, और उन्होंने उल्लेख किया कि हमारा कोड बाहरी इकाई (XXE) हमले के लिए कमजोर है।XXE हमले (.net में XmlDocument) को रोकने के लिए कैसे करें

string OurOutputXMLString= 
"<ce><input><transaction><length>00000</length><tran_type>Login</tran_type></transaction><user><user_id>ce_userid</user_id><subscriber_name>ce_subscribername</subscriber_name><subscriber_id>ce_subscriberid</subscriber_id><group_id>ce_groupid</group_id><permissions></permissions></user><consumer><login_details><username>UnitTester9</username><password>pDhE5AsKBHw85Sqgg6qdKQ==</password><pin>tOlkiae9epM=</pin></login_details></consumer></input></ce>" 

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(OurOutputXMLString); 

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

MemoryStream stream = 
    new MemoryStream(System.Text.Encoding.Default.GetBytes(OurOutputXMLString)); 

XmlReaderSettings settings = new XmlReaderSettings(); 

settings.DtdProcessing = DtdProcessing.Prohibit; 
settings.MaxCharactersFromEntities = 6000; 
XmlReader reader = XmlReader.Create(stream, settings); 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(reader); 

लेकिन मैं यहां देख सकता हूं कि पाठक के पास xmlDoc (XmlDocument) में लोड करने का कोई मूल्य नहीं है। क्या कोई मदद कर सकता है जहां मैं चीजें खो रहा हूं? किसी की मदद की सराहना की जाती है!

+4

यदि आप निश्चित हैं कि आप बाहरी संसाधनों का उपयोग नहीं करेंगे तो आप XmlDocument के XMLResolver उपयोगों को प्रमाणित कर सकते हैं। उदाहरण के लिए http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.xmlresolver.aspx देखें। इस उदाहरण में, आप XmlResolver के क्रेडेंशियल को उस खाते में सेट कर सकते हैं जिसमें केवल सीमित पहुंच अधिकार हैं, इसलिए संसाधनों को पुनर्प्राप्त करने का कोई भी प्रयास NT अनुमतियों के माध्यम से नियंत्रित किया जा सकता है। – dash

+2

वास्तव में, यहाँ एक बहुत ही उपयोगी MSDN लेख जो अपने प्रश्न को संबोधित करता है: http://msdn.microsoft.com/en-us/magazine/ee335713.aspx – dash

उत्तर

28

XmlResolver का उपयोग करके बाहरी संसाधनों का समाधान XmlDocument.XmlResolver संपत्ति के माध्यम से प्रदान किया जाता है। अपने एक्सएमएल दस्तावेजों ** ** (उदाहरण के DTDs या स्कीमा के लिए) किसी भी बाहरी संसाधन शामिल नहीं होना चाहिए, तो बस null को यह गुण सेट:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.XmlResolver = null; 
xmlDoc.LoadXml(OurOutputXMLString); 

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

उदाहरण के लिए:

class CustomUrlResovler : XmlUrlResolver 
{ 
    public override Uri ResolveUri(Uri baseUri, string relativeUri) 
    { 
     Uri uri = new Uri(baseUri, relativeUri); 
     if (IsUnsafeHost(uri.Host)) 
      return null; 

     return base.ResolveUri(baseUri, relativeUri); 
    } 

    private bool IsUnsafeHost(string host) 
    { 
     return false; 
    } 
} 

कहाँ IsUnsafeHost() कि जाँच दिया मेजबान या अनुमति नहीं है अगर एक कस्टम कार्य है। कुछ विचारों के लिए SO पर this post देखें। बस हमलों के इस प्रकार से अपने कोड बचाने के लिए ResolveUri() से null लौट आते हैं। यदि यूआरआई की अनुमति है तो आप केवल डिफ़ॉल्ट XmlUrlResolver.ResolveUri() कार्यान्वयन वापस कर सकते हैं।

इसका इस्तेमाल करने के लिए:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.XmlResolver = new CustomUrlResolver(); 
xmlDoc.LoadXml(OurOutputXMLString); 

कैसे XML बाह्य संसाधनों सिर्फ एमएस डॉक्स पर Resolving External Resources पढ़ हल कर रहे हैं के बारे में अधिक जानकारी के लिए। यदि आपका कोड इस उदाहरण से अधिक जटिल है तो आप निश्चित रूप से XmlDocument.XmlResolver संपत्ति के लिए Remarks section पढ़ना चाहिए।

+0

वाह! इसके लिए धन्यवाद एड्रियानो और यह मेरे लिए काम किया। जानकारी के लिए धन्यवाद डैश। –

2

तो इसके बेहतर

new XmlDocument { XmlResolver = null }; 

दिलचस्प बात यह है उपयोग करने के लिए .net 4.5.2 और 4.6 से, डिफ़ॉल्ट समाधानकर्ता अलग तरह से बर्ताव करता है और एक XmlUrlResolver के रूप में मैंने देखा किसी भी यूआरएल या स्थानों को हल करने में अग्रिम परोक्ष उपयोग नहीं करता।

//In pre 4.5.2 it is a security issue. 
//In 4.5.2 it will not resolve any more the url references in dtd and such, 
//Still better to avoid the below since it will trigger security warnings. 
new XmlDocument(); 
संबंधित मुद्दे