• 应用软件安全编程--06预防 XML 外部实体攻击


    XML文档可以从一个很小的逻辑块(实体)开始动态构建。实体可以是内部的、外部的或者基于参数的。外部实体运行是将外部文件中的 XML 包含进来。攻击者可以通过操作实例的 URI, 使其指向特定的在当前文件系统中保存的文件,从而造成拒绝服务或程序崩溃,比如:指定/dev/random 或者/ dev/tty作为输入的 URI, 这可能造成永久阻塞程序或者程序崩溃。

    对于预防XML外部实体攻击的情况,示例1给出了不规范用法(Java 语言)示例。示例2给出了 规范用法(Java 语言)示例。

    1. 示例1:
    2. class    XXE    {
    3. private static void receiveXMLStream(InputStreaminStream,
    4. DefaultHandlerdefaultHandler)
    5. throws ParserConfigurationException, SAXException, IOException {
    6. SAXParserFactory factory = SAXParserFactory.newInstance();
    7. SAXParsersaxParser = factory.newSAXParser();
    8. saxParser.parse(inStream, defaultHandler);
    9.  
    10.  
    11. public static void main(String[] args) throws ParserConfigurationException,
    12. SAXException,IOException {
    13. try {
    14. receiveXMLStream(new FilelnputStream("evil.xml"),new DefaultHandler());
    15. }catch(java.net.MalformedURLExceptionmue){
    16.  
    17. System.err.println("Malformed URL Exception:"+ mue);
    18.  }
    19.  }

    上面的代码尝试对 evil.xml进行解析,并且报告相关错误后退出。然而,SAX 或者 DOM  解析器

    会尝试访问在SYSTEM   属性中标识的 URL, 这意味着它将读取一个本地的/dev/try文件的内容。在

    POSIX 系统中,读取这个文件会导致程序阻塞,直到可以通过计算机控制台得到输入数据为止。攻击 者可以使用这一类的恶意XML  文件来导致系统挂起。

    如果 evil.xml文件中包含以下文本,程序会受到远程 XXE 攻击。

    1. foo SYSTEM "file:/dev/tty">

    使用 EntityResolver方案来防止 XML  外部实体注入。

    1. 示例2:
    2. class CustomResolver implements EntityResolver {
    3. public InputSourceresolveEntity(String publicld, String systemld)
    4. throws SAXException, IOException {
    5.  
    6. // Check for known good entities
    7. String  entityPath  ="file:/Users/onlinestore/good.xml";
    8. if (systemld.equals(entityPath)){
    9. System.out.println("Resolving    entity:"+    publicld+""+    systemld);
    10. return new InputSource(entityPath);
    11. } else {
    12. // Disallow unknown entities by returning a blank path
    13. return new InputSource();
    14.  }
    15.  }
    16.  }

    针对不规范的代码示例的解决方案是,定义一个 CustomResolver 类,这个类实现了org.xml.sax. EntityResolver接口。它可以让SAX 应用定制对外部实体的处理。这个定制的处理器使用的是一个 为外部实体定义的简单的白名单。当输入不是任何指定的、安全的实体源路径时,resolverEntity()方 法会返回一个空的 InputSource 对象。

    setEntityResolver()方法可以将对应的 SAX 驱动实例注册进来。当解析恶意输入时,这个由自定义解析器返InputStream 对象会抛出 java.net.MalformedURLException 异常。需要注意的是,应创建一个XMLReader对象,以便通过这个对象来设置自定义的实体解析器。

    1. class  XXE{
    2. private static void receiveXMLStream(InputStreaminStream,DefaultHandlerdefaultHandler)
    3. throws ParserConfigurationException, SAXException,IOException{
    4. SAXParserFactory factory = SAXParserFactory.newInstance();
    5. SAXParsersaxParser = factory.newSAXParser();
    6. // To set the Entity Resolver,an XML reader needs to be created
    7. XMLReader reader = saxParser.getXMLReader();
    8. reader.setEntityResolver(new CustomResolver());
    9. reader.setErrorHandler(defaultHandler);
    10. InputSource is = new InputSource(inStream);
    11. reader.parse(is);
    12.  
    13. public static void main(String[] args)throws ParserConfigurationException, SAXException, IOException{
    14. receiveXMLStream(new FileInputStream("evil.xml"),
    15. new  DefaultHandler());
    16.  }
    17.  }
    18.  

  • 相关阅读:
    【小月电子】FPGA开发板(XLOGIC_V1)系统学习教程-LESSON1点亮LED灯
    软件测试职业生涯需要编写的全套文档模板,收藏这一篇就够了 ~
    springboot 2.6.6启动原理
    解锁学习电路设计的正确姿势!
    axios拦截器的使用?
    【树状数组】楼兰图腾
    【uboot】Uboot的启动流程
    JavaScript设计模式(一)——构造器模式、原型模式、类模式
    带你从0到1开发AI图像分类应用
    DC电源模块的数字电源优势
  • 原文地址:https://blog.csdn.net/wzh305365294/article/details/134238718