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.)