XXE全称为XML外部实体注入、
XML
XML是可扩展标识语言的简写,和HTML的形式很像,后来用于应用程序之间数据传输的常用格式
HTML旨在显示信息,XML旨在传输信息
XML实体
根据实体来源可定义为内部实体和外部实体。XML定义了两种类型的ENTITY,一种在XML文档中使用,另一种作为参数在DTD文件中使用,定义好的ENTITY在文档中通过“&实体名;”来使用
也就是说可以把实体当作xml的变量
DTD
DTD使数据格式之间按照相同的标准来传输
DTD使一种XML约束模式语言,用来解释XML文档
外部DTD文档的语法结构:
好了,知道了XML和DTD,下面写个XML的代码:
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<note>
&xxe;
</note>
看这串代码,定义了一个外部实体,在调用的时候会显示什么?我们想到了php的伪协议。对,xml可以调用伪协议,不仅能调用php,还有java等多个语言的伪协议
参数实体可以调用其他网站的外部实体
XXE
XXE也叫XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载
-
漏洞的产生
对上传的xml文件没有进行过滤,导致可上传恶意XML文件 -
漏洞的危害
1.读取任意文件
2.执行系统命令
3.内网端口扫描
最常用的就是第一个,读取任意文件,至于2,3要和其他漏洞联合使用
命令执行:
“expect://系统命令”,一般出现在ctf中
如何在网站发现XXE的漏洞
XXE的抓包如图,和直接POST username=&password=的形式不同,XXE采用xml格式传输数据,且X-Request-With:XMLRequest也有明显提示
读取文件payload:
在其他实体标签内调用定义的实体值,这个实体标签最好是能在页面回显的标签,比如username会回显,那就直接放在username里。那如果没有回显,那就盲注(OOB外带数据)
XXE代码审计
<?php
$dom = new DOMDocument();//创建XL对象
$dom->loadXML($xmlfile,options:LIBXML_NOENT │LIBXML_DTDLOAD);//将我们发送的字符串生成xml文档$creds = simplexml_import_dom($dom);//实例化xml文档
$username = $creds->username;//获取username
$password = $creds->password;//获取password
if($username == $USERNAME && $password == $PASSWORD){
$result = sprintf( format: "<result><code>%d</code><msg>%s</msg></result", args: 1, $username);}else{
$result = sprintf( format: "<result><code>%d</code><msg>%s</msg></result>" , args: 0,$susername);上
}catch(Exception.$e){
$result = sprintf( format:"<result<code>d</code><msg>%s</msg</result>" , args: 3,$e->getMlessage());}
header( string: 'Content-Type: text/html; charset=utf-8');echo $result;
?
重点就是前三句,在实例化xml文档时没有过滤