Web XML Injection
Inyección XML Web
Descripción
Las vulnerabilidades de inyección XML ocurren cuando las entradas del usuario se incorporan de manera inadecuada en un documento XML del lado del servidor o en un mensaje SOAP. La explotación de esta vulnerabilidad implica la manipulación de metacaracteres XML para alterar potencialmente la estructura XML. El impacto varía según la función que utilice el documento XML, desde la interrupción de la lógica de la aplicación hasta acciones no autorizadas o el acceso no autorizado a datos sensibles.
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringWriter;
public class XMLInjectionExample {
public static void main(String[] args) {
// Simulated user input (this should come from a user or external source)
String userInput = "<maliciousTag>Payload</maliciousTag>";
// Vulnerable XML construction without proper input validation
String xmlData = "<data>" + userInput + "</data>";
// Process the XML data (vulnerable code)
processXmlData(xmlData);
}
public static void processXmlData(String xmlData) {
try {
// Parse the XML data
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new org.xml.sax.InputSource(new java.io.StringReader(xmlData)));
// Extract information from the XML (vulnerable code)
Element root = document.getDocumentElement();
String content = root.getTextContent();
System.out.println("Processed XML data: " + content);
} catch (Exception e) {
System.err.println("Error processing XML data: " + e.getMessage());
}
}
}
const userInput = '<maliciousTag>Payload</maliciousTag>';
// Vulnerable XML construction without proper input validation
const xmlData = '<data>' + userInput + '</data>';
// Process the XML data (vulnerable code)
processXmlData(xmlData);
function processXmlData(xmlData) {
try {
// Parse the XML data
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlData, 'text/xml');
// Extract information from the XML (vulnerable code)
const content = xmlDoc.getElementsByTagName('data')[0].textContent;
console.log('Processed XML data: ' + content);
} catch (error) {
console.error('Error processing XML data: ' + error.message);
}
}
<?php
$userInput = '<maliciousTag>Payload</maliciousTag>';
// Vulnerable XML construction without proper input validation
$xmlData = '<data>' . $userInput . '</data>';
// Process the XML data (vulnerable code)
processXmlData($xmlData);
function processXmlData($xmlData) {
try {
// Create a new DOMDocument
$doc = new DOMDocument();
// Load the XML data
$doc->loadXML($xmlData);
// Extract information from the XML (vulnerable code)
$content = $doc->getElementsByTagName('data')->item(0)->textContent;
echo 'Processed XML data: ' . $content . PHP_EOL;
} catch (Exception $e) {
echo 'Error processing XML data: ' . $e->getMessage() . PHP_EOL;
}
}
?>
Recomendación
- Evitar la concatenación directa: Evite concatenar las entradas del usuario directamente en documentos XML.
- Saneamiento de las entradas del usuario: Sanee las entradas del usuario antes de insertarlas en documentos XML.
- Analizadores XML robustos: Utilice analizadores XML seguros y bien establecidos que cumplan con las especificaciones XML. Tenga cuidado con los analizadores personalizados o desactualizados que puedan tener vulnerabilidades.
- Deshabilitar características XML peligrosas: Si no es necesario, deshabilite la expansión de entidades externas para reducir la superficie de ataque y mitigar el riesgo de vulnerabilidades XXE.
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
public class MitigatedXMLInjectionExample {
public static void main(String[] args) {
// Simulated user input (this should come from a user or external source)
String userInput = "<maliciousTag>Payload</maliciousTag>";
// Mitigated XML construction with proper input validation
String sanitizedInput = sanitizeUserInput(userInput);
String xmlData = "<data>" + sanitizedInput + "</data>";
// Process the XML data (mitigated code)
processXmlData(xmlData);
}
public static String sanitizeUserInput(String input) {
// Perform proper input validation and sanitization
// For example, you can use a library or a regex to remove invalid characters
return input.replaceAll("[&<>\"]", "");
}
public static void processXmlData(String xmlData) {
try {
// Parse the XML data
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new org.xml.sax.InputSource(new StringReader(xmlData)));
// Extract information from the XML (mitigated code)
Element root = document.getDocumentElement();
String content = root.getTextContent();
System.out.println("Processed XML data: " + content);
} catch (Exception e) {
System.err.println("Error processing XML data: " + e.getMessage());
}
}
}
const userInput = '<maliciousTag>Payload</maliciousTag>';
// Mitigated XML construction with proper input validation
const sanitizedInput = sanitizeUserInput(userInput);
const xmlData = '<data>' + sanitizedInput + '</data>';
// Process the XML data (mitigated code)
processXmlData(xmlData);
function sanitizeUserInput(input) {
// Perform proper input validation and sanitization
// For example, you can use a library like DOMPurify for HTML/XML sanitization
// Here, we are using a simple approach to remove invalid characters
return input.replace(/[&<>"']/g, '');
}
function processXmlData(xmlData) {
try {
// Parse the XML data
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlData, 'text/xml');
// Extract information from the XML (mitigated code)
const content = xmlDoc.getElementsByTagName('data')[0].textContent;
console.log('Processed XML data: ' + content);
} catch (error) {
console.error('Error processing XML data: ' + error.message);
}
}
<?php
$userInput = '<maliciousTag>Payload</maliciousTag>';
// Mitigated XML construction with proper input validation
$sanitizedInput = sanitizeUserInput($userInput);
$xmlData = '<data>' . $sanitizedInput . '</data>';
// Process the XML data (mitigated code)
processXmlData($xmlData);
function sanitizeUserInput($input) {
// Perform proper input validation and sanitization
// For example, you can use functions like htmlspecialchars to sanitize XML content
return htmlspecialchars($input, ENT_XML1, 'UTF-8');
}
function processXmlData($xmlData) {
try {
// Create a new DOMDocument
$doc = new DOMDocument();
// Load the XML data
$doc->loadXML($xmlData);
// Extract information from the XML (mitigated code)
$content = $doc->getElementsByTagName('data')->item(0)->textContent;
echo 'Processed XML data: ' . $content . PHP_EOL;
} catch (Exception $e) {
echo 'Error processing XML data: ' . $e->getMessage() . PHP_EOL;
}
}
?>
Enlaces
Estándares
- GDPR:
- ART_25
- ART_32
- PCI_STANDARDS:
- REQ_6_4
- REQ_6_5
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213
- SECURITY255