XML injection Error im Fortify Test

Casio

Mitglied
Hallo liebe Leute,

ich habe momentan folgendes Problem: ich lasse den Fortifyscan über mein Code laufen und kriege den oben genannten Error. Ich habe alles mögliche mittlerweile schon versucht, habe versucht Lösungen aus diesen beiden Seiten zu implementieren:

http://appvigil.co/documentation/doku.php?id=xml_parsing_vulnerable_to_xxe_document_builder

bzw. diese Seite:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

aber wirklich garnichts hilft, selbst auf Stackoverflow antwortet keiner auf diese Frage wie ich dieses Problem behoben bekomme:
http://stackoverflow.com/questions/43470515/xml-injection-on-parser


evtl. wäre ja einer so lieb kurz die zwei Links die ich mitgeschickt habe anzuschauen und dann meine Lösung was mache ich denn falsch?

Java:
 private String conf(String xml) {
    try {

        DocumentBuilderFactory documentBuilder = DocumentBuilderFactory.newInstance();

        // This part should prevent XML entity attacks
        documentBuilder.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        documentBuilder.setFeature("http://xml.org/sax/features/external-general-entities", false);
        documentBuilder.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        documentBuilder.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        documentBuilder.setXIncludeAware(false);
        documentBuilder.setExpandEntityReferences(false);

        Document document = documentBuilder.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
        document.setXmlStandalone(true);

        StringWriter stringWriter = new StringWriter();
        TransformerFactoryImpl transformerFactoryImpl = new TransformerFactoryImpl();
        transformerFactoryImpl.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        Transformer transformer = transformerFactoryImpl.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.INDENT, "no");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.transform(new DOMSource(document), new StreamResult(stringWriter));

        String xml_without_version = stringWriter.toString().replaceAll("\n|\r", "");
        String xml_with_version = "<?xml version=\"1.0\"?>" + xml_without_version;
        return xml_with_version;
    } catch (Exception e) {
        throw new RuntimeException("Error converting to String", e);
    }
}
 

HarleyDavidson

Bekanntes Mitglied
Wie auch schon in Stack Overflow angesprochen:
Du fängst generelle Exceptions ein und wandelst sie sofort in eine RuntimeException um.
Was, wenn es sich um eine IOException handelt? Lass dir doch mal den Stack ausgeben, bevor du ihn an die Runtime-Exception weitergibst. Wie sieht der übergebene String aus?
Kannst du ein kleines lauffähiges Beispiel liefern?
 

mrBrown

Super-Moderator
Mitarbeiter
Du fängst generelle Exceptions ein und wandelst sie sofort in eine RuntimeException um.
Was, wenn es sich um eine IOException handelt? Lass dir doch mal den Stack ausgeben, bevor du ihn an die Runtime-Exception weitergibst. Wie sieht der übergebene String aus?
Das ändert nichts, außer die mit zig Exceptions verunstaltete Methodensignatur zu vermeiden. Die ursprüngliche Exception inklusive Stacktrace verschwindet ja dadurch nicht ^^

Ne IOException muss ja nicht gesondert behandelt werden...
 

HarleyDavidson

Bekanntes Mitglied
Da hast du natürlich Recht. Aber es hilft bei der Fehlersuche.
Ich habe die Methode jetzt mal getestet.
Wenn ich den Parameter "<test>TEST</test>" übergebe,
läuft die Methode komplett durch und ich bekomme als Ergebnis
"<?xml version="1.0"?><test>TEST</test>"
zurück.
Ich würde mir also mal ausgeben lassen, was als Parameter übergeben wird.
 

Ähnliche Java Themen

Neue Themen


Oben