2017-09-19 16 views
0

그래서 내 응용 프로그램에서 보안 검사를 실행할 때 문제가 발생합니다. It turns out that I am failing to protect against XXE. 여기 는 잘못된 코드를 보여주는 짧은 조각이다 : 베라 코드에 따르면XXE : XDocument를 사용한 XML 외부 엔터티 참조의 부적절한 제한

static void Main() 
     { 
      string inp = Console.ReadLine(); 
      string xmlStr = ""; //This has a value that is much too long to put into a single post 

      if (!string.IsNullOrEmpty(inp)) 
      { 
       xmlStr = inp; 
      } 
      XmlDocument xmlDocObj = new XmlDocument {XmlResolver = null}; 
      xmlDocObj.LoadXml(xmlStr); 
      XmlNodeList measureXmlNodeListObj = xmlDocObj.SelectNodes("REQ/MS/M"); 

      foreach (XmlNode measureXmlNodeObj in measureXmlNodeListObj) 
      { 
       XmlNode detailXmlNodeListObj = xmlDocObj.SelectSingleNode("REQ/DTD"); 
       string measureKey = measureXmlNodeObj.Attributes["KY"].Value; 
       if (detailXmlNodeListObj.Attributes["MKY"].Value == 
        measureKey) //Checking if selected MeasureKey is same 
       { 
        XmlNode filerNode = measureXmlNodeObj.SelectSingleNode("FS"); 

        if (filerNode != null) 
        { 

         XDocument fixedFilterXmlObj = XDocument.Load(new StringReader(filerNode.OuterXml)); 

         var measureFixedFilters = (from m in fixedFilterXmlObj.Element("FS").Elements("F") 
          select m).ToList(); 
         foreach (var fixedFilter in measureFixedFilters) 
         { 
          var fixedFilterValues = (from m in fixedFilter.Elements("VS").Elements("V") 
           select m.Attribute("DESC").Value).ToList(); 

          foreach (var value in fixedFilterValues) 
          { 
           Console.WriteLine(value.Trim()); 
          } 
         } 
        } 
       } 
      } 
      Console.ReadLine(); 
     } 

XDocument fixedFilterXmlObj = XDocument.Load(new StringReader(filerNode.OuterXml));

입니다 안전하지 않은 선 그러나 Owsap, it should be safe에 따라처럼 보인다 :

모두 System.Xml.Linq 라이브러리의 XElement 및 XDocument 개체 은 기본적으로 XXE 삽입으로부터 안전합니다. XElement는 XML 파일의 요소 만 구문 분석하므로 DTD는 모두 무시됩니다. XDocument는 DTD가 기본적으로 사용되지 않도록 설정되어 있으며 이 안전하지 않은 다른 XML 파서로 구성된 경우에만 안전하지 않습니다.

따라서 내가 실수 허용 XML 파서를 사용하여 실수로 XX35에 XDocument을 열어 본 것처럼 보입니다.

I found a unit test that replicates the issue도는 XDocument의 안전한 사용을 가지고 있지만 사용하지 않는 때문에, 정확히 내 코드가 안전하지 않은 손쉽게 찾을 수없는 것 :

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.DtdProcessing = DtdProcessing.Parse; // unsafe! 

당신은 내 코드를 실행할 수있는 문제를 복제 내가 어떻게, 왜이 작품 확실하지 않다

답변

0

(하나의 게시물에 대한 너무 큰) here을하지만,하지 :하지만,이 값을 빈 xmlStr으로 라인을 교체해야

XDocument fixedFilterXmlObj; 
using (XmlNodeReader nodeReader = new XmlNodeReader(filerNode)) 
{ 
    nodeReader.MoveToContent(); 
    fixedFilterXmlObj = XDocument.Load(nodeReader); 
}