You are on page 1of 15

Phòng thủ

XML External Entity Prevention Cheat


Cuộc tấn công này xảy ra khi đầu vào XML không tin cậy có chứa tham chiếu đến
một thực thể bên ngoài được xử lý bởi trình phân tích cú pháp XML được cấu hình
yếu.
Cuộc tấn công này có thể dẫn đến việc tiết lộ dữ liệu bí mật, từ chối dịch vụ, giả
mạo yêu cầu phía máy chủ (SSRF), quét cổng từ góc độ của máy có trình phân tích
cú pháp và các tác động khác của hệ thống.
Phòng ngừa XXE cho một số ngôn ngữ và trình phân tích cú pháp XML thường
được sử dụng trong các ngôn ngữ đó:

C/C++
Libxml2:
The Enum xmlParserOption không nên có các tùy chọn sau được định nghĩa:
 XML_PARSE_NOENT: Mở rộng các thực thể và thay thế chúng bằng văn
bản thay thế.
 XML_PARSE_DTDLOAD: Tải DTD bên ngoài.
Bắt đầu với libxml2 phiên bản 2.9, XXE đã bị tắt theo mặc định như cam kết của
bản vá sau.
Tìm kiếm cách sử dụng các APIs sau để đảm bảo không có XML_PARSE_NOENT
và XML_PARSE_DTDLOAD được xác định trong các tham số:

 xmlCtxtReadDoc
 xmlCtxtReadFd
 xmlCtxtReadFile
 xmlCtxtReadIO
 xmlCtxtReadMemory
 xmlCtxtUseOptions
 xmlParseInNodeContext
 xmlReadDoc
 xmlReadFd
 xmlReadFile
 xmlReadIO
 xmlReadMemory
Libxerces-c
Sử dụng XercesDOMParser để ngăn XXE:
XercesDOMParser *parser = new XercesDOMParser;
parser->setCreateEntityReferenceNodes(true);
parser->setDisableDefaultEntityResolution(true);

Sử dụng SAXParser để ngăn XXE:


SAXParser* parser = new SAXParser;
parser->setDisableDefaultEntityResolution(true);

Sử dụng SAX2XMLReader để ngăn XXE:


SAX2XMLReader* reader = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);

JAVA
Các ứng dụng Java sử dụng các thư viện XML đặc biệt dễ bị tấn công bởi XXE vì
các cài đặt mặc định cho hầu hết các trình phân tích cú pháp Java XML là phải bật
XXE. Để sử dụng các trình phân tích cú pháp này một cách an toàn, ta phải vô hiệu
hóa XXE trong trình phân tích cú pháp mà bạn sử dụng. 1 số mô tả cách tắt XXE
trong các trình phân tích cú pháp XML được sử dụng phổ biến nhất cho Java.
JAXP DocumentBuilderFactory, SAXParserFactory and DOM4J
DocumentBuilderFactory, SAXParserFactory và DOM4J XML Parsers có thể
được cấu hình bằng các kỹ thuật tương tự để bảo vệ chúng chống lại XXE.
Chỉ có ví dụ DocumentBuilderFactory được trình bày ở đây. Phương thức JAXP
DocumentBuilderFactory setFeature) cho phép nhà phát triển kiểm soát các tính
năng bộ xử lý XML dành riêng cho việc triển khai nào được bật hoặc tắt.
Các tính năng có thể được đặt trên nhà máy hoặc phương thức setReature
XMLReader nằm bên dưới.
Mỗi triển khai bộ xử lý XML có các tính năng riêng chi phối cách xử lý các DTD
và các thực thể bên ngoài.
Đối với syntax highlighted đoạn mã ví dụ bằng SAXParserFactory:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; // catching unsupported features

...

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();


String FEATURE = null;
try {
// This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all
// XML entity attacks are prevented
// Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
dbf.setFeature(FEATURE, true);

// If you can't completely disable DTDs, then at least do the following:


// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
// JDK7+ - http://xml.org/sax/features/external-general-entities
FEATURE = "http://xml.org/sax/features/external-general-entities";
dbf.setFeature(FEATURE, false);

// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
// JDK7+ - http://xml.org/sax/features/external-parameter-entities
FEATURE = "http://xml.org/sax/features/external-parameter-entities";
dbf.setFeature(FEATURE, false);

// Disable external DTDs as well


FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
dbf.setFeature(FEATURE, false);

// and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);

// And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then
// ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
// (http://cwe.mitre.org/data/definitions/918.html) and denial
// of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."

// remaining parser logic


...
} catch (ParserConfigurationException e) {
// This should catch a failed setFeature feature
logger.info("ParserConfigurationException was thrown. The feature '" + FEATURE
+ "' is probably not supported by your XML processor.");
...
} catch (SAXException e) {
// On Apache, this should be thrown when disallowing DOCTYPE
logger.warning("A DOCTYPE was passed into the XML document");
...
} catch (IOException e) {
// XXE that points to a file that doesn't exist
logger.error("IOException occurred, XXE may still possible: " + e.getMessage());
...
}

// Load XML file or stream using a XXE agnostic configured parser...


DocumentBuilder safebuilder = dbf.newDocumentBuilder();

Xerces 1 Features:
Không bao gồm các thực thể bên ngoài bằng cách đặt feature  này thành false.
Không bao gồm các thực thể tham số bằng cách đặt feature này thành false.
Không bao gồm các DTD bên ngoài bằng cách đặt feature này thành false.

Xerces 2 Features:
Không cho phép một DTD nội tuyến bằng cách đặt feature này thành đúng.
Không bao gồm các thực thể bên ngoài bằng cách đặt feature này thành false.
Không bao gồm các thực thể tham số bằng cách đặt feature này thành false.
Không bao gồm các DTD bên ngoài bằng cách đặt feature này thành false.

Lưu ý: Các biện pháp bảo vệ ở trên yêu cầu cập nhật Java 7 67, cập nhật Java 8 20 hoặc cao hơn, vì các
biện pháp đối phó ở trên đối với DocumentBuilderFactory và SAXParserFactory đã bị phá vỡ trong các
phiên bản Java trước đó, theo: CVE-2014-6517.

XMLInputFactory (a StAX parser)


Các trình phân tích cú pháp StAX như XMLInputFactory cho phép các thuộc tính
và tính năng khác nhau được đặt.
Để bảo vệ Java XMLInputFactory khỏi XXE:
// This disables DTDs entirely for that factory
xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
// disable external entities
xmlInputFactory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);

TransformerFactory
Để bảo vệ một javax.xml.transform.TransformerFactory khỏi XXE:
ransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

Validator
Để bảo vệ một javax.xml.validation.Validator khỏi XXE:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");

SchemaFactory
Để bảo vệ một javax.xml.validation.SchemaFactory khỏi XXE:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
Schema schema = factory.newSchema(Source);

SAXTransformerFactory
Để bảo vệ một javax.xml.transform.sax.SAXTransformerFactory khỏi XXE:
SAXTransformerFactory sf = SAXTransformerFactory.newInstance();
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
sf.newXMLFilter(Source);

Lưu ý: Việc sử dụng các XMLConstants sau đây yêu cầu JAXP 1.5, được thêm vào Java trong 7u40 và
Java 8:

 javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD
 javax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMA
 javax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEET

XMLReader
Để bảo vệ một org.xml.sax.XMLReader khỏi XXE:
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// This may not be strictly required as DTDs shouldn't be allowed at all, per previous line.
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

SAXReader
Để bảo vệ một org.dom4j.io.SAXReader khỏi XXE:
saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
saxReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Dựa trên thử nghiệm, nếu thiếu một trong số này, vẫn có thể dễ bị tấn công XXE
attack.
SAXBuilder
Để bảo vệ một org.jdom2.input.SAXBuilder khỏi XXE:
SAXBuilder builder = new SAXBuilder();
builder.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
builder.setFeature("http://xml.org/sax/features/external-general-entities", false);
builder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
Document doc = builder.build(new File(fileName));
No-op EntityResolver
Đối với các API sử dụng EntityResolver, bạn có thể vô hiệu hóa khả năng của trình
phân tích cú pháp XML để giải quyết các thực thể bằng cách: cung cấp một a no-op
implementation:

public final class NoOpEntityResolver implements EntityResolver {


public InputSource resolveEntity(String publicId, String systemId) {
return new InputSource(new StringReader(""));
}
}

// ...

xmlReader.setEntityResolver(new NoOpEntityResolver());
documentBuilder.setEntityResolver(new NoOpEntityResolver());

Hoặc đơn giản hơn:

EntityResolver noop = (publicId, systemId) -> new InputSource(new StringReader(""));


xmlReader.setEntityResolver(noop);
documentBuilder.setEntityResolver(noop);

JAXB Unmarshaller
Do javax.xml.bind.Unmarshaller phân tích cú pháp XML và không hỗ trợ bất kỳ cờ nào để
vô hiệu hóa XXE, nên trước tiên phải phân tích cú pháp XML không tin cậy thông
qua trình phân tích cú pháp bảo mật có thể định cấu hình, tạo đối tượng nguồn và
chuyển đối tượng nguồn sang Unmarshaller. Ví dụ:
//Disable XXE
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

//Do unmarshall operation


Source xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(),
new InputSource(new StringReader(xml)));
JAXBContext jc = JAXBContext.newInstance(Object.class);
Unmarshaller um = jc.createUnmarshaller();
um.unmarshal(xmlSource);

Java 8 trở lên:


Vì JDK-8010393, trong phiên bản OpenJDK 8 beta 86, các phiên bản
javax.xml.bind.Unmarshaller được an toàn theo mặc định. Các class khác được đề cập ở
đây vẫn không an toàn theo mặc định trong Java 8.
XPathExpression
Một javax.xml.xpath.XPathExpression không thể cấu hình 1 cách an toàn, do đó, dữ liệu
không đáng tin cậy phải được phân tích cú pháp thông qua một trình phân tích cú
pháp XML an toàn khác trước.
Ví dụ:
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
df.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
df.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
DocumentBuilder builder = df.newDocumentBuilder();
String result = new XPathExpression().evaluate( builder.parse(
new ByteArrayInputStream(xml.getBytes())) );

java.beans.XMLDecoder
Phương thức  readObject() trong lớp này về cơ bản không an toàn.
XML không chỉ phân tích cú pháp theo XXE, nhưng phương thức này có thể sử
dụng để xây dựng bất kỳ Java object nào , và thực thi mã tùy ý như được mô tả ở
đây(execute arbitrary code as described here .).
Và không có cách nào để sử dụng lớp này an toàn ngoại trừ tin tưởng hoặc xác
nhận hợp lệ đầu vào được truyền vào nó.
Do đó, chúng tôi thực sự khuyên bạn nên tránh hoàn toàn việc sử dụng lớp này và
thay thế nó bằng trình phân tích cú pháp XML an toàn hoặc được cấu hình đúng
như được mô tả ở nơi khác trong bảng cheat này.
Other XML Parsers
Có nhiều thư viện bên thứ 3 phân tích cú pháp XML trực tiếp hoặc thông qua việc
sử dụng các thư viện khác của họ. Có thể test và xác minh trình phân tích cú pháp
XML của họ được bảo mật chống lại XXE theo mặc định. Nếu trình phân tích cú
pháp không an toàn theo mặc định, hãy tìm các cờ được trình phân tích cú pháp hỗ
trợ để vô hiệu hóa tất cả các vùi tài nguyên bên ngoài có thể như các ví dụ đã nêu ở
trên. Nếu không có kiểm soát nào được đưa ra bên ngoài, trước tiên hãy đảm bảo
nội dung không tin cậy được chuyển qua trình phân tích cú pháp bảo mật và sau đó
được chuyển đến trình phân tích cú pháp của bên thứ 3 không an toàn tương tự như
cách bảo mật của Unmarshaller.

Spring Framework MVC/OXM XXE Vulnerabilities(Lỗ hổng Spring Framework


MVC / OXM XXE)
Ví dụ, một số lỗ hổng XXE đã được tìm thấy trong  Spring OXM và Spring MVC. Các
phiên bản sau của Spring Framework dễ bị XXE:
 3.0.0 to 3.2.3 (Spring OXM & Spring MVC)
 4.0.0.M1 (Spring OXM)
 4.0.0.M1-4.0.0.M2 (Spring MVC)

Có những vấn đề khác cũng đã được khắc phục sau đó, vì vậy để giải quyết đầy
đủ những vấn đề này, Spring khuyên người dùng nên nâng cấp lên Spring
Framework 3.2.8+ hoặc 4.0.2+.

Đối với Spring OXM, điều này đề cập đến việc sử dụng
org.springframework.oxm.jaxb.Jaxb2Marshaller. Lưu ý rằng CVE cho Spring
OXM chỉ ra cụ thể rằng 2 tình huống phân tích cú pháp XML tùy thuộc vào nhà
phát triển để xử lý đúng và 2 là trách nhiệm của Spring và đã được sửa để giải
quyết CVE này.

Đây là những gì họ nói:

Hai tình huống nhà phát triển phải xử lý:

 Đối với DOMSource, XML đã được phân tích cú pháp bởi mã người dùng và
mã đó chịu trách nhiệm bảo vệ chống lại XXE.
 Đối với StAXSource, XMLStreamReader đã được tạo bởi mã người dùng và
mã đó chịu trách nhiệm bảo vệ chống lại XXE.

Vấn đề Spring đã được khắc phục:

Đối với các phiên bản SAXSource và StreamSource, Spring đã xử lý các thực
thể bên ngoài theo mặc định do đó tạo ra lỗ hổng này.

Đây là một ví dụ về việc sử dụng StreamSource dễ bị tấn công, nhưng hiện đã an


toàn, nếu bạn đang sử dụng phiên bản cố định của Spring OXM hoặc Spring
MVC:
import org.springframework.oxm.Jaxb2Marshaller;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;

Jaxb2Marshaller marshaller = new Jaxb2Marshaller();


// Must cast return Object to whatever type you are unmarshalling
marshaller.unmarshal(new StreamSource(new StringReader(some_string_containing_XML));

Vì vậy, theo  Spring OXM CVE writeup , ở trên là an toàn. Nhưng nếu bạn sử dụng
DOMSource hoặc StAXSource thay vào đó, có thể cấu hình các nguồn đó để an
toàn từ XXE.
Castor
Castor là một khung liên kết dữ liệu cho Java. Nó cho phép chuyển đổi giữa các
đối tượng Java, XML và các bảng quan hệ. Các tính năng XML trong Castor trước
phiên bản 1.3.3 dễ bị tấn công bởi XXE và nên được nâng cấp lên phiên bản mới
nhất. Để biết thêm thông tin, hãy kiểm tra tệp cấu hình XML configuration file .

.NET
Thông tin sau đây về tiêm XXE trong .NET là trực tiếp từ web application of unit tests
by Dean Fleming.

Ứng dụng web này bao gồm tất cả các trình phân tích cú pháp .NET XML hiện
được hỗ trợ và có các trường hợp thử nghiệm cho từng trình diễn khi chúng an toàn
khỏi tiêm XXE và khi nào thì không.
Trước đây, thông tin này được dựa trên bài viết James Jardine's excellent .NET XXE
article.

Ban đầu, nó cung cấp nhiều thông tin gần đây và chi tiết hơn so với bài viết cũ của
James Jardine's excellent .NET XXE article ., tuy nhiên, nó có một số điểm không chính
xác mà ứng dụng web đưa ra.
Bảng sau liệt kê tất cả các trình phân tích cú pháp .NET XML được hỗ trợ và các
mức an toàn mặc định của chúng:

XML Parser Safe by default?

LINQ to XML Yes

XmlDictionaryReader Yes

XmlDocument

...prior to 4.5.2 No

...in versions 4.5.2+ Yes

XmlNodeReader Yes

XmlReader Yes
XML Parser Safe by default?

XmlTextReader

...prior to 4.5.2 No

...in versions 4.5.2+ Yes

XPathNavigator

...prior to 4.5.2 No

...in versions 4.5.2+ Yes

XslCompiledTransform Yes

LINQ to XML
Cả hai đối tượng XElement và XDocument trong thư viện System.Xml.Linq đều an toàn
khi tiêm XXE theo mặc định XElement chỉ phân tích các phần tử trong tệp XML, do
đó các DTD bị bỏ qua hoàn toàn. XDocument có các DTD bị tắt theo mặc
định( disabled by default ) và chỉ không an toàn nếu được xây dựng với trình phân
tích cú pháp XML không an toàn khác.

XmlDictionaryReader
System.Xml.XmlDictionaryReader theo mặc định là an toàn, vì khi nó cố phân tích
DTD, trình biên dịch sẽ đưa ra một ngoại lệ nói rằng "các phần tử CData không
hợp lệ ở cấp cao nhất của tài liệu XML". Nó trở nên không an toàn nếu được xây
dựng với trình phân tích cú pháp XML không an toàn khác.

XmlDocument
Trước .NET Framework phiên bản 4.5.2, System.Xml.XmlDocument không an toàn
theo mặc định. Đối tượng XmlDocument có một đối tượng XmlResolver bên trong nó
cần được đặt thành null trong các phiên bản trước 4.5.2. Trong các phiên bản 4.5.2
trở lên, XmlResolver này được đặt thành null theo mặc định.
Ví dụ dưới đây cho thấy cách nó được thực hiện an toàn:
static void LoadXML()
{
string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM
'file:///C:/Users/testdata2.txt'>]>"
+ "<doc>&win;</doc>";
string xml = "<?xml version='1.0' ?>" + xxePayload;

XmlDocument xmlDoc = new XmlDocument();


// Setting this to NULL disables DTDs - Its NOT null by default.
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xml);
Console.WriteLine(xmlDoc.InnerText);
Console.ReadLine();
}
XmlDocument có thể trở nên không an toàn nếu ta tạo XmlResolver không riêng của
mình với các cài đặt mặc định hoặc không an toàn. Nếu ta cần kích hoạt xử lý
DTD, các hướng dẫn về cách thực hiện một cách an toàn được mô tả chi tiết trong
bài viết referenced MSDN article.

XmlNodeReader
Các đối tượng System.Xml.XmlNodeReader an toàn theo mặc định và sẽ bỏ qua các
DTD ngay cả khi được xây dựng với trình phân tích cú pháp không an toàn hoặc
được bọc trong một trình phân tích cú pháp không an toàn khác.

XmlReader
Các đối tượng System.Xml.XmlReader được an toàn theo mặc định.
Chúng được đặt theo mặc định để đặt thuộc tính ProhibitDtd của chúng thành false
trong các phiên bản .NET Framework 4.0 trở về trước hoặc thuộc tính
DtdProcessing của chúng được đặt thành Prohibit trong phiên bản .NET 4.0 trở lên.

Ngoài ra, trong các phiên bản .NET 4.5.2 trở lên, XmlReaderSettings thuộc XmlReader
có XmlResolver được đặt thành null theo mặc định, cung cấp thêm một lớp an toàn.
Do đó, các đối tượng XmlReader sẽ chỉ trở nên không an toàn trong phiên bản 4.5.2
trở lên nếu cả thuộc tính DtdProcessing được đặt thành Parse và XmlReaderSetting của
XmlResolver được đặt thành XmlResolver không có cài đặt mặc định hoặc không an
toàn. Nếu bạn cần kích hoạt xử lý DTD, các hướng dẫn về cách thực hiện một cách
an toàn được mô tả chi tiết trong bài viết referenced MSDN article.

XmlTextReader
không an toàn theo mặc định trong các phiên bản .NET
System.Xml.XmlTextReader
Framework trước 4.5.2. Đây là cách làm cho nó an toàn trong các phiên bản .NET
khác nhau:
Trước .NET 4.0
Trong các phiên bản .NET Framework trước 4.0, hành vi phân tích cú pháp DTD
cho các đối tượng XmlReader như XmlTextReader được kiểm soát bởi thuộc tính
Boolean ProhibitDtd được tìm thấy trong các lớp System.Xml.XmlReaderSettings và
System.Xml.XmlTextReader  classes.

Đặt các giá trị này thành true để tắt hoàn toàn các DTD inline.
XmlTextReader reader = new XmlTextReader(stream);
// NEEDED because the default is FALSE!!
reader.ProhibitDtd = true;

.NET 4.0 - .NET 4.5.2


Trong .NET Framework phiên bản 4.0, hành vi phân tích cú pháp DTD đã được
thay đổi. Chủ sở hữu ProhibitDtd đã không được chấp nhận để ủng hộ chủ sở hữu
DtdProcessing mới.

Tuy nhiên, họ đã không thay đổi cài đặt mặc định nên XmlTextReader vẫn dễ bị XXE
mặc định.
Đặt DtdProcessing thành Prohibit khiến cho bộ thực thi đưa ra một ngoại lệ nếu một
phần tử <! DOCTYPE> có trong XML.
Để tự đặt giá trị này:
XmlTextReader reader = new XmlTextReader(stream);
// NEEDED because the default is Parse!!
reader.DtdProcessing = DtdProcessing.Prohibit;

Ngoài ra, ta có thể đặt thuộc tính DtdProcessing thành Ignore, điều này sẽ không gây
ra ngoại lệ khi gặp phần tử <! DOCTYPE> mà sẽ bỏ qua nó và không xử lý nó.
Cuối cùng, ta có thể đặt DtdProcessing thành Parse nếu bạn muốn cho phép và xử lý
các DTD inline.

.NET 4.5.2 và trở lên


Trong các phiên bản .NET Framework 4.5.2 trở lên, XmlTextReader bên trong
XmlResolver được đặt thành null theo mặc định, làm cho XmlTextReader ignore các
DTD theo mặc định. XmlTextReader có thể trở nên không an toàn nếu bạn tạo
XmlResolver không riêng của mình với các cài đặt mặc định hoặc không an toàn.
XPathNavigator
không an toàn theo mặc định trong các phiên
System.Xml.XPath.XPathNavigator
bản .NET Framework trước 4.5.2.
Điều này là do thực tế là nó triển khai các đối tượng IXPathNavigable như
XmlDocument , mặc định cũng không an toàn trong các phiên bản trước 4.5.2.

Bạn có thể làm cho XPathNavigator an toàn bằng cách cung cấp cho nó một trình
phân tích cú pháp an toàn như XmlReader (mặc định là an toàn) trong XPathDocument
constructor.
Đây là một ví dụ:
XmlReader reader = XmlReader.Create("example.xml");
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
string xml = nav.InnerXml.ToString();

XslCompiledTransform
System.Xml.Xsl.XslCompiledTransform(một biến XML) theo mặc định là an toàn miễn
là trình phân tích cú pháp được cung cấp là an toàn.
Theo mặc định, nó an toàn vì trình phân tích cú pháp mặc định của các phương
thức Transform() là XmlReader, theo mặc định là an toàn (theo ở trên).
Mã nguồn cho phương pháp này:
http://www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/f
x/src/Xml/System/Xml/Xslt/XslCompiledTransform@cs/1305376/XslCompiledTransform@cs .

Một số phương thức Transform () chấp nhận XmlReader hoặc IXPathNavigable (ví
dụ: XmlDocument) làm đầu vào và nếu ta chuyển qua XML Parser không an toàn
thì Transform cũng sẽ không an toàn.

IOS
libxml2
iOS bao gồm thư viện libxml2 C / C ++ được mô tả ở trên, do đó, hướng dẫn sẽ
được áp dụng nếu đang sử dụng libxml2 trực tiếp.
Tuy nhiên, phiên bản libxml2 được cung cấp qua iOS6 trước phiên bản 2.9 của
libxml2 (bảo vệ chống lại XXE theo mặc định).
NSXMLDocument
iOS cũng cung cấp loại NSXMLDocument, được xây dựng dựa trên libxml2.
Tuy nhiên, NSXMLDocument cung cấp một số biện pháp bảo vệ bổ sung chống lại XXE
không có sẵn trong libxml2.
Trên phần 'API giới hạn thực thể bên ngoài NSXMLDocument' của trang :
https://developer.apple.com/library/ios/#releasenotes/Foundation/RN-Foundation-
iOS/Foundation_iOS5.html

 iOS4 trở về trước: Tất cả các thực thể bên ngoài được tải theo mặc định.
 iOS5 trở lên: Chỉ các thực thể không yêu cầu truy cập mạng mới được tải.
(an toàn hơn)
Tuy nhiên, để vô hiệu hóa hoàn toàn XXE trong NSXMLDocument trong bất kỳ phiên
bản iOS nào, bạn chỉ cần chỉ định NSXMLNodeLoadExternalEntitiesNever khi tạo
NSXMLDocument .

PHP
Theo  the PHP documentation, nên đặt các mục sau đây khi sử dụng default PHP
XML parser của PHP để ngăn XXE:
libxml_disable_entity_loader(true);

Một mô tả về cách lạm dụng điều này trong PHP được trình bày trong một bài viết
hay  SensePost article mô tả một lỗ hổng XXE dựa trên PHP tuyệt vời đã được sửa
trong Facebook.

Python
The Python 3 official documentation chứa một phần về  xml vulnerabilities . Đối với
Python 2, bạn có thể tham khảo trang: https://docs.python.org/2/library/xml.html#xml-
vulnerabilities.

Bảng sau đây cung cấp tổng quan về các mô-đun khác nhau trong Python 3 được
sử dụng để phân tích cú pháp XML và liệu chúng có dễ bị khai thác hay không.

Attack Type sax etree minidom pulldom xmlrpc

Billion Laughs Vulnerabl Vulnerabl Vulnerabl Vulnerabl Vulnerable


Attack Type sax etree minidom pulldom xmlrpc

e e e e

Quadratic Vulnerabl Vulnerabl Vulnerabl Vulnerabl


Vulnerable
Blowup e e e e

External Entity
Safe Safe Safe Safe Safe
Expansion

DTD Retrieval Safe Safe Safe Safe Safe

Decompression
Safe Safe Safe Safe Vulnerable
Bomb

Để bảo vệ ứng dụng của khỏi các cuộc tấn công applicable attacks,  two packages
tồn tại để giúp ta bảo đầu vào và bảo vệ ứng dụng khỏi DDoS và các cuộc tấn
công từ xa.

XML Security
Thông số kỹ thuật cho các lược đồ XML và XML bao gồm nhiều lỗi bảo mật.
Đồng thời, các thông số kỹ thuật này cung cấp các công cụ cần thiết để bảo vệ các
ứng dụng XML. Sử dụng các lược đồ XML để xác định tính bảo mật của tài liệu
XML, chúng có thể được sử dụng để thực hiện một loạt các cuộc tấn công: file
retrieval, server side request forgery, port scanning, or brute forcing. Tài liệu XML
không đúng định dạng: các lỗ hổng sử dụng các tài liệu không được định dạng tốt.
Có thể tham khảo phần XML security trên https://cheatsheetseries.owasp.org/ :
URL: https://cheatsheetseries.owasp.org/cheatsheets/XML_Security_Cheat_Sheet.html .

You might also like