XXE介绍

形成原因

服务器能够接受并解析XML数据,但又没对XML数据进行安全控制。

漏洞核心

允许了引⼊外部实体的加载,导致程序在解析xml的时,可以加

载恶意外部⽂件,从⽽造成⽂件读取等危害。

php_xxe靶场实验

<?php
$USERNAME = 'admin'; //账号
$PASSWORD = 'admin'; //密码
$result = null;
libxml_disable_entity_loader(false);//
$xmlfile = file_get_contents('php://input'); //对⽂件进⾏相关读取
//file_put_contents(1.txt,'dddddd');⽂件写⼊
try{ //捕获程序中的异常,匹配后进⾏相关输出
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
$username = $creds->username;
$password = $creds->password;
if($username == $USERNAME && $password == $PASSWORD){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$u
sername);
}else{
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$u
sername);
}
}catch(Exception $e){//异常处理对象
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->
getMessage());
}
header('Content-Type: text/html; charset=utf-8');
echo $result;
?>

 

引起xxe函数

libxml_disable_entity_loader(false):允许xml加载外部实体

file_get_contents():把整个⽂件读⼊⼀个字符串中

file_put_contents() 函数把⼀个字符串写⼊⽂件中。

try catch 块

1.功能:程序异常捕获

2.语法:

 

LIBXML_NOENT: 替代实体。将 XML 中的实体引⽤ 替换 成对应的值

LIBXML_DTDLOAD: 加载外部⼦集。 加载 DOCTYPE 中的 DTD ⽂件

通过php://input协议获取POST请求数据,然后把数据通过file_get_contents()函数,放在

$xmlfile变量中。

simple_import_dom():

1.功能:把 DOM 节点转换为 SimpleXMLElement 对象。对xml进⾏实体化

如果失败,则该函数返回 false。

2.语法:simplexml_import_dom(data,class)

3.相关参数:

 

 

 

 

4.实例:

 

 

 

//输出:John

 

 

burp抓包,可以看到时xml数据格式。

 

 

 

重发包发现数据外带,

 

 

构造payload:

<?xml version="1.0"?>

<!DOCTYPE note [//note标签:指定公开⽂本描述,即对引⽤的公开⽂本的唯⼀描述性
名称。!DOCTYPE note 定义此⽂档是 note 类型的⽂档
<!ENTITY poc SYSTEM "file:///D:/3.txt"> //entity实体
]>

<user><username>&poc;</username><password>qwe</password></user>

读取了文件数据

&poc引用了entity实体读取了文件。

 

 

https://www.xxe.sh,可输入域名生成对应poc

XXE是否存在判断

有源码相关函数

 

 

无源码

抓包,看报⽂是否包含 xml传参,如果是xml格式的body,则发送⼀个<Ttt>数据

</Ttt>查看是否能回显, 有则直接攻击,⽆则参考⽆回显的xxe攻击。

漏洞危害

1.任意⽂件读取 。通过file协议等进⾏辅助读取源代码/配置⽂件

2.执⾏系统命令

3.服务器端请求伪造

a. 暴露内部服务。

b. 通过“端⼝扫描”枚举内部服务。

c. 通过元数据实例窃取云凭证。

4.DOS拒绝服务

5.解析器细节可能的影响

a.⽬录列表(仅适⽤于 Java SAX 解析器)

b.程代码执⾏(仅适⽤于 PHP/expects 或 ASP)

漏洞防范

  1. 过滤和验证⽤户提交的XML数据

过滤关键词<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC

  1. 禁⽤外部实体⽅法

 

  1. 禁⽌XML中包含除⾃⼰外声明的DTD

  1. 有效的措施:配置XML parser只能使⽤静态DTD,禁⽌外来引⼊;对于Java来说,直接设置相应的属性值为false即可

  1. ⼀个最⼩的平台,没有任何不必要的功能、组件、 ⽂档和样本。 删除或不安装未使⽤的功能 和框架。

  1. 及时审查和更新相关补丁包

  1. 注意: XXE的造成与libxml库的版本有关,与PHP版本⽆关。libxml <= 2.9.0 中,默认启⽤了外部实体,libxml>2.9.0中默认禁⽤了外部实体。XXE并不是直接由libxml库造成,libxml库提供了⼀些XML核⼼功能,包括禁⽤外部实体的

posted @ 2022-11-08 10:05  JJddlf  阅读(233)  评论(0)    收藏  举报