web259
# 题目前给出的源代码
flag.php
$xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
array_pop($xff);
$ip = array_pop($xff);
if($ip!=='127.0.0.1'){
die('error');
}else{
$token = $_POST['token'];
if($token=='ctfshow'){
file_put_contents('flag.txt',$flag);
}
}
index.php
<?php
highlight_file(__FILE__);
$vip = unserialize($_GET['vip']);
//vip can get flag one key
$vip->getFlag();
-
通关要求大概是发送一个HTTP包,数据包XFF信息为
127.0.0.1
,但是flag.php
会将XFF的数据按照逗分割再传递到数组中,然后又使用两次array_pop
对数组末尾去除两次,再进行判断,所以我们XFF值是127.0.0.1,127.0.0.1,127.0.0.1
-
如何把数据包传递到
flag.php
中,使用PHP原生类SoapClient,是专门用于访问web服务的,SoapClient是Soap的内置类,该内置类有一个__call
方法,当__call
方法被触发后,它可以发送 HTTP 和 HTTPS 请求(调用不存在的方法会触发__call
,题目中的不存在的方法就是index.php
里面的getFlag()
,触发__call
后,发送HTTP请求去访问flag.php
) -
构造数据包
windows使用nc开启本地监听
PS D:\All\Study\security\tools\netcat-1.11> .\nc64.exe -lvp 9999
-
构造第一次
# req $client = new SoapClient(null,array('location'=>"http://127.0.0.1:9999",'uri'=>"127.0.0.1")
-