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

news/2024/10/25 15:25:04/

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

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

示例1:class    XXE    {private static void receiveXMLStream(InputStreaminStream,DefaultHandlerdefaultHandler)throws ParserConfigurationException, SAXException, IOException {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParsersaxParser = factory.newSAXParser();saxParser.parse(inStream, defaultHandler);public static void main(String[] args) throws ParserConfigurationException,SAXException,IOException {try {receiveXMLStream(new FilelnputStream("evil.xml"),new DefaultHandler());}catch(java.net.MalformedURLExceptionmue){System.err.println("Malformed URL Exception:"+ mue);}}

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

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

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

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

<? xml version="1.0"?><!DOCTYPE foo SYSTEM "file:/dev/tty"><foo)bar</foo)

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

示例2:class CustomResolver implements EntityResolver {public InputSourceresolveEntity(String publicld, String systemld)throws SAXException, IOException {// Check for known good entitiesString  entityPath  ="file:/Users/onlinestore/good.xml";if (systemld.equals(entityPath)){System.out.println("Resolving    entity:"+    publicld+""+    systemld);return new InputSource(entityPath);} else {// Disallow unknown entities by returning a blank pathreturn new InputSource();}}}

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

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

class  XXE{private static void receiveXMLStream(InputStreaminStream,DefaultHandlerdefaultHandler)throws ParserConfigurationException, SAXException,IOException{SAXParserFactory factory = SAXParserFactory.newInstance();SAXParsersaxParser = factory.newSAXParser();// To set the Entity Resolver,an XML reader needs to be createdXMLReader reader = saxParser.getXMLReader();reader.setEntityResolver(new CustomResolver());reader.setErrorHandler(defaultHandler);InputSource is = new InputSource(inStream);reader.parse(is);public static void main(String[] args)throws ParserConfigurationException, SAXException, IOException{receiveXMLStream(new FileInputStream("evil.xml"),new  DefaultHandler());}}


http://www.ppmy.cn/news/1200005.html

相关文章

发送Http请求的HttpClientUtil工具

发送Http请求的HttpClientUtil工具 代码如下&#xff1a; /*** author xuan* create 2023/11/6*/ public class HttpUtil {// 创建连接池管理器private static final PoolingHttpClientConnectionManager connMgr new PoolingHttpClientConnectionManager();// http客户端pr…

1.4、Python基础-闭包、装饰器、语法糖、反射

1.3、Python基础 1、闭包2、装饰器-语法糖写法3、Python中的反射 1、闭包 闭包就是外部函数中定义一个内部函数&#xff0c;内部函数引用外部函数中的变量&#xff0c;外部函数的返回值是内部函数 def Student():name "susu"age 21print(f"{name}{age}了&qu…

创新思维:腾讯产品经理如何解决一头800kg牛的过桥难题?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是小米&#xff0c;一个热爱技术、热爱分享的90后&#xff0c;今天我要和大家一起探讨一道经典的面试题——“腾讯产品经理面试题&#xff1a;一头牛重800kg&#xff0c;一座桥承重700kg&#xff0c;牛该怎么过桥&#xff1f;”…

vue3的自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令 (CustomDirectives)。 1.自定义指令的目的和简单介绍 自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 一个自定义指令由一个包含类似组件生命周期钩子的对象…

设计模式之装饰模式

一、概念 装饰模式是一种结构型设计模式&#xff0c;允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 二、构造 部件&#xff08;Component&#xff09;声明封装器和被封装对象的公用接口。 具体部件&#xff08;Concrete Component&#xff09;类是…

全光谱大面积氙光灯太阳光模拟器老化测试

氙灯光源太阳光模拟器广泛应用于光解水产氢、光化学催化、二氧化碳制甲醇、光化学合成、光降解污染物、 水污染处理、生物光照,光学检测、太阳能电池研究、荧光材料测试(透射、反射、吸收) 太阳能电池特性测试&#xff0c;光热转化&#xff0c;光电材料特性测试&#xff0c;生物…

快速跳转插件

只要是著名的编辑软件&#xff08;很多人使用的&#xff09;一般就会有相应的跳转插件&#xff0c;用于快速在页面中进行快速的跳转&#xff0c;在Github的这个链接中列出了一些著名软件的跳转插件&#xff1a;https://github.com/acejump/AceJump#comparison

vue如何实现视频全屏切换

最近项目开发中遇到一个视频窗口全屏切换功能&#xff0c;为此在这里做个记录。 具体的实现思路&#xff1a; <template><div class"content-box"><div class"container"><div id"screen" class"screen"><…