XXE 및 .NET Framework (SgmlReaderDll.dll)
                                            
                                                
                                                
                                                
                                                
                                                
                                                 17951 단어  .NETFrameworkXMLSgmlReaderXXE
                    
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.csusing 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 기본편으로 돌아가기
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(XXE 및 .NET Framework (SgmlReaderDll.dll)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/tomoki0sanaki/items/8a4e0442c70628d8a1e8
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
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.csusing 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 기본편으로 돌아가기
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(XXE 및 .NET Framework (SgmlReaderDll.dll)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/tomoki0sanaki/items/8a4e0442c70628d8a1e8
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
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 + " ");
                }
            }
        }
    }
}
XXE 및 .NET Framework과 정확히 동일하기 때문에 생략
뒤로
XXE 기본편으로 돌아가기
Reference
이 문제에 관하여(XXE 및 .NET Framework (SgmlReaderDll.dll)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomoki0sanaki/items/8a4e0442c70628d8a1e8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)