XML eXternal Entity(XXE)を有効にした後、以下に示すように悪意のあるXMLを作成し、コンピューター上の任意のファイルの内容を読み取ることができます。XXE攻撃がOWASPの上位10件の脆弱性の一部であることは驚くに値しません。ほとんどのXMLパーサーではデフォルトで外部エンティティーが有効になっているため、JavaXMLライブラリーはXXEインジェクション攻撃に対して特に脆弱です。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE bar [
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<song>
<artist>&xxe;</artist>
<title>Bohemian Rhapsody</title>
<album>A Night at the Opera</album>
</song>
以下に示すように、DefaultHandlerおよびJava SAXパーサーの単純な実装は、XMLファイルの解析を実装し、passwdファイルのコンテンツを表示します。ここではJava SAXパーサーのケースが主な例ですが、他のパーサー(DocumentBuilderやDOM4Jなど)も同様のデフォルトの動作をします。
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String localName,String qName,Attributes attributes) throws SAXException {
System.out.println(qName);
}
public void characters(char ch[], int start, int length) throws SAXException {
System.out.println(new String(ch, start, length));
}
};
xerces1またはxerces2の外部エンティティおよびdoctypeをそれぞれ許可しないようにデフォルト設定を変更すると、この種の攻撃を防ぐことができます。
...
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
factory.setFeature("https://xml.org/sax/features/external-general-entities", false);
saxParser.getXMLReader().setFeature("https://xml.org/sax/features/external-general-entities", false);
factory.setFeature("https://apache.org/xml/features/disallow-doctype-decl", true);
...
悪意のあるXXEインジェクションの防止に関する実践的な情報については、OWASP XXEチートシートをご覧ください。
これは、Javaセキュリティのベストプラクティス10のうちの1つにすぎません。見てみましょうフル10と簡単に印刷可能な1-ページャ利用可能に
から:https://dev.to//brianverm/configure-your-java-xml-parsers-to-prevent-xxe-213c