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

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

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

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 复制代码
<? xml version="1.0"?>

<!DOCTYPE foo SYSTEM "file:/dev/tty">

<foo)bar</foo)

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

java 复制代码
示例2:

class CustomResolver implements EntityResolver {

public InputSourceresolveEntity(String publicld, String systemld)

throws SAXException, IOException {

 

// Check for known good entities

String  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 path

return new InputSource();

 }

 }

 }

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

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

java 复制代码
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 created

XMLReader 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());

 }

 }

 
相关推荐
devilnumber28 分钟前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
果丁智能1 小时前
智能锁赋能网约房民宿数字化管控:身份核验+远程授权,筑牢安全防线、降本增效
网络·数据库·人工智能·安全·智能家居
asdfg12589632 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
云安全助手2 小时前
Anthropic年度报告解读:AI重塑网络攻击形态,传统防御体系亟待升级
人工智能·安全·网络安全·ai大模型
映翰通朱工3 小时前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器
摇滚侠4 小时前
SpringMVC 入门到实战 文件上传 75-77
java·后端·spring·maven·intellij-idea
GIS数据转换器4 小时前
城市排水生命线安全运行监测平台深度解析
java·运维·人工智能·python·安全·数据挖掘·无人机
华如锦4 小时前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai
睡不醒男孩0308234 小时前
CLup 6.x 版本中针对StarRocks 存算一体集群的完整操作手册
java·服务器·网络·clup
程序员黑豆5 小时前
Java中怎么实现字符串拼接呢【AI全栈开发】
java