XXE 및 .NET Framework (SgmlReaderDll.dll)

XXE 및 .NET Framework (SgmlReaderDll.dll)



XXE란?



XXE(XML External Entity)란, XML의 외부 참조 기능을 이용해, 서버 내부의 파일 내용을 취득(누설)하거나 내부 네트워크상의 파일에 액세스 하는 부정 행위

XXE는 XML을 다루는 응용 프로그램에서 표현할 수 있으므로 XML 문서를 다룰 때는주의해야합니다.

SgmlReaderDll.dll



SGMLReader (SgmlReaderDll.dll)는 느슨하게 XML 해석해 주므로 HTML을 DOM화할 때 자주 사용되고 있는 것은 아닐까 생각한다.

"일부 HTML 태그만 허용"의 샘플 코드로서도 HTML의 DOM화에 사용하고 있다

결론



SGMLReader (SgmlReaderDll.dll)에는 XXE가 발현되지 않는 것 같습니다.

SGMLReader 역시 궁극적으로 System.Xml.XmlDocument 클래스로 넘어가기 때문에, 만약을 위해 System.Xml.XmlDocument#XmlResolver 속성을 "NULL"로 해도 좋을지도 모른다.

System.Xml.XmlDocument#XmlResolver 속성을 NULL로 하는 것이 좋은가( System.Xml.XmlDocument 클래스의 XXE 대책)는, 「 XXE 및 .NET Framework 」를 참조해 주세요.

SgmlReaderDll.dll 및 XXE



로드할 XML 파일(in1.xml)은 여기

SgmlReaderDll.dll 및 XXE (HTML 모드에서 IgnoreDtd = True이고 XmlResolver는 지정되지 않음)



이런 느낌
XXE가 발현되지 않는다.



SgmlReaderDll.dll 및 XXE (HTML 모드에서 IgnoreDtd = False이며 XmlResolver는 지정되지 않음)



이런 느낌. in1.xml에는 DTD가 없기 때문에, 그럼~, 예외를 토할 것입니다.



SgmlReaderDll.dll 및 XXE (XML 모드에서 IgnoreDtd = True이고 XmlResolver는 지정되지 않음)



이런 느낌.
XXE가 발현되지 않는다.



SgmlReaderDll.dll 및 XXE (XML 모드에서 IgnoreDtd = False이며 XmlResolver는 지정되지 않음)



이런 느낌.
XXE가 발현되지 않는다.



SgmlReaderDll.dll 및 XXE



이미 질렸다.

상기의 테스트 결과라면, SGMLReader (SgmlReaderDll.dll)에는, XXE는 발현하지 않는 것 같다.

하지만,
SGMLReader 역시 궁극적으로 System.Xml.XmlDocument 클래스로 넘어가기 때문에, 만약을 위해 System.Xml.XmlDocument#XmlResolver 속성을 "NULL"로 해도 좋을지도 모른다.

소스 코드 보면 ...



SGMLReader (SgmlReaderDll.dll)의 소스 코드을 보면 2530 행 근처에 "ResolveEntity ()"의 재정의가 있습니다.

//We never return any entity reference nodes, so this should never be called.

라는 코멘트를 확인할 수 있다.

즉, SGMLReader (SgmlReaderDll.dll)를 사용하는 경우 XXE 취약점이 없다는 것이 좋습니다.

소스 코드 (Program.cs)



XXE 및 .NET Framework과 거의 비슷하지만 SGMLReader (SgmlReaderDll.dll)을 참조해야합니다.

Program.cs
using System;
using System.IO;
using System.Xml;

namespace XMLandXXEtest{
    class Program{
        static void Main(string[] args){
            Boolean Isresolve = true;
            exXmlResolver myExXmlResolver = null;
            if (3 < args.Length) {
                if (args[3].ToLower() == "null"){
                    Isresolve = false;
                }else {
                    myExXmlResolver = new exXmlResolver();
                }
            }
            if (args.Length < 3) {
                Console.WriteLine("usage: XMLandXXEtest.exe <<xmlFile>> <<HTML|XML>> <<T|F|N>> [NotResolve]");
            }else{

                StreamReader sr = new StreamReader(new FileStream(args[0], FileMode.Open, FileAccess.Read));
                String str = sr.ReadToEnd();
                sr.Close();

                Sgml.SgmlReader tempSgmlReader = new Sgml.SgmlReader();
                tempSgmlReader.DocType = args[1];
                switch(args[2].ToLower()){
                    case "t":
                        tempSgmlReader.IgnoreDtd = true;
                        break;
                    case "f":
                        tempSgmlReader.IgnoreDtd = false;
                        break;
                    default:
                        break;
                }

                StringReader tempStringReader = new StringReader(str);
                tempSgmlReader.InputStream = tempStringReader;

                XmlDocument tempXmlDocument = new XmlDocument();
                // tempXmlDocument.XmlResolver = null; // 本番では念のためにコメントアウトした方がよい
                if (Isresolve == false){
                    tempXmlDocument.XmlResolver = null;
                }else if (myExXmlResolver != null){
                    tempXmlDocument.XmlResolver = myExXmlResolver;
                }
                tempXmlDocument.Load(tempSgmlReader);
                Console.WriteLine("after XML Resolve is (OuterXml)");
                Console.WriteLine(tempXmlDocument.OuterXml);
                Console.WriteLine("----------------------------------");
                Console.WriteLine("after XML Resolve is (InnerXml)");
                Console.WriteLine(tempXmlDocument.InnerXml);
                Console.WriteLine("----------------------------------");
                Console.WriteLine("after XML Resolve is (InnerText)");
                Console.WriteLine(tempXmlDocument.InnerText);
                Console.WriteLine("----------Detail------------------");
                foreach (XmlNode x in tempXmlDocument.ChildNodes){
                    WroteXMLnode(x, "");
                }
            }
        }
        static void WroteXMLnode(XmlNode node, String spaceStr) {
            Console.WriteLine(spaceStr + "name=" + node.Name + ", type=" + node.NodeType.ToString());
            Console.WriteLine(spaceStr + "valT=" + node.InnerText);
            Console.WriteLine(spaceStr + "valX=" + node.InnerXml);
            if (node.HasChildNodes == true){
                foreach (XmlNode x in node.ChildNodes){
                    WroteXMLnode(x, spaceStr + " ");
                }
            }
        }
    }
}

소스 코드 (exXmlResolver.cs)



XXE 및 .NET Framework과 정확히 동일하기 때문에 생략

뒤로



XXE 기본편으로 돌아가기

좋은 웹페이지 즐겨찾기