رده:موجودیت های خارجی ایکس ام ال(XML External Entity)

از Secure Coding

نسخهٔ تاریخ ‏۲۷ دسامبر ۲۰۱۹، ساعت ۱۳:۴۷ توسط Admin (بحث | مشارکت‌ها)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)

این آسیب پذیری ابتدا با تزریق در xml آغاز می شود و سپس به علت کنترل نادرست ورودی های می تواند منجر به آسیب پذیری های مختلف شود.

Xxe.png

برای مثال در تصویر بالا مهاجم پس از تزریق دستور زیر

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId>

باعث نمایش فایل /etc/passwd می شود.

در xml می توانیم به موجودیت بیرون (External) از xml جاری با استفاده از DOCTYPE اشاره کنیم.

به این صورت که ابتدا نامی برای element تعریف می کنیم و سپس محتوای آن را توسط ENTITY مشخص می کنیم.

برای دسترسی به ENTITY باید نامی برای آن تعریف کنیم(xxe) و با استفاده از دستور SYSTEM، دستور(file:///etc/passwd) را اجرا می کنیم.

روش های جلوگیری

روش های جلوگیری در PHP

مثال 1)

<?php 
$goodXML = '<test><testing>my value</testing></test>'; 
$badXml = '<!DOCTYPE root [ <!ENTITY foo SYSTEM "http://test.localhost:8080/contents.txt"> ]> <test><testing>&foo;</testing></test>';
$doc = simplexml_load_string($badXml ); 
echo $doc->testing; 
?>

مثال 2)

// In XML processors based on libxml2, dangerous LIBXML constants include: LIBXML_DTDLOAD, LIBXML_DTDVALID, LIBXML_NOENT, LIBXML_XINCLUDE

$xml = $_GET["xml"];

$doc = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOENT); // Noncompliant

$doc = new DOMDocument();
$doc->loadXML($xml, LIBXML_NOENT); // Noncompliant

$reader = new XMLReader();
$reader->XML($xml, NULL, LIBXML_NOENT); // Noncompliant

راه حل 1)

<?php 
$goodXML = '<test><testing>my value</testing></test>'; 
$badXml = '<!DOCTYPE root [ <!ENTITY foo SYSTEM "http://test.localhost:8080/contents.txt"> ]> <test><testing>&foo;</testing></test>';
libxml_disable_entity_loader(true);
$doc = simplexml_load_string($badXml); 
echo $doc->testing; 
?>

راه حل 2)

// Starting with libxml2 version 2.9, dangerous functionality is disabled by default

$xml = $_GET["xml"];

$doc = simplexml_load_string($xml);

$doc = new DOMDocument();
$doc->loadXML($xml);

$reader = new XMLReader();
$reader->XML($xml);

روش های جلوگیری در ASP.NET

مثال 1)

StreamReader stream = new StreamReader(data);
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
XmlReader xmlReader = XmlReader.Create(stream, settings);

راه حل 1)

StreamReader stream = new StreamReader(data);
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Ignore;
XmlReader xmlReader = XmlReader.Create(stream, settings);

روش های جلوگیری در JAVA

مثال 1)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
 
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
class XXE {
  private static void receiveXMLStream(InputStream inStream,
                                       DefaultHandler defaultHandler)
      throws ParserConfigurationException, SAXException, IOException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    saxParser.parse(inStream, defaultHandler);
  }
 
  public static void main(String[] args) throws ParserConfigurationException,
      SAXException, IOException {
    try {
      receiveXMLStream(new FileInputStream("evil.xml"), new DefaultHandler());
    } catch (java.net.MalformedURLException mue) {
      System.err.println("Malformed URL Exception: " + mue);
    }
  }
}

راه حل 1)

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
 
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
 
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
 
class XXE {
  private static void receiveXMLStream(InputStream inStream,
      DefaultHandler defaultHandler) throws ParserConfigurationException,
      SAXException, IOException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
 
    // Create an XML reader to set the entity resolver.
    XMLReader reader = saxParser.getXMLReader();
    reader.setEntityResolver(new CustomResolver());
    reader.setContentHandler(defaultHandler);
 
    InputSource is = new InputSource(inStream);
    reader.parse(is);
  }
 
  public static void main(String[] args) throws ParserConfigurationException,
      SAXException, IOException {
    try {
      receiveXMLStream(new FileInputStream("evil.xml"), new DefaultHandler());
    } catch (java.net.MalformedURLException mue) {
      System.err.println("Malformed URL Exception: " + mue);
    }
  }
}

این رده در حال حاضر حاوی هیچ صفحه یا پرونده‌ای نیست.